ホームページ  >  記事  >  PHPフレームワーク  >  swoole のプロセスとスレッドについてどのくらい知っていますか?

swoole のプロセスとスレッドについてどのくらい知っていますか?

coldplay.xixi
coldplay.xixi転載
2020-11-24 16:47:073820ブラウズ

#swoole チュートリアル コラムでは、swoole のプロセスとスレッドを紹介します。

swoole のプロセスとスレッドについてどのくらい知っていますか?

推奨 (無料):
swoole チュートリアル
プロセス
1. プロセス間でステータスは共有されません

2. プロセスのスケジューリングはオペレーティングシステムによって完了されます
3. 各プロセスは独自の独立したメモリ空間を持ちます
4. プロセス間の通信は主に信号伝送によって実現され、実装方法は多数あります 通信効率セマフォ、パイプ、イベントなどのメソッドはカーネルを超える必要があるため、通信効率が比較的低くなります。
5. 独立したメモリ空間であるため、最初のコール スタックの情報は、コンテキスト切り替え時に保存される情報、各CPUのレジスタ、仮想メモリ、関連するオープンハンドルなどの情報が保存されるため、コンテキストプロセス間の切り替えは非常にコストがかかり、通信も面倒です。

スレッド
1. スレッド間で変数を共有すると、面倒な通信の問題が解決されます。変数へのアクセスにはロックが必要です。

2. プロセスには複数のスレッドを含めることができますが、それぞれのスレッドは共有されます。オペレーティング システムが親プロセスから要求するリソース (仮想メモリ、ファイルなどを含む)。これらは共有リソースであるため、スレッドの作成に必要なシステム リソースはプロセスのリソースよりもはるかに小さく、対応する作成できるスレッドの数も少なくなります。も比較的大きくなりました。
3. また、スケジューリングに関しても、メモリが共有されるため、コンテキストスイッチング時に保存するものが少なくなり、コンテキストスイッチングが効率化されます。

説明
    php を介して php ファイルを実行することは、プロセスを作成することと同じです。このプロセスはシステムに常駐し、独自のメモリに適用されます。システム リソースをスペース化し、対応するファイルを実行します。プログラム。

  • swoole のプロセスとスレッドについてどのくらい知っていますか?
スウールプロセス

swoole のプロセスとスレッドについてどのくらい知っていますか? 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 機能を有効にした後にのみ有効です。非同期再起動機能
##onPipeMessage sendMessage によって送信されたパイプ メッセージをワーカー プロセスが受信すると、イベントがトリガーされます
#タスク プロセスのコールバック関数
  • #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 つのイベントの実行順序は不確実です
スウール動作フローチャート

swoole のプロセスとスレッドについてどのくらい知っていますか?

<?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 ファイルを実行することは、プロセスを作成することと同じです。このプロセスはシステムに常駐し、独自のメモリに適用されます。システム リソースをスペース化し、対応するファイルを実行します。プログラム。
    swoole のプロセスとスレッドについてどのくらい知っていますか?
スウールプロセス

swoole のプロセスとスレッドについてどのくらい知っていますか?
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 は対応する接続​​リクエストに対して応答結果を送信し、処理が完了します。

マスタープロセスのコールバック関数
  • onStart サーバーはメインプロセスのメインスレッドでこの関数のコールバックを開始します
  • onShutdown このイベントはサーバーが正常に終了したときに発生します
Manager プロセス内のコールバック関数
  • onManagerStart は管理プロセスの開始時に呼び出されます
  • onManagerStop は管理プロセスの終了時に呼び出されます
  • ##ワーカーの #onWorkerError /task_worker プロセスで例外が発生した後、この関数は Manager プロセスでコールバックされます
Worker プロセスのコールバック関数
    onWorkerStartこのイベントは、ワーカー プロセス/タスク プロセスの開始時に発生します。
  • onWorkerStop このイベントは、ワーカー プロセスの終了時に発生します。
  • onConnect 新しい接続が確立されると、ワーカー プロセスでコールバックされます。
  • onClose TCP クライアント接続が閉じられた後、この関数はワーカー プロセスでコールバックされます
  • onReceive データ受信 UDP パケット受信時にこの関数がコールバックされます
  • onPacket UDP パケット受信時にこの関数がコールバックされます
  • onFinish タスクが配信されたときtask_worker でワーカー プロセスが完了すると、タスク プロセスは、finish() メソッドを通じてタスクの処理結果をワーカー プロセスに送信します。
  • onWorkerExit は、reload_async 機能を有効にした後にのみ有効です。非同期再起動機能
  • ##onPipeMessage sendMessage によって送信されたパイプ メッセージをワーカー プロセスが受信すると、イベントがトリガーされます
  • #タスク プロセスのコールバック関数
#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';

以上がswoole のプロセスとスレッドについてどのくらい知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。