民意调查/ epoll会阻止吗?它与异步IO有什么不同?

Con*_*ion 4 asynchronous network-programming epoll nonblocking

我一直认为民意调查/ epoll不会阻止.这就是Nginx等非阻塞服务器使用它们的原因.

但是在这个Stackoverflow问题中,有几次表明轮询阻塞了.

民意调查/ epoll块也是如此?

poll/epoll与异步IO的区别如何?

dgn*_*ton 9

是的,民意调查/ epoll阻止.将线程分离到服务客户端的服务器通常不能像使用epoll这样的I/O事件通知模型的服务器一样扩展.民意调查比epoll(O(n)vs O(1))更老,效率更低.

[UPDATE]

Nginx不是非阻塞的.当请求进入时,epoll_wait正在等待的事件之一被通知,并且对epoll_wait的调用返回.然后Nginx循环通过为每个事件服务的信号事件.Nginx源代码可在此处获取... http://nginx.org/download/nginx-1.1.1.tar.gz

看一下ngx_epoll_process_eventsnginx-1.1.1\src\event\modules \ngx_epoll_module.c中的函数.

[UPDATE2]

另请参见epoll_wait(2)的手册页... http://linux.die.net/man/2/epoll_wait

#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
Run Code Online (Sandbox Code Playgroud)

指定超时为-1会使epoll_wait(2)无限期地等待,而指定超时等于零会使epoll_wait(2)立即返回,即使没有可用的事件(返回代码等于零).

[UPDATE3]

为了向自己证明Nginx/epoll阻塞,请在Linux上试试这个...

  1. 下载源代码并取消归档
  2. cd到源目录
  3. ./configure --with-debug (注意:我必须添加libpcre3-dev)
  4. make
  5. sudo make install
  6. 启动nginx :( /usr/local/nginx/sbin/nginx 注意:我必须先杀死apache sudo /etc/init.d/apache2 stop)
  7. sudo gdb
  8. file /usr/local/nginx/sbin/nginx
  9. b ngx_epoll_module.c:531 (设置一个断点)
  10. 在另一个终端窗口中,ps -ef | grep nginx使用nginx工作进程的PID(不是主服务器)
  11. 回到gdb, attach <PID of nginx worker>
  12. continue 恢复这个过程

你可能需要continue几次,但最终应该阻止.然后打开浏览器并转到http:// localhost ...然后调试器应该在epoll_wait返回后立即中断.

  • 延续:epoll_wait()本身就是一个阻塞接口.无论何时调用epoll_wait(),它都会阻塞您的线程/进程,直到在已注册的描述符上发生任何受监视的事件.该手册页讨论了epoll对非阻塞FD的使用,这是epoll监视的内容,而不是epoll本身.换句话说,它表示如果使用EPOLLET,则应该只在epoll上注册非阻塞FD.无论如何,要么你要求epoll监控非阻塞或阻塞FD,epoll接口本身仍然是基于阻塞的 (2认同)
  • 您可以通过将超时值设置为 0,将 epoll_wait() 像非阻塞接口一样使用。 (2认同)