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