swoole之進程結構

一、進程的基本知識

什麼是進程,所謂進程其實就是操作系統中一個正在運行的程序,我們在一個終端當中,通過php,運行一個php文件,這個時候就相當於我們創建了一個進程,這個進程會在系統中駐存,申請屬於它自己的內存空間系統資源並且運行相應的程序。

對於一個進程來說,它的核心內容分爲兩個部分,一個是它的內存,這個內存是這進程創建之初從系統分配的,它所有創建的變量都會存儲在這一片內存環境當中

一個是它的上下文環境我們知道進程是運行在操作系統的,那麼對於程序來說,它的運行依賴操作系統分配給它的資源,操作系統的一些狀態。

在操作系統中可以運行多個進程的,對於一個進程來說,它可以創建自己的子進程,那麼當我們在一個進程中創建出若干個子進程的時候那麼可以看到如圖,子進程和父進程一樣,擁有自己的內存空間和上下文環境

attachments-2021-02-0VZi8TI7601ca9ed847e3.jpg

二、Swoole進程結構

Swoole的高效不僅僅於底層使用c編寫,他的進程結構模型也使其可以高效的處理業務,我們想要深入學習,並且在實際的場景當中使用必須瞭解,下面我們先看一下結構圖

attachments-2021-02-VhPG3Ab6601ca9faa3ba3.png

首先先介紹下swoole的這幾種進程分別是幹什麼的

從這些層級的名字,我們先大概說一下,下面這些層級分別是幹什麼的,做一個詳細的說明。

1、Master進程:主進程

2、Manger進程:管理進程

3、Worker進程:工作進程

4、Task進程:異步任務工作進程

1、Master進程

第一層,Master進程,這個是swoole的主進程,這個進程是用於處理swoole的核心事件驅動的,那麼在這個進程當中可以看到它擁有一個MainReactor[線程]以及若干個Reactor[線程],swoole所有對於事件的監聽都會在這些線程中實現,比如來自客戶端的連接,信號處理等。

attachments-2021-02-1xGw6Hsg601caa01563bd.jpg

每一個線程都有自己的用途,下面多每個線程有一個瞭解

1.1、MainReactor(主線程)

主線程會負責監聽server socket,如果有新的連接accept,主線程會評估每個Reactor線程的連接數量。將此連接分配給連接數最少的reactor線程,做一個負載均衡。

1.2 、Reactor線程組

Reactor線程負責維護客戶端機器的TCP連接、處理網絡IO、收發數據完全是異步非阻塞的模式。

swoole的主線程在Accept新的連接後,會將這個連接分配給一個固定的Reactor線程,在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫時將數據發送給TCP客戶端。

1.3、心跳包檢測線程(HeartbeatCheck)

Swoole配置了心跳檢測之後,心跳包線程會在固定時間內對所有之前在線的連接

發送檢測數據包

1.4、UDP收包線程(UdpRecv)

接收並且處理客戶端udp數據包

2、管理進程Manager

Swoole想要實現最好的性能必須創建出多個工作進程幫助處理任務,但Worker進程就必須fork操作,但是fork操作是不安全的,如果沒有管理會出現很多的殭屍進程,進而影響服務器性能,同時worker進程被誤殺或者由於程序的原因會異常退出,爲了保證服務的穩定性,需要重新創建worker進程。

Swoole在運行中會創建一個單獨的管理進程,所有的worker進程和task進程都是從管理進程Fork出來的。管理進程會監視所有子進程的退出事件,當worker進程發生致命錯誤或者運行生命週期結束時,管理進程會回收此進程,並創建新的進程。換句話也就是說,對於worker、task進程的創建、回收等操作全權有“保姆”Manager進程進行管理。

再來一張圖梳理下Manager進程和Worker/Task進程的關係。

attachments-2021-02-gUnJS4Ra601caa0964c23.jpg

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之後,在命令行查看當前產生的進程

attachments-2021-02-dYcQJjGp601caa101370a.jpg

這三個進程中,所有進程的根進程,也就是例子中的2123進程,就是所謂的Master進程;而2212進程,則是Manager進程;最後的2321進程,是Worker進程。

2.2、client跟server的交互:

1、client請求到達 Main Reactor,Client實際上是與Master進程中的某個Reactor線程發生了連接。

2、Main Reactor根據Reactor的情況,將請求註冊給對應的Reactor (每個Reactor都有epoll。用來監聽客戶端的變化)

3、客戶端有變化時Reactor將數據交給worker來處理

4、worker處理完畢,通過進程間通信(比如管道、共享內存、消息隊列)發給對應的reactor。

5、reactor將響應結果發給相應的連接請求處理完成

如下圖所示:

attachments-2021-02-RpWCEedc601caa163f971.jpg

 

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