繁体   English   中英

了解libuv / epoll /非阻塞网络IO

[英]Understanding libuv / epoll / non-blocking network IO

我试图了解Node.js / libuv非阻塞网络IO的工作libuv 我已经发现文件 IO是使用libuv工作线程完成的(因此,在后台线程中完成)。 但是,在各个地方都说过, 网络 IO是通过使用epollkqueue等系统调用(取决于操作系统)以非阻塞方式完成的。

现在,我想知道这是否意味着即使在使用了epoll情况下,实际的IO部分( read()仍在主线程上完成并因此阻塞了? 据我了解, epoll仅通知可用事件,而实际上不进行读/写。 至少在我发现的例子(例如http://davmac.org/davpage/linux/async-io.htmlepoll始终与组合使用read系统调用,这是阻塞IO操作。

换句话说,如果libuv使用单个线程和epoll来在有数据可供读取时发出通知,则在主线程上执行随后的读取操作beeing,从而潜在地阻止了该线程上的其他操作(网络请求的思考)主线程?

始终通过epoll/poll/select将指向文件的文件描述符报告为已准备好进行读/写,但是, read/write可能会阻止等待数据被读/写。 这就是为什么文件I / O必须在单独的线程中完成的原因。

带有管道和套接字的非阻塞send/recv实际上是非阻塞的,因此可以在I / O线程中完成而不会阻塞线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM