nginx是同步的网络IO还是异步的网络IO

如题,我所知道的是nginx是多进程的。主进程(父进程)通过epoll向内核注册IO事件,当IO事件发生的时候内核会发送信号给父进程,这是父进程通知一个子进程去内核的缓冲区拿数据进行处理。也就是说nginx使用的是“IO多路复用”,IO多路复用意味着用户进程需要自己使用一个线程将数据从内核缓冲区复制到用户缓冲区,是同步的。

我不知道我上面理解的对不对,但是我看网上的很多资料是说nginx使用的是异步IO模型,我所理解的异步IO是:当数据到达内核缓冲区后,内核负责吧数据从内和缓冲区复制到用户缓冲区。

所以nginx的网络模型到底是什么样的?还请大神指点啊!## 标题文字 ##

阅读 5.1k
4 个回答

我理解nginx的网络IO在单个具体处理进程中是同步的。因为它在处理时是网络阻塞的。

POSIX 定义:An asynchronous I/O operation does not cause the requesting process to be blocked;
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes;

epoll 在内核返回就绪事件时需要用户线程自己进行读写,这个过程是阻塞的,所以是同步的而非异步。

nginx在linux一般是用epoll, 它使用的是注册回调函数,数据准备好自动调用。这个过程其实阻塞的。master分配某个连接给worker进程,worker同一时间的阻塞的,只能处理一个请求。。还有nginx是多进程模型的

nginx底层使用的是 IO多路复用机制, 本质上是 同步非阻塞, 并不是真正意义上 UNIX IO模型中的AIO, 所以其实对于用户态来说, 其实是同步的

有些资料(如《nginx高性能服务器详解》)说nginx是采用 多进程+异步非阻塞
对于 “非阻塞”,说的应该是 在使用IO多路复用时, 一般会设置socket为非阻塞状态
至于 “异步” 应该是 编程模型 意义上的异步 (实质上是同步)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题