swoole進程結構

clipboard.png

1、進程的基本知識

什麼是進程,所謂進程其實就是操做系統中一個正在運行的程序,咱們在一個終端當中,經過php,運行一個php文件,這個時候就至關於咱們建立了一個進程,這個進程會在系統中駐存,申請屬於它本身的內存空間系統資源而且運行相應的程序php

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

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

在操做系統中能夠運行多個進程的,對於一個進程來講,它能夠建立本身的子進程,那麼當咱們在一個進程中建立出若干個子進程的時候那麼能夠看到如圖,子進程和父進程同樣,擁有本身的內存空間和上下文環境安全

clipboard.png

2、Swoole進程結構

Swoole的高效不只僅於底層使用c編寫,他的進程結構模型也使其能夠高效的處理業務,咱們想要深刻學習,而且在實際的場景當中使用必須瞭解,下面咱們先看一下結構圖:服務器

clipboard.png

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

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

  1. Master進程:主進程
  2. Manger進程:管理進程
  3. Worker進程:工做進程
  4. Task進程:異步任務工做進程

一、Master進程

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

clipboard.png

每個線程都有本身的用途,下面多每一個線程有一個瞭解負載均衡

MainReactor(主線程)

主線程會負責監聽server socket,若是有新的鏈接accept,主線程會評估每一個Reactor線程的鏈接數量。將此鏈接分配給鏈接數最少的reactor線程,作一個負載均衡。異步

Reactor線程組

Reactor線程負責維護客戶端機器的TCP鏈接、處理網絡IO、收發數據徹底是異步非阻塞的模式。
swoole的主線程在Accept新的鏈接後,會將這個鏈接分配給一個固定的Reactor線程,在socket可讀時讀取數據,並進行協議解析,將請求投遞到Worker進程。在socket可寫時將數據發送給TCP客戶端。

心跳包檢測線程(HeartbeatCheck)

Swoole配置了心跳檢測以後,心跳包線程會在固定時間內對全部以前在線的鏈接
發送檢測數據包

UDP收包線程(UdpRecv)

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

二、管理進程Manager

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

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

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

clipboard.png

三、Worker進程

worker 進程屬於swoole的主邏輯進程,用戶處理客戶端的一系列請求,接受由Reactor線程投遞的請求數據包,並執行PHP回調函數處理數據生成響應數據併發給Reactor線程,由Reactor線程發送給TCP客戶端能夠是異步非阻塞模式,也能夠是同步阻塞模式

四、Task進程

taskWorker進程這一進城是swoole提供的異步工做進程,這些進程主要用於處理一些耗時較長的同步任務,在worker進程當中投遞過來。

3、進程查看及流程梳理

當啓動一個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以後,在命令行查看當前產生的進程

clipboard.png

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

client跟server的交互

一、client請求到達 Main Reactor,Client其實是與Master進程中的某個Reactor線程發生了鏈接。

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

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

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

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

示意圖:

clipboard.png

後續準備

本文是在本身學習Swoole接觸到的一些知識,在初步整理後發送出來,但願能與你們一塊兒學習,文章不足等問題你們能夠一塊兒討論學習,歡迎騷擾~~。
後面準備從網絡模型入手更好的理解swoole的實現原理,比較與傳統PHP-FPM工做模式的問題,以前出過一篇關於(一)如何實現一個單進程阻塞的網絡服務器你們能夠先了解下,如何一步步演變爲多進程master-worker模型。

歡迎你們指正文章問題~

相關文章
相關標籤/搜索