ホームページ > 記事 > PHPフレームワーク > swoole のプロセスとスレッドについてどのくらい知っていますか?
2. プロセスのスケジューリングはオペレーティングシステムによって完了されます
3. 各プロセスは独自の独立したメモリ空間を持ちます
4. プロセス間の通信は主に信号伝送によって実現され、実装方法は多数あります 通信効率セマフォ、パイプ、イベントなどのメソッドはカーネルを超える必要があるため、通信効率が比較的低くなります。
5. 独立したメモリ空間であるため、最初のコール スタックの情報は、コンテキスト切り替え時に保存される情報、各CPUのレジスタ、仮想メモリ、関連するオープンハンドルなどの情報が保存されるため、コンテキストプロセス間の切り替えは非常にコストがかかり、通信も面倒です。
2. プロセスには複数のスレッドを含めることができますが、それぞれのスレッドは共有されます。オペレーティング システムが親プロセスから要求するリソース (仮想メモリ、ファイルなどを含む)。これらは共有リソースであるため、スレッドの作成に必要なシステム リソースはプロセスのリソースよりもはるかに小さく、対応する作成できるスレッドの数も少なくなります。も比較的大きくなりました。
3. また、スケジューリングに関しても、メモリが共有されるため、コンテキストスイッチング時に保存するものが少なくなり、コンテキストスイッチングが効率化されます。
1. マスタープロセス: メインプロセス
2. マネージャープロセス: 管理プロセス
3 、ワーカー プロセス: ワーカー プロセス
4. タスク プロセス: 非同期タスク ワーカー プロセス
メイン スレッドはサーバー ソケットの監視を担当します。新しい接続が受け入れられた場合、メイン スレッドは接続の数を評価します。各 Reactor スレッドの接続。負荷分散を実行するには、この接続を接続数が最も少ないリアクター スレッドに割り当てます。
Reactor スレッドは、クライアント マシンの TCP 接続の維持、ネットワーク IO の処理、および完全に非同期かつ非同期でのデータの送受信を担当します。 -ブロックモード。
新しい接続を受け入れた後、swoole のメインスレッドはその接続を固定 Reactor スレッドに割り当て、ソケットが読み取り可能になったときにデータを読み取り、プロトコル分析を実行して、リクエストをワーカー プロセスに配信します。ソケットが書き込み可能なときに、TCP クライアントにデータを送信します。
Swoole がハートビート検出を設定した後、ハートビート パケット スレッドは一定時間内に以前オンラインだったすべての接続に検出を送信します
データpacket
クライアント UDP データ パケットを受信して処理します
ワーカー プロセスは 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 は、対応する接続要求処理に応答結果を送信します。
<?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. また、スケジューリングに関しても、メモリが共有されるため、コンテキストスイッチング時に保存するものが少なくなり、コンテキストスイッチングが効率化されます。
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 スレッドに送信します。 TCP クライアントへの Reactor スレッドは、非同期ノンブロッキング モードまたは同期で実行できます。ブロッキング モード
taskWorker プロセスは、swoole によって提供される非同期ワーカー プロセスです。これらのプロセスは、主に処理に使用されます。長時間にわたる同期タスクをいくつか実行し、ワーカー プロセスで配信します。
1. クライアントのリクエストは Main Reactor に到達し、クライアントは実際に Master プロセスの Reactor スレッドに接続します。
2. Main Reactor は Reactor の状況に応じて対応する Reactor にリクエストを登録します (各 Reactor には epoll があり、クライアントの変更を監視するために使用されます)
3. 変更があった場合クライアントの Reactor は、処理のためにデータをワーカーに渡します
4。ワーカーが処理を完了すると、プロセス間通信 (パイプ、共有メモリ、メッセージ キューなど) を通じて対応するリアクターにデータを送信します。
5. Reactor は対応する接続リクエストに対して応答結果を送信し、処理が完了します。
<?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 サイトの他の関連記事を参照してください。