Асинхронный ввод/вывод в Linux

Davin McCall, “Asynchronous I/O on linux”, public translation into Russian from English More about this translation.

See also 161 similar translations

Translate into another language.

Participants

SSPkrolik3995 points
Andruxa557 points
andrey_bark86 points
And others...
Join Translated.by to translate! If you already have a Translated.by account, please sign in.
If you do not want to register an account, you can sign in with OpenID.
Pages: ← previous Ctrl next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Asynchronous I/O on linux

Асинхронный ввод/вывод в Linux

History of edits (Latest: andrey_bark 2 years ago) §

Introduction

Введение

History of edits (Latest: andrey_bark 2 years ago) §

"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.

Под "Асинхронным вводом/выводом" в основном понимается возможность процесса выполнять ввод/вывод одновременно из многих источников. В частности асинхронным называют такой ввод/вывод, который производиться в том момент, когда входные данные доступны или выходные буферы свободны для принятия очередной порции данных. Это отличает асинхронных ввод/вывод от блокирующего, при котором операции чтения/записи пытаются выполняться, невзирая на доступность ресурсов, что типично приводит к блокировкам. Асинхронный ввод/вывод сам по себе несложен, обычно вопрос в том, чтобы одновременно контролировать много каналов, через которые должен выполняться ввод/вывод.

History of edits (Latest: olegsh 1 year, 11 months ago) §

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).

Рассмотрим случай веб-сервера с несколькими клиентами. Имеется один канал сетевой связи (сокет) и, надо полагать, один файл канала для каждого клиента (к этим файлам должен иметься доступ, и данные должны передаваться клиенту по сети). Одна из проблем состоит в том, как определить, какой клиентский сокет использовать для передачи информации дальше - поскольку, если мы вышли на канал, буфер вывода которого занят, то нами будет бессмысленно блокироваться процесс и задерживаться отправка информации другим клиентам без необходимости. Еще одна проблема заключается в том, как избежать потери тактов процессора во время простой проверки возможности выполнения операции Вв/В - например при желании продлить процессорное время веб-сервера. Если все буферы вывода заняты, было бы хорошо, если бы приложение могло ожидать до тех пор, пока один из буферов снова не освободился (в этом случае автоматически продолжило бы выполнение).

History of edits (Latest: Andruxa 1 year, 9 months ago) §

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).

В целом в асинхронном Вв/В сосредотачивается внимание на двух функциях: на возможности определить, что ввод или вывод можно произвести быстро, без блокировки и на завершении операции Вв/в с ожиданием. Оба случая являются примером асинхронных событий, то есть, они могут произойти в любой момент во время выполнения программы, а значит, процессу на самом деле нет необходимости ждать, пока это случится (хотя он и может это сделать). Различие между двумя функциями в значительной степени состоит в режимах работы (например это разница заключается в выполнении операций чтения или в уведомлении, когда данные находятся в буфере программы, по сравнению с обычным уведомление о наличии данных для которых впоследствии посылается запрос на копирование в буфер программы). Обратите внимание, что первый случай уведомлений вероятно предпочтительнее, так как это потенциально позволяет избежать операции избыточного копирования (ядро уже знает, где находятся данные, а потому отсутствует необходимость в первую очередь считывать их в свой буфер).

History of edits (Latest: Andruxa 1 year, 9 months ago) §
Pages: ← previous Ctrl next
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16