我一直以为poll/epoll不会阻塞。这就是为什么非阻塞服务器如Nginx使用它们的原因。
但在这个Stackoverflow问题中,有好几次提到poll会阻塞。
那么poll/epoll是否会阻塞?
poll/epoll和异步IO有何不同?
我一直以为poll/epoll不会阻塞。这就是为什么非阻塞服务器如Nginx使用它们的原因。
但在这个Stackoverflow问题中,有好几次提到poll会阻塞。
那么poll/epoll是否会阻塞?
poll/epoll和异步IO有何不同?
是的,poll/epoll会阻塞。将线程用于为客户端提供服务的服务器通常无法像使用I/O事件通知模型(如epoll)的服务器那样具有良好的可扩展性。poll比epoll旧且效率低(O(n) vs O(1))。
[更新]
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
函数
[更新2]
另请参阅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);
./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
返回后立即中断。