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

时间:2011-08-26 18:30:03

标签: asynchronous network-programming nonblocking epoll

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

但是在这个Stackoverflow question中,有人多次说过民意调查。

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

poll / epoll与异步IO有什么不同?

1 个答案:

答案 0 :(得分:8)

是的,民意调查/ 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

查看nginx-1.1.1 \ src \ event \ modules \ ngx_epoll_module.c中的ngx_epoll_process_events函数。

[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);
  

指定超时为-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恢复流程
  13. 您可能需要continue几次,但最终应该阻止。然后打开浏览器并转到http://localhost ...调试器应该在epoll_wait返回后立即中断。