進程基本概念
狹義定義:進程是正在運行的程序的實例(an instance of a computer program that is being executed)。
對于一個進程來說,它最核心的內容可以分為兩個部分。第一個是它的內存,另一個部分是它的上下文環(huán)境。
在操作系統當中,是可以運行多個進程的。對于一個進程來說,它可以調用系統函數來創(chuàng)建子進程。如下圖所示:
需要注意的是:
- 子進程會復制父進程的內存空間和上下文環(huán)境
- 修改某個子進程的內存空間,不會修改父進程或其他子進程的內存空間
Swoole本身也是一個多進程的模型,它有多個worker進程和自己的master進程,多個worker進程之間創(chuàng)建的變量是不會通用的。
進程間通訊
進程間通訊的方式有很多種,其中一種是共享內存。共享內存是操作系統當中一種比較特殊的內存,它并不屬于任何進程,也不需要依賴于進程而存在。可以調用系統函數來創(chuàng)建一片共享內存,并指定它的索引,通過索引,任何一個進程都可以在這片內存空間申請內存空間并在儲存一定值。
要點:
- 共享內存不屬于任何一個進程
- 在共享內存中分配的內存空間可以被任何進程訪問
- 即使進程關閉,共享內存仍然可以繼續(xù)保留
提示:可以使用命令ipcs -m來查看共享內存
Swoole 結構
在過去用PHP寫web應用,是需要依賴于nginx這樣的web服務器和php-fpm解析的。php-fpm同樣也是一個多進程的php解析器,當一個請求過來的時候,php-fpm會創(chuàng)建一個新的進程來處理這個請求,這樣很大程度上系統開銷是用于創(chuàng)建和銷毀進程,導致整個程序的響應效率并不是非常的高。swoole和php-fpm采用了完全不同的架構,如下圖所示:
整個swoole擴展可分為三層。第一層master進程,這個進程是swoole的主進程。這個進程是用于處理swoole核心的時間驅動的。在這個進程當中擁有若干個reactor線程,在每一個子線程當中都運行了epoll函數的實例,swoole所有的對于事件的監(jiān)聽都會在這些線程當中實現。
第二層是manager進程,這是一個管理進程,用于創(chuàng)建管理下一次的woker進程和task worker進程。
第三層是工作進程,分為兩個類型,一類是worker進程,這是主邏輯進程,用于處理來自客戶端的請求。另一類是task worker進程,是異步工作進程,主要用于處理一些耗時較長的同步任務。
整個響應的流程如下:
當一個新的客戶端連接來到時,首先會被main reactor接收到,然后將這個連接的讀寫操作監(jiān)聽注冊到對應的reactor線程當中,并通知worker進程處理對應onConnect的回調。
當客戶端發(fā)送數據之后,reactor線程會收到這些數據,并通過管道發(fā)送給worker進行處理。
worker進程如果需要投遞任務,它就會通過管道或者消息隊列(可以配置)發(fā)送給task worker進程。task worker進程處理完成之后,返回給worker,worker通知reactor線程發(fā)送數據給客戶端。
當worker進程出現意外,或者處理一定次數的請求關閉后,manager進程會重新創(chuàng)建一個新的worker進程,保證整個系統當中worker進程的數目是固定的。
參考網站: