我一直认为民意调查/ epoll不会阻止。这就是Nginx等非阻塞服务器使用它们的原因。
但是在这个Stackoverflow question中,有人多次说过民意调查。
民意调查/ epoll块也是如此?
poll / epoll与异步IO有什么不同?
答案 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上试试......
./configure --with-debug
(注意:我必须添加libpcre3-dev)make
sudo make install
/usr/local/nginx/sbin/nginx
(注意:我必须先杀死apache sudo /etc/init.d/apache2 stop
)sudo gdb
file /usr/local/nginx/sbin/nginx
b ngx_epoll_module.c:531
(设置断点)ps -ef | grep nginx
并使用nginx工作进程的PID(不是主进程)attach <PID of nginx worker>
continue
恢复流程您可能需要continue
几次,但最终应该阻止。然后打开浏览器并转到http://localhost ...调试器应该在epoll_wait
返回后立即中断。