swoole のプロセスとスレッドについてどのくらい知っていますか?
#swoole チュートリアル コラムでは、swoole のプロセスとスレッドを紹介します。
swoole チュートリアル
プロセス1. プロセス間でステータスは共有されません 2. プロセスのスケジューリングはオペレーティングシステムによって完了されます
3. 各プロセスは独自の独立したメモリ空間を持ちます
4. プロセス間の通信は主に信号伝送によって実現され、実装方法は多数あります 通信効率セマフォ、パイプ、イベントなどのメソッドはカーネルを超える必要があるため、通信効率が比較的低くなります。
5. 独立したメモリ空間であるため、最初のコール スタックの情報は、コンテキスト切り替え時に保存される情報、各CPUのレジスタ、仮想メモリ、関連するオープンハンドルなどの情報が保存されるため、コンテキストプロセス間の切り替えは非常にコストがかかり、通信も面倒です。
2. プロセスには複数のスレッドを含めることができますが、それぞれのスレッドは共有されます。オペレーティング システムが親プロセスから要求するリソース (仮想メモリ、ファイルなどを含む)。これらは共有リソースであるため、スレッドの作成に必要なシステム リソースはプロセスのリソースよりもはるかに小さく、対応する作成できるスレッドの数も少なくなります。も比較的大きくなりました。
3. また、スケジューリングに関しても、メモリが共有されるため、コンテキストスイッチング時に保存するものが少なくなり、コンテキストスイッチングが効率化されます。
- php を介して php ファイルを実行することは、プロセスを作成することと同じです。このプロセスはシステムに常駐し、独自のメモリに適用されます。システム リソースをスペース化し、対応するファイルを実行します。プログラム。
-
1. マスタープロセス: メインプロセス
2. マネージャープロセス: 管理プロセス
3 、ワーカー プロセス: ワーカー プロセス
4. タスク プロセス: 非同期タスク ワーカー プロセス
- 最初の層、マスター プロセス、これは swoole のメイン プロセスであり、このプロセスは次の目的で使用されます。処理 swoole のコア イベントが駆動されるため、このプロセスでは MainReactor [スレッド] と複数の Reactor [スレッド] があることがわかります。クライアントからの接続、シグナルなど、すべての swoole のイベント監視はこれらのスレッドに実装されます加工など
- 1.1. MainReactor (メイン スレッド)
メイン スレッドはサーバー ソケットの監視を担当します。新しい接続が受け入れられた場合、メイン スレッドは接続の数を評価します。各 Reactor スレッドの接続。負荷分散を実行するには、この接続を接続数が最も少ないリアクター スレッドに割り当てます。
- 1.2、Reactor スレッド グループ
Reactor スレッドは、クライアント マシンの TCP 接続の維持、ネットワーク IO の処理、および完全に非同期かつ非同期でのデータの送受信を担当します。 -ブロックモード。
新しい接続を受け入れた後、swoole のメインスレッドはその接続を固定 Reactor スレッドに割り当て、ソケットが読み取り可能になったときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。 - 1.3. ハートビート パケット検出スレッド (HeartbeatCheck)
Swoole がハートビート検出を設定した後、ハートビート パケット スレッドは一定時間内に以前オンラインだったすべての接続に検出を送信します
データpacket - 1.4、UDP パケット受信スレッド (UdpRecv)
クライアント UDP データ パケットを受信して処理します
- swoole が達成したいことパフォーマンスを向上させるために、タスクの処理を支援するために複数のワーカー プロセスを作成する必要がありますが、ワーカー プロセスをフォークする必要があります。ただし、フォーク操作は安全ではありません。管理がない場合、多くのゾンビ プロセスが発生し、サーバーのパフォーマンスに影響します。同時に、プログラム上の理由によりワーカー プロセスが誤って強制終了または異常終了した場合、サービスの安定性を確保するために、ワーカー プロセスを再作成する必要があります。
- Swoole は運用中に別の管理プロセスを作成し、すべてのワーカー プロセスとタスク プロセスは管理プロセスからフォークされます。管理プロセスはすべての子プロセスの終了イベントを監視し、ワーカー プロセスで致命的なエラーが発生するか、実行中のライフサイクルが終了すると、管理プロセスはプロセスをリサイクルして新しいプロセスを作成します。言い換えれば、「ナニー」マネージャー プロセスには、ワーカーとタスク プロセスの作成とリサイクルを管理するための完全な権限があります。
ワーカー プロセスは swoole のメイン論理プロセスに属し、ユーザーはクライアントからの一連のリクエストを処理し、Reactor スレッドによって配信されたリクエスト パケットを受け取り、PHP コールバック関数を実行して処理します。応答データを生成し、Reactor スレッドに送信するデータ。Reactor スレッドによって TCP クライアントに送信され、非同期非ブロッキング モードまたは同期ブロッキング モードにすることができます
taskWorker プロセスは、swoole が提供する非同期ワーカー プロセスであり、主に長時間の同期タスクを処理し、ワーカー プロセス内で配信するために使用されます。
クライアントとサーバー間の対話:
1. クライアントのリクエストは Main Reactor に到達し、クライアントは実際に Master プロセスの Reactor スレッドに接続します。
2. Main Reactor は Reactor の状況に応じて対応する Reactor にリクエストを登録します (各 Reactor には epoll があり、クライアントの変更を監視するために使用されます)
3. 変更があった場合クライアントの Reactor は、処理のためにデータをワーカーに渡します
4。ワーカーが処理を完了すると、プロセス間通信 (パイプ、共有メモリ、メッセージ キューなど) を通じて対応するリアクターにデータを送信します。
5. Reactor は、対応する接続要求処理に応答結果を送信します。
マスター プロセスのコールバック関数
- onStart サーバーは、メイン スレッドで開始されます。 main プロセス この関数をコールバックします
- onShutdown サーバーが正常終了したときにこのイベントが発生します
Manager プロセス内でコールバック関数
- onManagerStart 管理プロセス内でコールバック関数
- onManagerStartプロセスの開始
- onManagerStop は管理プロセスの終了時に呼び出されます
onWorkerError ワーカー/タスクワーカー プロセスで例外が発生した場合、この関数はマネージャー プロセスでコールバックされます
- ワーカープロセス内 コールバック関数
- onWorkerStart ワーカープロセス/タスクプロセスの開始時に発生するイベント
- onWorkerStop ワーカープロセスの終了時に発生するイベントです。
- onConnect 新しい接続が確立されると、ワーカー プロセスでコールバックされます。
- onClose TCP クライアント接続が閉じられた後、この関数はワーカー プロセスでコールバックされます
- onReceive データ受信 UDP パケット受信時にこの関数がコールバックされます
- onPacket UDP パケット受信時にこの関数がコールバックされます
- onFinish タスクが配信されたときtask_worker でワーカー プロセスが完了すると、タスク プロセスは、finish() メソッドを通じてタスクの処理結果をワーカー プロセスに送信します。
- onWorkerExit は、reload_async 機能を有効にした後にのみ有効です。非同期再起動機能
- #onTask task_worker プロセス内で呼び出されます。ワーカー プロセスは、swoole_server_task 関数を使用して、新しいタスクを task_worker プロセスに配信できます。
- onWorkerStart このイベントは、ワーカー プロセス/タスク プロセスが開始されるときに発生します。
- onPipeMessage ワーカー プロセスが、送信されたパイプ メッセージを受信するときに発生します。 by sendMessage イベントがトリガーされます
簡単な説明:
- 1. サーバー シャットダウン プログラムが終了するときの最後のイベントは onShutdown です。
- 2. サーバーが正常に起動すると、onStart/onManagerStart/onWorkerStart は順番にではなく、異なるプロセスで同時に実行されます。
- 3. すべてのイベント コールバックは $server->start の後に発生します。start の後に書かれたコードは無効なコードです。
- 4. onStart/onManagerStart/onWorkerStart の 3 つのイベントの実行順序は不確実です
スウール動作フローチャート
<?php //tcp协议$server=new Swoole\Server("0.0.0.0",9800); //创建server对象$server->set([ 'worker_num'=>3, //设置进程 //'heartbeat_idle_time'=>10,//连接最大的空闲时间 //'heartbeat_check_interval'=>3 //服务器定时检查 'open_length_check'=>1, 'package_length_type'=>'N',//设置包头的长度 'package_length_offset'=>0, //包长度从哪里开始计算 'package_body_offset'=>4, //包体从第几个字节开始计算 'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){ var_dump(1); //设置主进程的名称 swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$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);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){ echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){ //var_dump("消息发送过来:".$data); //服务端});//消息关闭$server->on('close',function (){ echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
プロセス
1. プロセス間で状態が共有されることはありません
2. プロセスのスケジューリングはオペレーティング システムによって完了します
3. 各プロセスは独自の独立したメモリ空間を持っています
4. プロセス間の通信は主にシグナル伝達によって実現されます 実装方法はセマフォ、パイプ、イベントなど数多くありますが、いずれの方法であっても通信効率を高める必要がありますカーネルを経由するため通信効率が比較的低い
5. 独立したメモリ空間であるため、コンテキストスイッチング時に最初のコールスタックの情報、各CPUレジスタの情報、仮想メモリを保存する必要がある、関連するハンドルやその他の情報を開くため、コンテキストプロセス間の切り替えは非常にコストがかかり、通信が面倒です。
スレッド
1. スレッド間で変数を共有することで、面倒な通信の問題が解決されます。変数へのアクセスにはロックが必要です。
2. プロセスには複数のスレッドを含めることができますが、各スレッドは共有します。親プロセスは以下に適用されます。仮想メモリ、ファイルなど、オペレーティング システムからのリソース。共有リソースであるため、スレッドの作成に必要なシステム リソースはプロセスのリソースよりもはるかに小さく、作成できる対応するスレッドの数は相対的に少なくなります。もっと大きい。
3. また、スケジューリングに関しても、メモリが共有されるため、コンテキストスイッチング時に保存するものが少なくなり、コンテキストスイッチングが効率化されます。
説明
- php を介して php ファイルを実行することは、プロセスを作成することと同じです。このプロセスはシステムに常駐し、独自のメモリに適用されます。システム リソースをスペース化し、対応するファイルを実行します。プログラム。
スウールプロセス
1. マスタープロセス: メインプロセス
2. マネージャープロセス: 管理プロセス
3 、ワーカー プロセス: ワーカー プロセス
4. タスク プロセス: 非同期タスク ワーカー プロセス
最初の層、マスター プロセス、これは swoole のメイン プロセスであり、このプロセスは次の目的で使用されます。処理 swoole のコア イベントが駆動されるため、このプロセスでは MainReactor [スレッド] と複数の Reactor [スレッド] があることがわかります。クライアントからの接続、シグナルなど、すべての swoole のイベント監視はこれらのスレッドに実装されます加工など
1.1. MainReactor (メイン スレッド)
メイン スレッドはサーバー ソケットの監視を担当します。新しい接続が受け入れられた場合、メイン スレッドは接続の数を評価します。各 Reactor スレッドの接続。負荷分散を実行するには、この接続を接続数が最も少ないリアクター スレッドに割り当てます。1.2、Reactor スレッド グループ
Reactor スレッドは、クライアント マシンの TCP 接続の維持、ネットワーク IO の処理、および完全に非同期かつ非同期でのデータの送受信を担当します。 -ブロックモード。
新しい接続を受け入れた後、swoole のメインスレッドはその接続を固定 Reactor スレッドに割り当て、ソケットが読み取り可能になったときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。1.3. ハートビート パケット検出スレッド (HeartbeatCheck)
Swoole がハートビート検出を設定した後、ハートビート パケット スレッドは一定時間内に以前オンラインだったすべての接続に検出を送信します
データpacket1.4、UDP パケット受信スレッド (UdpRecv)
クライアント UDP データ パケットを受信して処理しますswoole が達成したいことパフォーマンスを向上させるために、タスクの処理を支援するために複数のワーカー プロセスを作成する必要がありますが、ワーカー プロセスをフォークする必要があります。ただし、フォーク操作は安全ではありません。管理がない場合、多くのゾンビ プロセスが発生し、サーバーのパフォーマンスに影響します。同時に、プログラム上の理由によりワーカー プロセスが誤って強制終了または異常終了した場合、サービスの安定性を確保するために、ワーカー プロセスを再作成する必要があります。
Swoole は運用中に別の管理プロセスを作成し、すべてのワーカー プロセスとタスク プロセスは管理プロセスからフォークされます。管理プロセスはすべての子プロセスの終了イベントを監視し、ワーカー プロセスで致命的なエラーが発生するか、実行中のライフサイクルが終了すると、管理プロセスはプロセスをリサイクルして新しいプロセスを作成します。言い換えれば、「乳母」マネージャー プロセスは、ワーカーとタスク プロセスの作成とリサイクルを管理する完全な権限を持っています。
ワーカー プロセスは、swoole のメイン論理プロセスに属しており、クライアントからの一連のリクエストは、Reactor スレッドによって配信されたリクエスト パケットを受け取り、PHP コールバック関数を実行してデータを処理し、応答データを生成して Reactor スレッドに送信します。 TCP クライアントへの Reactor スレッドは、非同期ノンブロッキング モードまたは同期で実行できます。ブロッキング モード
taskWorker プロセスは、swoole によって提供される非同期ワーカー プロセスです。これらのプロセスは、主に処理に使用されます。長時間にわたる同期タスクをいくつか実行し、ワーカー プロセスで配信します。
クライアントとサーバー間の対話:
1. クライアントのリクエストは Main Reactor に到達し、クライアントは実際に Master プロセスの Reactor スレッドに接続します。
2. Main Reactor は Reactor の状況に応じて対応する Reactor にリクエストを登録します (各 Reactor には epoll があり、クライアントの変更を監視するために使用されます)
3. 変更があった場合クライアントの Reactor は、処理のためにデータをワーカーに渡します
4。ワーカーが処理を完了すると、プロセス間通信 (パイプ、共有メモリ、メッセージ キューなど) を通じて対応するリアクターにデータを送信します。
5. Reactor は対応する接続リクエストに対して応答結果を送信し、処理が完了します。
マスタープロセスのコールバック関数
- onStart サーバーはメインプロセスのメインスレッドでこの関数のコールバックを開始します
- onShutdown このイベントはサーバーが正常に終了したときに発生します
Manager プロセス内のコールバック関数
- onManagerStart は管理プロセスの開始時に呼び出されます
- onManagerStop は管理プロセスの終了時に呼び出されます ##ワーカーの #onWorkerError /task_worker プロセスで例外が発生した後、この関数は Manager プロセスでコールバックされます
- onWorkerStartこのイベントは、ワーカー プロセス/タスク プロセスの開始時に発生します。
- onWorkerStop このイベントは、ワーカー プロセスの終了時に発生します。
- onConnect 新しい接続が確立されると、ワーカー プロセスでコールバックされます。
- onClose TCP クライアント接続が閉じられた後、この関数はワーカー プロセスでコールバックされます
- onReceive データ受信 UDP パケット受信時にこの関数がコールバックされます
- onPacket UDP パケット受信時にこの関数がコールバックされます
- onFinish タスクが配信されたときtask_worker でワーカー プロセスが完了すると、タスク プロセスは、finish() メソッドを通じてタスクの処理結果をワーカー プロセスに送信します。
- onWorkerExit は、reload_async 機能を有効にした後にのみ有効です。非同期再起動機能
- ##onPipeMessage sendMessage によって送信されたパイプ メッセージをワーカー プロセスが受信すると、イベントがトリガーされます
- #タスク プロセスのコールバック関数
- onPipeMessage ワーカー プロセスが、送信されたパイプ メッセージを受信するときに発生します。 by sendMessage イベントがトリガーされます
- 簡単な説明:
- 3. すべてのイベント コールバックは $server->start の後に発生します。start の後に書かれたコードは無効なコードです。
- 4. onStart/onManagerStart/onWorkerStart の 3 つのイベントの実行順序は不確実です
- スウールの動作フローチャート
<?php //tcp协议$server=new Swoole\Server("0.0.0.0",9800); //创建server对象$server->set([
'worker_num'=>3, //设置进程
//'heartbeat_idle_time'=>10,//连接最大的空闲时间
//'heartbeat_check_interval'=>3 //服务器定时检查
'open_length_check'=>1,
'package_length_type'=>'N',//设置包头的长度
'package_length_offset'=>0, //包长度从哪里开始计算
'package_body_offset'=>4, //包体从第几个字节开始计算
'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){
var_dump(1);
//设置主进程的名称
swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$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);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){
echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){
//var_dump("消息发送过来:".$data);
//服务端});//消息关闭$server->on('close',function (){
echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
ログイン後にコピーログイン後にコピー
<?php //tcp协议$server=new Swoole\Server("0.0.0.0",9800); //创建server对象$server->set([ 'worker_num'=>3, //设置进程 //'heartbeat_idle_time'=>10,//连接最大的空闲时间 //'heartbeat_check_interval'=>3 //服务器定时检查 'open_length_check'=>1, 'package_length_type'=>'N',//设置包头的长度 'package_length_offset'=>0, //包长度从哪里开始计算 'package_body_offset'=>4, //包体从第几个字节开始计算 'package_max_length'=>1024 * 1024 * 2,]);$server->on("Start",function (){ var_dump(1); //设置主进程的名称 swoole_set_process_name("server-process:master");});//服务关闭时候触发(信号)$server->on("shutdown",function (){});//当管理进程启动时调用它$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);});//监听事件,连接事件(woker进程当中)$server->on('connect',function ($server,$fd){ echo "新的连接进入:{$fd}".PHP_EOL;});//消息发送过来(woker进程当中)$server->on('receive',function (swoole_server $server, int $fd, int $reactor_id, string $data){ //var_dump("消息发送过来:".$data); //服务端});//消息关闭$server->on('close',function (){ echo "消息关闭".PHP_EOL;});//服务器开启$server->start();echo '123456';
以上がswoole のプロセスとスレッドについてどのくらい知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Explorer.exe とは何のプロセスですか? Windows オペレーティング システムを使用しているときに、「explorer.exe」という用語をよく聞きますが、このプロセスが何であるか知りたいですか?この記事では、プロセスexplorer.exeとは何か、その機能と効果について詳しく説明します。まず、explorer.exe は Windows オペレーティング システムの重要なプロセスであり、Windows エクスプローラー (ウィンドウ) の管理と制御を担当します。

ccsvchst.exe は、Symantec Endpoint Protection (SEP) ソフトウェアの一部である共通プロセス ファイルです。SEP は、有名なネットワーク セキュリティ会社 Symantec によって開発されたエンドポイント保護ソリューションです。ソフトウェアの一部として、ccsvchst.exe は SEP 関連のプロセスの管理と監視を担当します。まず、SymantecEndpointProtection(

Linux システムでは、ゾンビ プロセスは終了したもののシステムにまだ残っている特別なプロセスです。ゾンビ プロセスは多くのリソースを消費しませんが、多すぎるとシステム リソースの枯渇を引き起こす可能性があります。この記事では、ゾンビ プロセスを正しく削除してシステムの正常な動作を保証する方法を紹介します。 1Linux ゾンビ プロセス 子プロセスがタスクを完了した後、親プロセスが時間内にステータスを確認しないと、子プロセスはゾンビ プロセスになります。子プロセスは親プロセスからの確認を待っており、システムは完了するまでリサイクルしません。そうしないと、ゾンビ プロセスがシステム内でハングし続けます。システム内にゾンビ プロセスがあるかどうかを確認するには、コマンド top を実行して、実行中のすべてのプロセスとゾンビ プロセスの可能性を表示します。 Linux における「top」コマンドの結果は、上の図から見ることができます。

Linuxのプロセスの優先度調整方法を詳しく解説 Linuxシステムでは、プロセスの優先度によってプロセスの実行順序やシステム内のリソースの割り当てが決まります。プロセスの優先順位を合理的に調整すると、システムのパフォーマンスと効率が向上します。この記事では、Linuxでプロセスの優先度を調整する方法と具体的なコード例を詳しく紹介します。 1. プロセス優先度の概要 Linux システムでは、各プロセスには優先度が関連付けられています。優先順位の範囲は通常 -20 ~ 19 で、-20 は最高の優先順位を表し、19 は最高の優先順位を表します。

Laravel で Swoole コルーチンを使用すると、大量のリクエストを同時に処理でき、次のような利点があります: 同時処理: 複数のリクエストを同時に処理できます。高いパフォーマンス: Linux の epoll イベント メカニズムに基づいて、リクエストを効率的に処理します。低リソース消費: 必要なサーバー リソースが少なくなります。統合が簡単: Laravel フレームワークとのシームレスな統合が可能で、使いやすいです。

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

Swoole プロセスではユーザーを切り替えることができます。具体的な手順は、プロセスの作成、プロセス ユーザーの設定、プロセスの開始です。

Swoole サービスを再起動するには、次の手順に従います。 サービスのステータスを確認し、PID を取得します。サービスを停止するには、「kill -15 PID」を使用します。サービスの開始に使用したのと同じコマンドを使用してサービスを再起動します。
