Nginx的進程模型簡單理解

協程機制

協程是線程內的一個內存模型,一個線程可以有多個協程。當我們的協程(如read方法)遇到阻塞的時候,那麼系統會立馬調用另一個不阻塞的線程來執行read。這樣做的好處是,這樣就不需要關注什麼時候socket的read會返回。因爲當read完成,epoll多路複用會執行一個回調。這個回調是一個return函數,read完成會順序的執行。這樣我們的協程機制就是一個同步的,它就不需要進行加鎖。

epoll多路複用模型

Java BiO 模型
阻塞IO,當客戶端(client)向服務端(server)發起一個請求的時候,socket.write會將數據寫入到TCP/IP的緩存區裏,TCP/IP緩存區會將數據發送到server。當網絡傳輸較慢/或者client有很多的請求時,一旦緩存區存滿會導致client無法發送數據一直在進行等待。

Linux select模型
select 模型的會執行下面的操作

一個server在內部會監聽固定數量的client
當其中監聽的client有變化的時候會執行遍歷操作
遍歷操作會喚醒所有的變化的client執行read操作
read操作會讀取客戶端的數據並返回
但是select模型有很多的監聽client的時候一旦一個發生變化其他的大量client都可能會被遍歷一遍消耗很大的性能。並且select的監聽數上線理論上是1024。

epoll多路複用
epoll多路複用模型是在select模型上進行改進。server理論上可以監聽無數個client,並且每一個監聽的client都有一個回調函數,如果監聽的client有變化。那麼會執行回調函數來執行操作。

master-worker

master-worker模型圖
在這裏插入圖片描述
master-worker模型
首先管理員啓動nginx的時候系統會建立一個master,master會建立一個或者多個worker。master可以對worker進行管理。而worker會對client進行監聽。當其中的多個個client發起請求後,worker會進行一個資源搶佔。搶佔成功後會建立連接。

當nginx啓動worker的時候也會啓動epoll多路複用模型,當worker爲client搶佔資源建立連接後,worker會爲client啓動epoll多路複用。

nginx/bin -s reload 命令
這條平滑重啓命令爲什麼可以在不進行服務器重啓的前提下完成配置文件的載入呢?其實就是因爲我們的master-worker模型。我們在執行重啓的命令的時候,系統的worker會進行一個銷燬。而worker銷燬了那不就是client要斷開連接嗎?這時候master就會將worker的東西全部拿來自己使用。master來負責對client進行一個監聽管理。

線程?進程?
每一個 wokrer 中其實只有一個 線程。由於 我們的 worker 採用的是epoll多路複用的模型。每一個 worker 中都通過epoll 來告訴我可以進行read write。這樣worker 不會進行阻塞。在不阻塞的情況下調用單線程的速度是會大於多線程的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章