この記事は、主に PHP でのマルチプロセスとマルチスレッドの実装を紹介しています。必要な友達は参考にしてください。
ゾンビプロセス: プロセスが fork を使用して子プロセスを作成し、子プロセスが終了し、親プロセスが子プロセスのステータス情報を取得するために wait または waitpid を呼び出していない場合、そのプロセス記述子は、子プロセスは引き続きシステムに保存されます。このプロセスをゾンビプロセスと呼びます。
ゾンビプロセスの危険: プロセスがwait/waitpidを呼び出さない場合、保持されている情報は解放されず、そのプロセス番号は常に占有されますが、システムは使用されるプロセス数には制限があります。大量のゾンビ プロセスが生成されると、使用可能なプロセス数がなくなるため、システムは新しいプロセスを生成できなくなります。これはゾンビ プロセスの害となるため、回避する必要があります。 子プロセス (init を除く) は、exit() の直後には消えませんが、ゾンビ プロセス (Zombie) と呼ばれるデータ構造を残して、親プロセスの処理を待ちます。
生成されたゾンビプロセスの解決策: 親プロセスを強制終了すると、生成されたゾンビプロセスは孤立プロセスになり、これらの孤立プロセスはinitプロセスに引き継がれ、initプロセスが実行されます。 process will wait() これらの孤立プロセスは、占有しているシステム プロセス テーブル内のリソースを解放します。 ゾンビプロセスへの解決策
(1) シグナル機構を通して
子プロセスが終了すると、親プロセスに SIGCHILD シグナルを送信し、親プロセスは SIGCHILD シグナルを処理します。信号処理関数で wait を呼び出して、ゾンビ プロセスを処理します。
(2) fork 2回
「Unix環境における高度なプログラミング」のセクション8.6が非常に詳しいです。原理は、子プロセスを孤立プロセスにして、その親プロセスが init プロセスになり、ゾンビ プロセスが init プロセスを通じて処理できるようにすることです。
| マルチスレッド
| 概要
|
|
データ共有は複雑であり、IPCが必要です。データは分離されており、同期は簡単です | プロセスデータを共有するのでデータ共有は簡単ですが、その分同期が複雑です |
それぞれに利点があります |
|
メモリ、CPU |
大量のメモリ、複雑な切り替え、CPU 使用率が低い |
占有メモリが少ない、単純な切り替え、高い CPU 使用率 |
スレッドの優位性 |
作成、破棄、切り替え |
複雑な作成、破棄、切り替え、遅い |
作成 破壊と切り替えはシンプルで速い |
スレッドが支配的 |
プログラミングとデバッグ |
簡単なプログラミングとデバッグ |
複雑なプログラミングそして複雑なデバッグ |
プロセスが優位 |
信頼性 |
プロセスは互いに影響しません |
1つのスレッドがハングアップすると、プロセス全体がハングアップします |
プロセスが優位 |
配布済み | マルチコアおよびマルチマシン分散に適応。1 台のマシンでは不十分な場合は、複数のマシンに拡張するのが簡単です |
マルチコア分散に適応 |
プロセスの優位性 |
1) 頻繁に作成および破棄する必要がある優先スレッド
その理由については、上記の比較を参照してください。
この原理の最も一般的な応用例は、接続によってスレッドが作成され、プロセスが使用されると、そのスレッドは作成と破棄に耐えられないほどのコストがかかります。大量の計算が必要な場合 スレッドの使用を優先します
いわゆる大規模な計算は、当然のことながら大量の CPU を消費し、頻繁に切り替えられるため、この場合にはスレッドが最適です。
この原理は、画像処理とアルゴリズム処理で最も一般的に使用されます。3) 強相関処理にはスレッド、弱相関処理にはプロセスを使用します
強相関と弱相関とは何ですか?理論的に定義するのは難しいですが、簡単な例で理解できます。
一般的なサーバーは、メッセージの送受信、メッセージの処理というタスクを完了する必要があります。 「メッセージの送受信」と「メッセージの処理」は関連性の低いタスクであり、「メッセージの処理」は「メッセージのデコード」と「ビジネスの処理」に分けられます。これら 2 つのタスクは比較的密接に関連しています。そのため、「メッセージの送受信」と「メッセージの処理」を別プロセスで設計したり、「メッセージのデコード」と「業務処理」を別のスレッドで設計したりすることができます。 もちろん、この分割方法は静的なものではなく、実際の状況に応じて調整することもできます。4) 複数のマシンに分散されたプロセスとマルチコアに分散されたスレッドを使用するように拡張される場合があります
理由については、上記の比較を参照してください。
5) すべての要件が満たされたら、最も使い慣れた、最も得意な方法を使用してください
いわゆる「データ共有、同期」、「プログラミング、デバッグ」、「信頼性」の側面については、どのようにしますか「複雑か単純か」のどちらかを選択する場合、私が言えることは、「明確な選択方法はない」ということです。ただし、選択の原則として言えるのは、マルチプロセッシングとマルチスレッドの両方が要件を満たすことができる場合は、最も使い慣れており、最も得意とする方を選択することです。
注意する必要があるのは、非常に多くの選択原則を説明しましたが、実際のアプリケーションは基本的に「プロセス + スレッド」の組み合わせであるということです。どちらか一方の誤解に陥ってはいけません。リソースの消費:
カーネルの観点から見ると、プロセスの目的は、システム リソース (CPU 時間、メモリなど) を割り当てるための基本単位として機能することです。スレッドはプロセスの実行ストリームであり、CPU のスケジューリングとディスパッチの基本単位であり、プロセスよりも小さく、独立して実行できます。
スレッドは、互いに同じアドレス空間を使用し、ほとんどのデータを共有します。スレッドの開始に費やされるスペースは、プロセスの開始に比べてはるかに少なくなります。また、スレッド間の切り替えに必要な時間もはるかに短くなります。プロセスの開始に必要な時間。プロセス間の切り替えに必要な時間。統計によれば、一般に、プロセスのオーバーヘッドはスレッドのオーバーヘッドの約 30 倍です。もちろん、特定のシステムでは、このデータは大幅に異なる場合があります。
通信方法:
プロセス間でデータを転送する唯一の方法は通信ですが、時間がかかり不便です。スレッド時間データのほとんどは共有される (スレッド関数内では共有されない) ため、高速で便利です。ただし、データの同期にはロックが必要であり、静的変数には特別な注意を払う必要があります。
スレッドの利点:
マルチ CPU システムの効率が向上します。 オペレーティング システムは、スレッドの数が CPU の数を超えない場合、異なるスレッドが異なる CPU で実行されるようにします。
プログラム構造を改善します。長く複雑なプロセスを複数のスレッドに分割し、いくつかの独立または半独立した実行部分にすることができ、そのようなプログラムは理解しやすく、変更しやすくなります。
/** * 入口函数 * 将此文件保存为 ProcessOpera.php * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.php & * 查看进程 ps aux|grep php */ ProcessOpera("runCode", array(), 8); /** * run Code */ function runCode($opt = array()) { //需要在守护进程中运行的代码 } /** * $func为子进程执行具体事物的函数名称 * $opt为$func的参数 数组形式 * $pNum 为fork的子进程数量 */ function ProcessOpera($func, $opts = array(), $pNum = 1) { while(true) { $pid = pcntl_fork(); if($pid == -1) { exit("pid fork error"); } if($pid) { static $execute = 0; $execute++; if($execute >= $pNum) { pcntl_wait($status); $execute--; } } else { while(true) { //somecode $func($opts); sleep(1); } exit(0); } } }
PHP Ways でスケジュールされたタスクを実装する 5 つの方法
以上がPHP はマルチプロセスとマルチスレッドを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。