1、進(jìn)程之間不共享任何狀態(tài)
2、進(jìn)程的調(diào)度由操作系統(tǒng)完成
3、每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間
4、進(jìn)程間通訊主要是通過(guò)信號(hào)傳遞的方式來(lái)實(shí)現(xiàn)的,實(shí)現(xiàn)方式有多種,信號(hào)量、管道、事件等,任何一種方式的通訊效率都需要過(guò)內(nèi)核,導(dǎo)致通訊效率比較低
5、由于是獨(dú)立的內(nèi)存空間,上下文切換的時(shí)候需要保存先調(diào)用棧的信息、cpu各寄存器的信息、虛擬內(nèi)存、以及打開(kāi)的相關(guān)句柄等信息,所以導(dǎo)致上下文進(jìn)程間切換開(kāi)銷很大,通訊麻煩。
1、線程之間共享變量,解決了通訊麻煩的問(wèn)題對(duì)于變量的訪問(wèn)需要鎖
2、一個(gè)進(jìn)程可以擁有多個(gè)線程,但是其中每個(gè)線程會(huì)共享父進(jìn)程像操作系統(tǒng)申請(qǐng)資源,這個(gè)包括虛擬內(nèi)存、文件等,由于是共享資源,所以創(chuàng)建線程所需要的系統(tǒng)資源占用比進(jìn)程小很多,相應(yīng)的可創(chuàng)建的線程數(shù)量也變得相對(duì)多很多。
3、另外在調(diào)度方面也是由于內(nèi)存是共享的,所以上下文切換的時(shí)候需要保存的東西就像對(duì)少一些,這樣一來(lái)上下文的切換也變得高效。
1、Master進(jìn)程:主進(jìn)程
2、Manger進(jìn)程:管理進(jìn)程
3、Worker進(jìn)程:工作進(jìn)程
4、Task進(jìn)程:異步任務(wù)工作進(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)處理等。
1.1、MainReactor(主線程)
主線程會(huì)負(fù)責(zé)監(jiān)聽(tīng)server socket,如果有新的連接accept,主線程會(huì)評(píng)估每個(gè)Reactor線程的連接數(shù)量。將此連接分配給連接數(shù)最少的reactor線程,做一個(gè)負(fù)載均衡。
1.2 、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客戶端。
1.3、心跳包檢測(cè)線程(HeartbeatCheck)
Swoole配置了心跳檢測(cè)之后,心跳包線程會(huì)在固定時(shí)間內(nèi)對(duì)所有之前在線的連接
發(fā)送檢測(cè)數(shù)據(jù)包
1.4、UDP收包線程(UdpRecv)
接收并且處理客戶端udp數(shù)據(jù)包
swoole想要實(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è)單獨(dú)的管理進(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)行管理
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客戶端可以是異步非阻塞模式,也可以是同步阻塞模式
taskWorker進(jìn)程這一進(jìn)城是swoole提供的異步工作進(jìn)程,這些進(jìn)程主要用于處理一些耗時(shí)較長(zhǎng)的同步任務(wù),在worker進(jìn)程當(dāng)中投遞過(guò)來(lái)。
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)求處理完成
<?php//tcp協(xié)議$server=new Swoole\Server("0.0.0.0",9800); //創(chuàng)建server對(duì)象$server->set([ 'worker_num'=>3, //設(shè)置進(jìn)程 //'heartbeat_idle_time'=>10,//連接最大的空閑時(shí)間 //'heartbeat_check_interval'=>3 //服務(wù)器定時(shí)檢查 'open_length_check'=>1, 'package_length_type'=>'N',//設(shè)置包頭的長(zhǎng)度 'package_length_offset'=>0, //包長(zhǎng)度從哪里開(kāi)始計(jì)算 'package_body_offset'=>4, //包體從第幾個(gè)字節(jié)開(kāi)始計(jì)算 'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){ var_dump(1); //設(shè)置主進(jìn)程的名稱 swoole_set_process_name("server-process:master");});//服務(wù)關(guān)閉時(shí)候觸發(fā)(信號(hào))$server->on("shutdown",function (){});//當(dāng)管理進(jìn)程啟動(dòng)時(shí)調(diào)用它$server->on('ManagerStart',function (){ var_dump(2); //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){ // swoole_set_process_name("server-process:worker"); var_dump(3);});//監(jiān)聽(tīng)事件,連接事件(woker進(jìn)程當(dāng)中)$server->on('connect',function ($server,$fd){ echo "新的連接進(jìn)入:{$fd}".PHP_EOL;});//消息發(fā)送過(guò)來(lái)(woker進(jìn)程當(dāng)中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){ //var_dump("消息發(fā)送過(guò)來(lái):".$data); //服務(wù)端});//消息關(guān)閉$server->on('close',function (){ echo "消息關(guān)閉".PHP_EOL;});//服務(wù)器開(kāi)啟$server->start();echo '123456';
1、進(jìn)程之間不共享任何狀態(tài)
2、進(jìn)程的調(diào)度由操作系統(tǒng)完成
3、每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間
4、進(jìn)程間通訊主要是通過(guò)信號(hào)傳遞的方式來(lái)實(shí)現(xiàn)的,實(shí)現(xiàn)方式有多種,信號(hào)量、管道、事件等,任何一種方式的通訊效率都需要過(guò)內(nèi)核,導(dǎo)致通訊效率比較低
5、由于是獨(dú)立的內(nèi)存空間,上下文切換的時(shí)候需要保存先調(diào)用棧的信息、cpu各寄存器的信息、虛擬內(nèi)存、以及打開(kāi)的相關(guān)句柄等信息,所以導(dǎo)致上下文進(jìn)程間切換開(kāi)銷很大,通訊麻煩。
1、線程之間共享變量,解決了通訊麻煩的問(wèn)題對(duì)于變量的訪問(wèn)需要鎖
2、一個(gè)進(jìn)程可以擁有多個(gè)線程,但是其中每個(gè)線程會(huì)共享父進(jìn)程像操作系統(tǒng)申請(qǐng)資源,這個(gè)包括虛擬內(nèi)存、文件等,由于是共享資源,所以創(chuàng)建線程所需要的系統(tǒng)資源占用比進(jìn)程小很多,相應(yīng)的可創(chuàng)建的線程數(shù)量也變得相對(duì)多很多。
3、另外在調(diào)度方面也是由于內(nèi)存是共享的,所以上下文切換的時(shí)候需要保存的東西就像對(duì)少一些,這樣一來(lái)上下文的切換也變得高效。
1、Master進(jìn)程:主進(jìn)程
2、Manger進(jìn)程:管理進(jìn)程
3、Worker進(jìn)程:工作進(jìn)程
4、Task進(jìn)程:異步任務(wù)工作進(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)處理等。
1.1、MainReactor(主線程)
主線程會(huì)負(fù)責(zé)監(jiān)聽(tīng)server socket,如果有新的連接accept,主線程會(huì)評(píng)估每個(gè)Reactor線程的連接數(shù)量。將此連接分配給連接數(shù)最少的reactor線程,做一個(gè)負(fù)載均衡。
1.2 、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客戶端。
1.3、心跳包檢測(cè)線程(HeartbeatCheck)
Swoole配置了心跳檢測(cè)之后,心跳包線程會(huì)在固定時(shí)間內(nèi)對(duì)所有之前在線的連接
發(fā)送檢測(cè)數(shù)據(jù)包
1.4、UDP收包線程(UdpRecv)
接收并且處理客戶端udp數(shù)據(jù)包
swoole想要實(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è)單獨(dú)的管理進(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)行管理
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客戶端可以是異步非阻塞模式,也可以是同步阻塞模式
taskWorker進(jìn)程這一進(jìn)城是swoole提供的異步工作進(jìn)程,這些進(jìn)程主要用于處理一些耗時(shí)較長(zhǎng)的同步任務(wù),在worker進(jìn)程當(dāng)中投遞過(guò)來(lái)。
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)求處理完成
<?php//tcp協(xié)議$server=new Swoole\Server("0.0.0.0",9800); //創(chuàng)建server對(duì)象$server->set([ 'worker_num'=>3, //設(shè)置進(jìn)程 //'heartbeat_idle_time'=>10,//連接最大的空閑時(shí)間 //'heartbeat_check_interval'=>3 //服務(wù)器定時(shí)檢查 'open_length_check'=>1, 'package_length_type'=>'N',//設(shè)置包頭的長(zhǎng)度 'package_length_offset'=>0, //包長(zhǎng)度從哪里開(kāi)始計(jì)算 'package_body_offset'=>4, //包體從第幾個(gè)字節(jié)開(kāi)始計(jì)算 'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){ var_dump(1); //設(shè)置主進(jìn)程的名稱 swoole_set_process_name("server-process:master");});//服務(wù)關(guān)閉時(shí)候觸發(fā)(信號(hào))$server->on("shutdown",function (){});//當(dāng)管理進(jìn)程啟動(dòng)時(shí)調(diào)用它$server->on('ManagerStart',function (){ var_dump(2); //swoole_set_process_name("server-process:manger");});$server->on('WorkerStart',function ($server,$workerId){ // swoole_set_process_name("server-process:worker"); var_dump(3);});//監(jiān)聽(tīng)事件,連接事件(woker進(jìn)程當(dāng)中)$server->on('connect',function ($server,$fd){ echo "新的連接進(jìn)入:{$fd}".PHP_EOL;});//消息發(fā)送過(guò)來(lái)(woker進(jìn)程當(dāng)中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){ //var_dump("消息發(fā)送過(guò)來(lái):".$data); //服務(wù)端});//消息關(guān)閉$server->on('close',function (){ echo "消息關(guān)閉".PHP_EOL;});//服務(wù)器開(kāi)啟$server->start();echo '123456';
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com