2011-08-26 34 views
4

我總是覺得poll/epoll不會阻塞。這就是爲什麼它們被諸如Nginx之類的非阻塞服務器所使用。輪詢/ epoll塊?它與異步IO有什麼不同?

但是在這個Stackoverflow question有人多次指出輪詢塊。

那麼poll/epoll塊呢?

輪詢/ epoll與async IO有什麼不同?

+0

select/poll/epoll blocks。但是,它可以用來一次等待多個*事件,而不僅僅是一個事件。 –

回答

8

是的,輪詢/ 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上...

  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的工作進程(非主)
  11. 背部在gdb的PID,attach <PID of nginx worker>
  12. continue恢復過程

您可能需要continue幾次,但它應該最終阻止。然後打開瀏覽器並轉至http://localhost ...調試器應在epoll_wait返回後立即斷開。

+1

如果epoll阻止,使用epoll的服務器(如Nginx)如何變成非阻塞的? – Continuation

+0

感謝您的更新。因此,如果Nginx阻塞,它與Apache之類的服務器有什麼不同?它也會阻塞?此外,epoll(http://linux.die.net/man/4/epoll)的手冊頁談到了非阻塞用法:「epoll接口與EPOLLET標誌(Edge Triggered)一起使用時應使用非阻塞文件描述符,以避免阻塞讀取或寫入處理多個文件描述符的任務。「我錯過了什麼? – Continuation

+2

繼續:epoll_wait()本身是一個阻塞接口。無論何時調用epoll_wait(),它都會阻塞您的線程/進程,直到任何受監視的事件發生在已註冊的描述符上。手冊頁談到了epoll對非阻塞FD的使用情況,這是epoll監控的,而不是epoll本身。換句話說,它表示如果您使用EPOLLET,您應該只在epoll上註冊非阻塞FD。無論如何,要麼epoll監視一個非阻塞或阻塞的FD,epoll接口本身仍然是基於阻塞的 – ddoman

相關問題