ホームページ  >  記事  >  バックエンド開発  >  pcntl_fork実行処理例の詳細説明

pcntl_fork実行処理例の詳細説明

小云云
小云云オリジナル
2018-03-08 14:14:171990ブラウズ

この記事では、主に pcntl_fork の実行プロセスの例を紹介します。プロセス (プロセス) の概念は、主に次の 3 つの要素を含みます。

1. 実行可能プログラム
2. プロセスに関連付けられたすべてのデータ (変数、メモリ空間、バッファーなどを含む)
3. プログラムの実行コンテキストは次のように考えることができます。

は、単に実行可能プログラムの実行中の状態を表すものとして理解することもできます。オペレーティング システムによるプロセスの管理は、通常、プロセス テーブルを通じて行われます。プロセス テーブルの各エントリは、現在のオペレーティング システムのプロセスのステータスを記録します。 単一 CPU の場合、特定の時点で CPU を占有するプロセスは 1 つだけですが、システム内に同時に複数のアクティブな (実行を待機している、または実行を継続している) プロセスが存在する可能性があります。プログラム カウンタ (pc) と呼ばれるレジスタは、現在 CPU を占有しているプロセスによって実行される次の命令の位置を示します。プロセスに割り当てられた CPU 時間が使い果たされると、オペレーティング システムは、プロセスに関連するレジスタの値を、CPU を引き継ぐプロセス テーブル内のプロセスの対応するエントリに保存します。この処理はプロセステーブルから読み込んで対応するレジスタを更新する処理です(この処理を「

コンテキストスイッチ(プロセスコンテキストスイッチ)

」と呼びます)。実際のコンテキストスイッチにはフォークとは関係なく、より多くのデータが必要です。これ以上は言いませんが、覚えておくべき主な点は、プログラム レジスタ pc が現在プログラムが実行されている場所を示しているということです。これは、CPU をスワップするプロセスが値を保存する必要があるということです。また、CPU にスワップするプロセスも、プロセス実行コンテキスト情報に従ってこのレジスタの値を保存し、このレジスタを更新する必要があります。
fock の知識

fork 後、オペレーティング システムは親プロセスとまったく同じ子プロセスをコピーします。これは親子の関係ですが、オペレーティング システムの観点からは兄弟のようなものです。これら 2 つのプロセスはコード空間を共有しますが、子プロセスのデータ空間の内容は親プロセスの完全なコピーですが、命令ポインタは 1 つだけです。 fork が成功した場合、子プロセスの fork の戻り値は 0 になり、親プロセスの fork の戻り値は 0 になります。fork の戻り値は、fork の場合は子プロセスのプロセス番号です。失敗すると、親プロセスはエラーを返します。 2 つのプロセスが同時に同じペースで実行され、フォーク後にそれぞれ異なるタスクが実行される、つまり分岐することが想像できます。これがフォークと呼ばれる理由です。どのプロセスが最初に実行されるかについては、オペレーティング システム プラットフォームのスケジューリング アルゴリズムに関連しており、この問題は実際のアプリケーションでは重要ではありません。親プロセスと子プロセスが連携する必要がある場合は、構文構造を制御することで解決できます。

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 を持ちます
  1. 子プロセスの場合、fork() 関数は 0 を返しますが、独自の pid は決して 0 ではありません。fork() 関数が 0 を返す理由は、いつでも getpid() を呼び出して独自の pid を取得できるためです。同期を使用しない限り、誰が最初に実行し、誰が最初に終了するかを決定することはできません。子プロセスが終了した後にのみ親プロセスが fork から戻ると考えるのは間違いです。これは fork の場合ではなく、vfork の場合には当てはまります。

  2. <?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";
  3. 関連おすすめ:

Weibo Qzone WeChat pcntl_fork は PHP マルチプロセスを実装します

PHP マルチプロセスにおける pcntl_fork の詳細な紹介

php pcntl_fork と pcntl_fork の使用法

以上がpcntl_fork実行処理例の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。