この記事では、主に pcntl_fork の実行プロセスの例を紹介します。プロセス (プロセス) の概念は、主に次の 3 つの要素を含みます。
1. 実行可能プログラム
2. プロセスに関連付けられたすべてのデータ (変数、メモリ空間、バッファーなどを含む)
3. プログラムの実行コンテキストは次のように考えることができます。
は、単に実行可能プログラムの実行中の状態を表すものとして理解することもできます。オペレーティング システムによるプロセスの管理は、通常、プロセス テーブルを通じて行われます。プロセス テーブルの各エントリは、現在のオペレーティング システムのプロセスのステータスを記録します。 単一 CPU の場合、特定の時点で CPU を占有するプロセスは 1 つだけですが、システム内に同時に複数のアクティブな (実行を待機している、または実行を継続している) プロセスが存在する可能性があります。プログラム カウンタ (pc) と呼ばれるレジスタは、現在 CPU を占有しているプロセスによって実行される次の命令の位置を示します。プロセスに割り当てられた CPU 時間が使い果たされると、オペレーティング システムは、プロセスに関連するレジスタの値を、CPU を引き継ぐプロセス テーブル内のプロセスの対応するエントリに保存します。この処理はプロセステーブルから読み込んで対応するレジスタを更新する処理です(この処理を「
コンテキストスイッチ(プロセスコンテキストスイッチ)」と呼びます)。実際のコンテキストスイッチにはフォークとは関係なく、より多くのデータが必要です。これ以上は言いませんが、覚えておくべき主な点は、プログラム レジスタ pc が現在プログラムが実行されている場所を示しているということです。これは、CPU をスワップするプロセスが値を保存する必要があるということです。また、CPU にスワップするプロセスも、プロセス実行コンテキスト情報に従ってこのレジスタの値を保存し、このレジスタを更新する必要があります。
fock の知識
2
fork前は子プロセスは親プロセスのものを継承できますが、pcntl_fork()以降は子プロセスと親プロセスの間に継承関係がありません。子プロセスで作られたものは子プロセスに属し、親プロセスで作られたものは親プロセスに属し、完全に独立した2つのプロセスとみなすことができます。
3
プログラムセグメントでpcntl_fork()を使用した後、プログラムは分岐して2つのプロセスを生成します。どちらが最初に実行されるかは、システムのスケジューリングアルゴリズムによって異なります。
ここで、「pid=pcntl_fork();」を実行すると、システムはメイン プログラムとまったく同じサブプロセスを生成すると考えることができます。プロセスの「pid=pcntl_fork();」文で取得した pid は子プロセス自体の pid であり、子プロセスの終了後は親プロセスの「pid=pcntl_fork();」文で取得した pid になります。は親プロセス自体の pid なので、プログラムには 2 行の出力があります。
4
pcntl_fork() 関数は、現在のプロセスの PCB をコピーし、派生した子プロセスの PID を親プロセスに返します。親プロセスと子プロセスは、ステートメントの出力順序に完全に依存します。システムのスケジューリング アルゴリズムと印刷コンテンツは pid 変数によって制御されます。 pcntl_fork() は派生子プロセスの pid を親プロセスに返すが、これは正の整数であることがわかっているため、派生子プロセスの pid 変数は変更されていないため、この違いにより、それぞれの異なる出力を確認できます。
5
子プロセスを派生するプロセス、つまり親プロセスは同じ pid を持ちます
子プロセスの場合、fork() 関数は 0 を返しますが、独自の pid は決して 0 ではありません。fork() 関数が 0 を返す理由は、いつでも getpid() を呼び出して独自の pid を取得できるためです。同期を使用しない限り、誰が最初に実行し、誰が最初に終了するかを決定することはできません。子プロセスが終了した後にのみ親プロセスが fork から戻ると考えるのは間違いです。これは fork の場合ではなく、vfork の場合には当てはまります。
- 例
<?php$lock = new swoole_lock(SWOOLE_MUTEX);echo "[主进程]create lock\n";$lock->lock();$res = pcntl_fork();if ($res>0) { echo "1\n"; $lock->unlock(); sleep(1); echo "222"; } else{ echo "[子进程] Wait Lock\n"; $lock->lock(); echo "[子进程] Get Lock\n"; $lock->unlock(); exit("[子进程] exit\n"); }echo "[主进程]release lock\n";unset($lock);echo "[主进程]exit\n";- 関連おすすめ:
Weibo Qzone WeChat pcntl_fork は PHP マルチプロセスを実装します
以上がpcntl_fork実行処理例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。