nginx架構分析之 事件驅動模型


事件驅動模型

事件驅動模型是實現異步非阻塞的一個手段。事件驅動模型中,一個進程(線程)就可以了。

對於web服務器來說,客戶端A的請求連接到服務端時,服務端的某個進程(Nginx worker process)會處理該請求,
此進程在沒有返回給客戶端A結果時,它又去處理了客戶端B的請求。
服務端把客戶端A以及客戶端B發來的請求作為事件交給了“事件收集器”,
而“事件收集器”再把收集到的事件交由“事件發送器”發送給“事件處理器”進行處理。
最后“事件處理器”處理完該事件后,通知服務端進程,服務端進程再把結果返回給客戶端A、客戶端B。

在這個過程中,服務端進程做的事情屬於用戶級別的,而事件處理這部分工作屬於內核級別的。
也就是說這個事件驅動模型是需要操作系統內核來作為支撐的。

Nginx的事件驅動模型

Nginx的事件驅動模型,支持select、poll、epoll、rtsig、kqueue、/dev/poll、eventport等。
最常用的是前三種,其中kqueue模型用於支持BSD系列平台的事件驅動模型。kqueue是poll模型的一個變種,本質上和epoll一樣。
/dev/poll是Unix平台的事件驅動模型,其主要在Solaris7及以上版本、HP/UX11.22及以上版本、IRIX6.5.15及以上版本、
Tru64 Unix 5.1A及以上版本的平台使用。
eventport是用於支持Solaris10及以上版本的事件驅動模型。
select模型
Linux和Windows都支持,使用select模型的步驟是:

1. 創建所關注事件的描述符集合,對於一個描述符,可以關注其上面的讀(Read)事件、寫(Write)事件以及異常發生(Exception)事件。
在select模型中,要創建這3類事件描述符集合。
2. 調用底層提供的select()函數,等待事件發生。
3. 輪詢所有事件描述符集合中的每一個事件描述符,檢查是否有相應的事件發生,如果有就進行處理。
poll模型
poll模型是Linux平台上的事件驅動模型,在Linux2.1.23中引入的,Windows平台不支持該模型。

poll模型和select模型工作方式基本相同,區別在於,select模型創建了3個描述符集合,而poll模型只創建一個描述符集合。
epoll模型
epoll模型屬於poll模型的變種,在Linux2.5.44中引入。epoll比poll更加高效,原因在於它不需要輪詢整個描述符集合,
而是Linux內核會關注事件集合,當有變動時,內核會發來通知。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM