swoole程序結構
一、程序的基本知識
什麼是程序,所謂程序其實就是作業系統中一個正在執行的程式,我們在一個終端當中,通過php,執行一個php檔案,這個時候就相當於我們建立了一個程序,這個程序會在系統中駐存,申請屬於它自己的記憶體空間系統資源並且執行相應的程式
對於一個程序來說,它的核心內容分為兩個部分,一個是它的記憶體,這個記憶體是這程序建立之初從系統分配的,它所有建立的變數都會儲存在這一片記憶體環境當中
一個是它的上下文環境我們知道程序是執行在作業系統的,那麼對於程式來說,它的執行依賴作業系統分配給它的資源,作業系統的一些狀態。
在作業系統中可以執行多個程序的,對於一個程序來說,它可以建立自己的子程序,那麼當我們在一個程序中創建出若干個子程序的時候那麼可以看到如圖,子程序和父程序一樣,擁有自己的記憶體空間和上下文環境
二、Swoole程序結構
Swoole的高效不僅僅於底層使用c編寫,他的程序結構模型也使其可以高效的處理業務,我們想要深入學習,並且在實際的場景當中使用必須瞭解,下面我們先看一下結構圖:
首先先介紹下swoole的這幾種程序分別是幹什麼的:
從這些層級的名字,我們先大概說一下,下面這些層級分別是幹什麼的,做一個詳細的說明。
- Master程序:主程序
- Manger程序:管理程序
- Worker程序:工作程序
- Task程序:非同步任務工作程序
1、Master程序
第一層,Master程序,這個是swoole的主程序,這個程序是用於處理swoole的核心事件驅動的,那麼在這個程序當中可以看到它擁有一個MainReactor[執行緒]以及若干個Reactor[執行緒],swoole所有對於事件的監聽都會在這些執行緒中實現,比如來自客戶端的連線,訊號處理等。
每一個執行緒都有自己的用途,下面多每個執行緒有一個瞭解
MainReactor(主執行緒)
主執行緒會負責監聽server socket,如果有新的連線accept,主執行緒會評估每個Reactor執行緒的連線數量。將此連線分配給連線數最少的reactor執行緒,做一個負載均衡。
Reactor執行緒組
Reactor執行緒負責維護客戶端機器的TCP連線、處理網路IO、收發資料完全是非同步非阻塞的模式。
swoole的主執行緒在Accept新的連線後,會將這個連線分配給一個固定的Reactor執行緒,在socket可讀時讀取資料,並進行協議解析,將請求投遞到Worker程序。在socket可寫時將資料傳送給TCP客戶端。
心跳包檢測執行緒(HeartbeatCheck)
Swoole配置了心跳檢測之後,心跳包執行緒會在固定時間內對所有之前線上的連線
傳送檢測資料包
UDP收包執行緒(UdpRecv)
接收並且處理客戶端udp資料包
2、管理程序Manager
Swoole想要實現最好的效能必須創建出多個工作程序幫助處理任務,但Worker程序就必須fork操作,但是fork操作是不安全的,如果沒有管理會出現很多的殭屍程序,進而影響伺服器效能,同時worker程序被誤殺或者由於程式的原因會異常退出,為了保證服務的穩定性,需要重新建立worker程序。
Swoole在執行中會建立一個單獨的管理程序,所有的worker程序和task程序都是從管理程序Fork出來的。管理程序會監視所有子程序的退出事件,當worker程序發生致命錯誤或者執行生命週期結束時,管理程序會回收此程序,並建立新的程序。換句話也就是說,對於worker、task程序的建立、回收等操作全權有“保姆”Manager程序進行管理。
再來一張圖梳理下Manager程序和Worker/Task程序的關係。
3、Worker程序
worker 程序屬於swoole的主邏輯程序,使用者處理客戶端的一系列請求,接受由Reactor執行緒投遞的請求資料包,並執行PHP回撥函式處理資料生成響應資料併發給Reactor執行緒,由Reactor執行緒傳送給TCP客戶端可以是非同步非阻塞模式,也可以是同步阻塞模式
4、Task程序
taskWorker程序這一進城是swoole提供的非同步工作程序,這些程序主要用於處理一些耗時較長的同步任務,在worker程序當中投遞過來。
三、程序檢視及流程梳理
當啟動一個Swoole應用時,一共會建立2 + n + m個程序,2為一個Master程序和一個Manager程序,其中n為Worker程序數。m為TaskWorker程序數。
預設如果不設定,swoole底層會根據當前機器有多少CPU核數,啟動對應數量的Reactor執行緒和Worker程序。我機器為1核的。Worker為1。
所以現在預設我啟動了1個Master程序,1個Manager程序,和1個worker程序,TaskWorker沒有設定也就是為0,當前server會產生3個程序。
在啟動了server之後,在命令列檢視當前產生的程序
這三個程序中,所有程序的根程序,也就是例子中的2123程序,就是所謂的Master程序;而2212程序,則是Manager程序;最後的2321程序,是Worker程序。
client跟server的互動
1、client請求到達 Main Reactor,Client實際上是與Master程序中的某個Reactor執行緒發生了連線。
2、Main Reactor根據Reactor的情況,將請求註冊給對應的Reactor (每個Reactor都有epoll。用來監聽客戶端的變化)
3、客戶端有變化時Reactor將資料交給worker來處理
4、worker處理完畢,通過程序間通訊(比如管道、共享記憶體、訊息佇列)發給對應的reactor。
5、reactor將響應結果發給相應的連線請求處理完成
示意圖:
後續準備
本文是在自己學習Swoole接觸到的一些知識,在初步整理後傳送出來,希望能與大家一起學習,文章不足等問題大家可以一起討論學習,歡迎騷擾~~。
後面準備從網路模型入手更好的理解swoole的實現原理,比較與傳統PHP-FPM工作模式的問題,之前出過一篇關於 (一)如何實現一個單程序阻塞的網路伺服器 大家可以先了解下,如何一步步演變為多程序master-worker模型。
歡迎大家指正文章問題~