Асинхронный ввод/вывод в Linux | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translated in draft, editing and proof-reading required.
If you do not want to register an account, you can sign in with OpenID.
Asynchronous I/O on linux | ||
Introduction | ||
"Asynchronous I/O" essentially refers to the ability of a process to perform input/output on multiple sources at one time. More specifically it's about doing I/O when data is actually available (in the case of input) or when output buffers are no longer full, rather than just performing a read/write operation and blocking as a result. This in itself is not so difficult, but typically there are several channels through which I/O must be performed and the key is to monitor these multiple channels simultaneously. | Под "Асинхронным вводом/выводом" в основном понимается возможность процесса выполнять ввод/вывод одновременно из многих источников. В частности асинхронным называют такой ввод/вывод, который производиться в том момент, когда входные данные доступны или выходные буферы свободны для принятия очередной порции данных. Это отличает асинхронных ввод/вывод от блокирующего, при котором операции чтения/записи пытаются выполняться, невзирая на доступность ресурсов, что типично приводит к блокировкам. Асинхронный ввод/вывод сам по себе несложен, обычно вопрос в том, чтобы одновременно контролировать много каналов, через которые должен выполняться ввод/вывод. | |
Consider the case of a web server with multiple clients connected. There is one network (socket) channel and probably also one file channel for each client (the files must be read, and the data must be passed to the client over the network). One problem is, how to determine which client socket to send information to next - since, if we send on a channel whose output buffer is full, we will pointlessly block the process and delay sending of information to other clients needlessly. Another problem is to avoid wasting processor cycles in simply checking whether it is possible to perform I/O - to extend the web server example, if all the output buffers are full, it would be nice if the application could sleep until such time as one of the buffers had some free space again (and be automatically woken at that time). | Рассмотрим случай веб-сервера с несколькими клиентами. Имеется один канал сетевой связи (сокет) и, надо полагать, один файл канала для каждого клиента (к этим файлам должен иметься доступ, и данные должны передаваться клиенту по сети). Одна из проблем состоит в том, как определить, какой клиентский сокет использовать для передачи информации дальше - поскольку, если мы вышли на канал, буфер вывода которого занят, то нами будет бессмысленно блокироваться процесс и задерживаться отправка информации другим клиентам без необходимости. Еще одна проблема заключается в том, как избежать потери тактов процессора во время простой проверки возможности выполнения операции Вв/В - например при желании продлить процессорное время веб-сервера. Если все буферы вывода заняты, было бы хорошо, если бы приложение могло ожидать до тех пор, пока один из буферов снова не освободился (в этом случае автоматически продолжило бы выполнение). | |
In general Asynchronous I/O revolves around two functions: The ability to determine that input or output is immediately possible without blocking or that a pending I/O operation has completed. Both cases are examples of asynchronous events, that is, they can happen at any time during program execution, and the process need not actually be waiting for it to happen (though it can do so). The distinction between the two is largely a matter of operating mode (it is the difference between performing a read operation, for example, and being notified when the data is in the application's buffer, compared to simply being notified when the data is available and asking that it be copied to the application's buffer afterwards). Note however that the first case is arguably preferable since it potentially avoids a redundant copy operation (the kernel already knows where the data knows to be, and doesn't necessarily need to read it into its own buffer first). | В целом в асинхронном Вв/В сосредотачивается внимание на двух функциях: на возможности определить, что ввод или вывод можно произвести быстро, без блокировки и на завершении операции Вв/в с ожиданием. Оба случая являются примером асинхронных событий, то есть, они могут произойти в любой момент во время выполнения программы, а значит, процессу на самом деле нет необходимости ждать, пока это случится (хотя он и может это сделать). Различие между двумя функциями в значительной степени состоит в режимах работы (например это разница заключается в выполнении операций чтения или в уведомлении, когда данные находятся в буфере программы, по сравнению с обычным уведомление о наличии данных для которых впоследствии посылается запрос на копирование в буфер программы). Обратите внимание, что первый случай уведомлений вероятно предпочтительнее, так как это потенциально позволяет избежать операции избыточного копирования (ядро уже знает, где находятся данные, а потому отсутствует необходимость в первую очередь считывать их в свой буфер). |
