摘要:管理進(jìn)程會(huì)監(jiān)視所有子進(jìn)程的退出事件,當(dāng)進(jìn)程發(fā)生致命錯(cuò)誤或者運(yùn)行生命周期結(jié)束時(shí),管理進(jìn)程會(huì)回收此進(jìn)程,并創(chuàng)建新的進(jìn)程。換句話也就是說(shuō),對(duì)于進(jìn)程的創(chuàng)建回收等操作全權(quán)有保姆進(jìn)程進(jìn)行管理。跟的交互請(qǐng)求到達(dá)實(shí)際上是與進(jìn)程中的某個(gè)線程發(fā)生了連接。
一、進(jìn)程的基本知識(shí)
什么是進(jìn)程,所謂進(jìn)程其實(shí)就是操作系統(tǒng)中一個(gè)正在運(yùn)行的程序,我們?cè)谝粋€(gè)終端當(dāng)中,通過(guò)php,運(yùn)行一個(gè)php文件,這個(gè)時(shí)候就相當(dāng)于我們創(chuàng)建了一個(gè)進(jìn)程,這個(gè)進(jìn)程會(huì)在系統(tǒng)中駐存,申請(qǐng)屬于它自己的內(nèi)存空間系統(tǒng)資源并且運(yùn)行相應(yīng)的程序
對(duì)于一個(gè)進(jìn)程來(lái)說(shuō),它的核心內(nèi)容分為兩個(gè)部分,一個(gè)是它的內(nèi)存,這個(gè)內(nèi)存是這進(jìn)程創(chuàng)建之初從系統(tǒng)分配的,它所有創(chuàng)建的變量都會(huì)存儲(chǔ)在這一片內(nèi)存環(huán)境當(dāng)中
一個(gè)是它的上下文環(huán)境我們知道進(jìn)程是運(yùn)行在操作系統(tǒng)的,那么對(duì)于程序來(lái)說(shuō),它的運(yùn)行依賴操作系統(tǒng)分配給它的資源,操作系統(tǒng)的一些狀態(tài)。
在操作系統(tǒng)中可以運(yùn)行多個(gè)進(jìn)程的,對(duì)于一個(gè)進(jìn)程來(lái)說(shuō),它可以創(chuàng)建自己的子進(jìn)程,那么當(dāng)我們?cè)谝粋€(gè)進(jìn)程中創(chuàng)建出若干個(gè)子進(jìn)程的時(shí)候那么可以看到如圖,子進(jìn)程和父進(jìn)程一樣,擁有自己的內(nèi)存空間和上下文環(huán)境
二、Swoole進(jìn)程結(jié)構(gòu)Swoole的高效不僅僅于底層使用c編寫(xiě),他的進(jìn)程結(jié)構(gòu)模型也使其可以高效的處理業(yè)務(wù),我們想要深入學(xué)習(xí),并且在實(shí)際的場(chǎng)景當(dāng)中使用必須了解,下面我們先看一下結(jié)構(gòu)圖:
首先先介紹下swoole的這幾種進(jìn)程分別是干什么的:
從這些層級(jí)的名字,我們先大概說(shuō)一下,下面這些層級(jí)分別是干什么的,做一個(gè)詳細(xì)的說(shuō)明。
Master進(jìn)程:主進(jìn)程
Manger進(jìn)程:管理進(jìn)程
Worker進(jìn)程:工作進(jìn)程
Task進(jìn)程:異步任務(wù)工作進(jìn)程
1、Master進(jìn)程第一層,Master進(jìn)程,這個(gè)是swoole的主進(jìn)程,這個(gè)進(jìn)程是用于處理swoole的核心事件驅(qū)動(dòng)的,那么在這個(gè)進(jìn)程當(dāng)中可以看到它擁有一個(gè)MainReactor[線程]以及若干個(gè)Reactor[線程],swoole所有對(duì)于事件的監(jiān)聽(tīng)都會(huì)在這些線程中實(shí)現(xiàn),比如來(lái)自客戶端的連接,信號(hào)處理等。
每一個(gè)線程都有自己的用途,下面多每個(gè)線程有一個(gè)了解
MainReactor(主線程)主線程會(huì)負(fù)責(zé)監(jiān)聽(tīng)server socket,如果有新的連接accept,主線程會(huì)評(píng)估每個(gè)Reactor線程的連接數(shù)量。將此連接分配給連接數(shù)最少的reactor線程,做一個(gè)負(fù)載均衡。
Reactor線程組Reactor線程負(fù)責(zé)維護(hù)客戶端機(jī)器的TCP連接、處理網(wǎng)絡(luò)IO、收發(fā)數(shù)據(jù)完全是異步非阻塞的模式。
swoole的主線程在Accept新的連接后,會(huì)將這個(gè)連接分配給一個(gè)固定的Reactor線程,在socket可讀時(shí)讀取數(shù)據(jù),并進(jìn)行協(xié)議解析,將請(qǐng)求投遞到Worker進(jìn)程。在socket可寫(xiě)時(shí)將數(shù)據(jù)發(fā)送給TCP客戶端。
Swoole配置了心跳檢測(cè)之后,心跳包線程會(huì)在固定時(shí)間內(nèi)對(duì)所有之前在線的連接
發(fā)送檢測(cè)數(shù)據(jù)包
接收并且處理客戶端udp數(shù)據(jù)包
2、管理進(jìn)程ManagerSwoole想要實(shí)現(xiàn)最好的性能必須創(chuàng)建出多個(gè)工作進(jìn)程幫助處理任務(wù),但Worker進(jìn)程就必須fork操作,但是fork操作是不安全的,如果沒(méi)有管理會(huì)出現(xiàn)很多的僵尸進(jìn)程,進(jìn)而影響服務(wù)器性能,同時(shí)worker進(jìn)程被誤殺或者由于程序的原因會(huì)異常退出,為了保證服務(wù)的穩(wěn)定性,需要重新創(chuàng)建worker進(jìn)程。
Swoole在運(yùn)行中會(huì)創(chuàng)建一個(gè)多帶帶的管理進(jìn)程,所有的worker進(jìn)程和task進(jìn)程都是從管理進(jìn)程Fork出來(lái)的。管理進(jìn)程會(huì)監(jiān)視所有子進(jìn)程的退出事件,當(dāng)worker進(jìn)程發(fā)生致命錯(cuò)誤或者運(yùn)行生命周期結(jié)束時(shí),管理進(jìn)程會(huì)回收此進(jìn)程,并創(chuàng)建新的進(jìn)程。換句話也就是說(shuō),對(duì)于worker、task進(jìn)程的創(chuàng)建、回收等操作全權(quán)有“保姆”Manager進(jìn)程進(jìn)行管理。
再來(lái)一張圖梳理下Manager進(jìn)程和Worker/Task進(jìn)程的關(guān)系。
3、Worker進(jìn)程worker 進(jìn)程屬于swoole的主邏輯進(jìn)程,用戶處理客戶端的一系列請(qǐng)求,接受由Reactor線程投遞的請(qǐng)求數(shù)據(jù)包,并執(zhí)行PHP回調(diào)函數(shù)處理數(shù)據(jù)生成響應(yīng)數(shù)據(jù)并發(fā)給Reactor線程,由Reactor線程發(fā)送給TCP客戶端可以是異步非阻塞模式,也可以是同步阻塞模式
4、Task進(jìn)程taskWorker進(jìn)程這一進(jìn)城是swoole提供的異步工作進(jìn)程,這些進(jìn)程主要用于處理一些耗時(shí)較長(zhǎng)的同步任務(wù),在worker進(jìn)程當(dāng)中投遞過(guò)來(lái)。
三、進(jìn)程查看及流程梳理當(dāng)啟動(dòng)一個(gè)Swoole應(yīng)用時(shí),一共會(huì)創(chuàng)建2 + n + m個(gè)進(jìn)程,2為一個(gè)Master進(jìn)程和一個(gè)Manager進(jìn)程,其中n為Worker進(jìn)程數(shù)。m為T(mén)askWorker進(jìn)程數(shù)。
默認(rèn)如果不設(shè)置,swoole底層會(huì)根據(jù)當(dāng)前機(jī)器有多少CPU核數(shù),啟動(dòng)對(duì)應(yīng)數(shù)量的Reactor線程和Worker進(jìn)程。我機(jī)器為1核的。Worker為1。
所以現(xiàn)在默認(rèn)我啟動(dòng)了1個(gè)Master進(jìn)程,1個(gè)Manager進(jìn)程,和1個(gè)worker進(jìn)程,TaskWorker沒(méi)有設(shè)置也就是為0,當(dāng)前server會(huì)產(chǎn)生3個(gè)進(jìn)程。
在啟動(dòng)了server之后,在命令行查看當(dāng)前產(chǎn)生的進(jìn)程
這三個(gè)進(jìn)程中,所有進(jìn)程的根進(jìn)程,也就是例子中的2123進(jìn)程,就是所謂的Master進(jìn)程;而2212進(jìn)程,則是Manager進(jìn)程;最后的2321進(jìn)程,是Worker進(jìn)程。
client跟server的交互1、client請(qǐng)求到達(dá) Main Reactor,Client實(shí)際上是與Master進(jìn)程中的某個(gè)Reactor線程發(fā)生了連接。
2、Main Reactor根據(jù)Reactor的情況,將請(qǐng)求注冊(cè)給對(duì)應(yīng)的Reactor?(每個(gè)Reactor都有epoll。用來(lái)監(jiān)聽(tīng)客戶端的變化)?
3、客戶端有變化時(shí)Reactor將數(shù)據(jù)交給worker來(lái)處理
4、worker處理完畢,通過(guò)進(jìn)程間通信(比如管道、共享內(nèi)存、消息隊(duì)列)發(fā)給對(duì)應(yīng)的reactor。?
5、reactor將響應(yīng)結(jié)果發(fā)給相應(yīng)的連接請(qǐng)求處理完成
示意圖:
后續(xù)準(zhǔn)備本文是在自己學(xué)習(xí)Swoole接觸到的一些知識(shí),在初步整理后發(fā)送出來(lái),希望能與大家一起學(xué)習(xí),文章不足等問(wèn)題大家可以一起討論學(xué)習(xí),歡迎騷擾~~。
后面準(zhǔn)備從網(wǎng)絡(luò)模型入手更好的理解swoole的實(shí)現(xiàn)原理,比較與傳統(tǒng)PHP-FPM工作模式的問(wèn)題,之前出過(guò)一篇關(guān)于(一)如何實(shí)現(xiàn)一個(gè)單進(jìn)程阻塞的網(wǎng)絡(luò)服務(wù)器大家可以先了解下,如何一步步演變?yōu)槎噙M(jìn)程master-worker模型。
歡迎大家指正文章問(wèn)題~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31249.html
摘要:受限于的實(shí)現(xiàn),程序無(wú)法使用多線程進(jìn)行編程開(kāi)發(fā)。比如實(shí)現(xiàn)一個(gè)聊天室程序,用戶在進(jìn)程中處理,用戶在進(jìn)程中處理,和如果在同一個(gè),這個(gè)在多線程環(huán)境中直接用表示,和加到對(duì)應(yīng)的中即可。想要解決這個(gè)問(wèn)題,必須實(shí)現(xiàn)一個(gè)基于共享內(nèi)存的數(shù)據(jù)結(jié)構(gòu)。 Swoole項(xiàng)目從 2012 年推出到現(xiàn)在已經(jīng)有 5 年的歷史,現(xiàn)在越來(lái)越多的互聯(lián)網(wǎng)企業(yè)使用Swoole來(lái)開(kāi)發(fā)各類后臺(tái)應(yīng)用。受限于 PHP 的ZendVM實(shí)現(xiàn),...
摘要:負(fù)責(zé)解釋執(zhí)行文件生成響應(yīng),最終返回給,展現(xiàn)至前端。相比于傳統(tǒng)架構(gòu),進(jìn)程模型最大的特點(diǎn)在于其多線程模式處理網(wǎng)絡(luò)請(qǐng)求,使得其能輕松應(yīng)對(duì)大量連接。這要求開(kāi)發(fā)人員對(duì)于多進(jìn)程的運(yùn)行模式有更清晰的認(rèn)識(shí)更容易內(nèi)存泄露。 一、SwooleSwoole號(hào)稱重新定義了PHP,它是一個(gè)PHP擴(kuò)展,使得PHP可以使用異步的方式執(zhí)行,就像node一樣,而且還能使用socket,為PHP提供了一系列異步IO、事件...
摘要:地址歡迎提用法示例路由說(shuō)明對(duì)應(yīng)目錄下的文件中的名稱也必須是繼承對(duì)應(yīng)文件中的的最后必須返回即最后一句等同于啟動(dòng)后發(fā)起請(qǐng)求假定監(jiān)控的和端口是或者投遞任務(wù)到進(jìn)行處理目錄結(jié)構(gòu)說(shuō)明具體處理業(yè)務(wù)邏輯的地方配置文件目錄,根據(jù)環(huán)境來(lái)加載配 Swoole-Task github 地址:https://github.com/luxixing/swoole-task歡迎 star 提 issues Swoo...
摘要:作為定時(shí)任務(wù)的執(zhí)行者,通過(guò)每喚醒自身一次,然后把執(zhí)行表遍歷一次,挑選當(dāng)下需要執(zhí)行的任務(wù),通過(guò)投遞出去并更新該任務(wù)執(zhí)行表中的狀態(tài)。 作者:bromine鏈接:https://www.jianshu.com/p/b44...來(lái)源:簡(jiǎn)書(shū)著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft Github: https://github.com/swoft-clou.....
閱讀 5411·2021-09-22 15:59
閱讀 1974·2021-08-23 09:42
閱讀 2632·2019-08-29 18:42
閱讀 3512·2019-08-29 10:55
閱讀 2164·2019-08-27 10:57
閱讀 1815·2019-08-26 18:27
閱讀 2776·2019-08-23 18:26
閱讀 3008·2019-08-23 14:40