Понимание libuv / epoll / неблокирующих сетевых операций ввода-вывода - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь понять, как работает неблокирующий сетевой ввод-вывод в Node.js / libuv.Я уже обнаружил, что файл IO выполняется с использованием libuv рабочих потоков (таким образом, в фоновом потоке).Однако в разных местах говорится, что сеть IO выполняется неблокирующим образом с использованием системных вызовов, таких как epoll, kqueue и т. Д. (В зависимости от операционной системы).

Теперь мне интересно, означает ли это, что фактическая часть ввода-вывода (read()) все еще выполнена на основной цепочке, и, таким образом, блокируется, даже если используется, например, epoll?Что касается моего понимания, epoll только уведомляет о доступных событиях, но фактически не выполняет чтение / запись.По крайней мере, в найденных мной примерах (например, http://davmac.org/davpage/linux/async-io.html) epoll всегда используется в сочетании с системным вызовом read, который является блокирующей операцией ввода-вывода.

Другими словами, если libuv использует один поток и epoll, чтобы получить уведомление, когда данные доступны для чтения, выполняется ли следующая операция чтения на главной нити и, таким образом, потенциально блокирует другие операции (с точки зрения сетевых запросов) на основной нити?

1 Ответ

0 голосов
/ 29 мая 2018

Файловые дескрипторы, относящиеся к файлам, всегда сообщаются как готовые для чтения / записи с помощью epoll/poll/select, однако read/write может блокировать ожидание данных для чтения / записи.Вот почему файловый ввод-вывод должен выполняться в отдельном потоке.

В то время как неблокирующая send/recv с трубами и сокетами действительно неблокируемая и, следовательно, может выполняться в потоке ввода-вывода без рискаблокировки потока.

...