我總是覺得poll/epoll不會阻塞。這就是爲什麼它們被諸如Nginx之類的非阻塞服務器所使用。輪詢/ epoll塊?它與異步IO有什麼不同?
但是在這個Stackoverflow question有人多次指出輪詢塊。
那麼poll/epoll塊呢?
輪詢/ epoll與async IO有什麼不同?
我總是覺得poll/epoll不會阻塞。這就是爲什麼它們被諸如Nginx之類的非阻塞服務器所使用。輪詢/ epoll塊?它與異步IO有什麼不同?
但是在這個Stackoverflow question有人多次指出輪詢塊。
那麼poll/epoll塊呢?
輪詢/ epoll與async IO有什麼不同?
是的,輪詢/ epoll塊。分離線程以服務客戶端的服務器通常不會像使用I/O事件通知模型(如epoll)的服務器那樣進行擴展。民意調查比epoll(O(n)和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 \事件\模塊\ ngx_epoll_module.c
[UPDATE2]
看到看看ngx_epoll_process_events
功能還有手冊頁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的工作進程(非主)attach <PID of nginx worker>
continue
恢復過程您可能需要continue
幾次,但它應該最終阻止。然後打開瀏覽器並轉至http://localhost ...調試器應在epoll_wait
返回後立即斷開。
如果epoll阻止,使用epoll的服務器(如Nginx)如何變成非阻塞的? – Continuation
感謝您的更新。因此,如果Nginx阻塞,它與Apache之類的服務器有什麼不同?它也會阻塞?此外,epoll(http://linux.die.net/man/4/epoll)的手冊頁談到了非阻塞用法:「epoll接口與EPOLLET標誌(Edge Triggered)一起使用時應使用非阻塞文件描述符,以避免阻塞讀取或寫入處理多個文件描述符的任務。「我錯過了什麼? – Continuation
繼續:epoll_wait()本身是一個阻塞接口。無論何時調用epoll_wait(),它都會阻塞您的線程/進程,直到任何受監視的事件發生在已註冊的描述符上。手冊頁談到了epoll對非阻塞FD的使用情況,這是epoll監控的,而不是epoll本身。換句話說,它表示如果您使用EPOLLET,您應該只在epoll上註冊非阻塞FD。無論如何,要麼epoll監視一個非阻塞或阻塞的FD,epoll接口本身仍然是基於阻塞的 – ddoman
select/poll/epoll blocks。但是,它可以用來一次等待多個*事件,而不僅僅是一個事件。 –