ホームページ  >  記事  >  バックエンド開発  >  PHPのスレッドプロセスと同時インスタンスの詳細な説明

PHPのスレッドプロセスと同時インスタンスの詳細な説明

小云云
小云云オリジナル
2018-03-08 09:36:281435ブラウズ


プロセス

プロセスとは何ですか?プロセスは実行中のプログラムであり、プロセスはコンピュータ上で実行されるプログラムのインスタンスであり、プロセッサに割り当てられて実行できるエンティティです。 プロセスには通常、命令セットとシステム リソース セットが含まれます。ここでの命令セットはプログラム コードを指し、システム リソース セットは I/O、CPU、メモリなどを指します。 要約すると、プロセスは、特定のデータ収集に対する特定の独立した機能を備えたプログラムの実行アクティビティであり、システム内のリソース割り当てとスケジューリングのための独立した単位であることも理解できます。

プロセスが実行されるとき、プロセスは次の要素で構成されて一意に表現できます:

  • プロセス記述子: プロセスの一意の識別子。他のプロセスと区別するために使用されます。これは Linux ではプロセス ID と呼ばれ、システム コールのフォーク中に生成されます。ただし、getpid を通じて返されるのはその pid フィールドではなく、スレッド グループ番号 tgid です。

  • プロセスステータス: サスペンド、実行中などとよく呼ばれる状態は、現在の状態を表します。

  • 優先度: 他のプロセスと比較した、プロセス間の実行スケジューリングに関連します。

  • プログラムカウンター: プログラム内で実行される次の命令のアドレスは、カーネルまたはユーザーメモリ空間のメモリアドレスです。

  • メモリ ポインタ: プログラム コードおよびプロセス関連データへのポインタ、および他のプロセスとの共有メモリ ブロックへのポインタが含まれます。

  • コンテキストデータ: プロセスが実行されるときのプロセッサのレジスタのデータ。

  • I/O ステータス情報: 明示的な I/O リクエスト、プロセスに割り当てられた I/O デバイスなど。

  • アカウンティング情報: 合計プロセッサー時間、使用されているクロックの合計数、および時間が含まれる場合があります。制限事項など

上記の要素は、プロセス制御ブロックと呼ばれるデータ構造に配置されます。プロセス制御ブロックは、オペレーティング システムが複数のプロセスをサポートし、多重処理を提供できるようにするための構造です。 オペレーティング システムはプロセスを切り替えるときに、現在のプロセッサのプロセスを中断するステップと、次のプロセスを実行するステップの 2 つのステップを実行します。 割り込みまたは実行に関係なく、プロセス制御ブロック内のプログラム カウンタ、コンテキスト データ、およびプロセス状態が変化します。 プロセスが中断されると、オペレーティング システムはプログラム カウンターとプロセッサ レジスタ (プロセス コントロール ブロック内のコンテキスト データに対応) をプロセス コントロール ブロック内の対応する場所に保存します。プロセスの状態も変化し、プロセス状態に移行する可能性があります。ブロッキング状態になるか、ブロッキング状態になる可能性があります。 次のプロセスが実行されると、オペレーティング システムはルールに従って次のプロセスを実行状態に設定し、実行されるプロセスのプログラム コンテキスト データとプログラム カウンタをロードします。

スレッド

プロセスには、リソースの所有権と実行のスケジュールという 2 つの特徴的な部分があります。 リソースの所有権とは、プロセスの実行に必要なメモリ空間、I/O、その他のリソースがプロセスに含まれていることを意味します。 スケジューリング実行とは、プロセス実行途中の実行経路、つまりプログラムの命令実行の流れを指します。 これら 2 つの機能部分を分離すると、データ所有権を持つ方は通常プロセスと呼ばれ、実行コードのディスパッチ可能な部分を持つ方はスレッドまたは軽量プロセスと呼ばれます。

スレッドには「実行の手掛かり」という意味があり、プロセスはマルチスレッド環境のリソース所有者として定義され、プロセスのプロセス制御ブロックが引き続き保存されます。 スレッドの構造はプロセスの構造とは異なります。各スレッドには以下が含まれます。

  • スレッドのステータス: スレッドの現在のステータス。

  • 実行スタック

  • プライベートデータ領域: 各スレッドのローカル変数用の静的ストレージスペース

  • レジスタセット: プロセッサの一部のステータスを保存します

各プロセスにはプロセス制御ブロックとユーザーアドレス空間があり、各スレッドには独立したスタックと独立した制御ブロックがあり、それぞれが独自の独立した実行コンテキストを持ちます。 その構造を図 8.1 に示します。

PHPのスレッドプロセスと同時インスタンスの詳細な説明

図 8.1 プロセスモデル図

スレッドは、実行中のプロセスとは多少異なります。それぞれの独立したスレッドには、プログラム実行のエントリ ポイント、順次実行シーケンス、およびプログラムの終了ポイントがあります。 ただし、スレッドは独立して実行できず、プロセス内に存在する必要があり、プロセスは複数のスレッドの実行制御を提供します。 論理的な観点から見ると、マルチスレッドの意味は、プロセス内で複数の実行部分を同時に実行できることです。 現時点では、プロセス自体は基本的な実行単位ではなく、スレッドのコンテナーです。

プロセスと比較すると、スレッドの利点は、新しいスレッドの作成でも、スレッドの終了でも、スレッド間のデータや通信の共有でも、高速であることです。プロセスの。


同時実行性と並列性

同時実行性は、共存とも呼ばれ、複数の同時アクティビティを処理できる機能を指しますが、必ずしも同時に発生する必要はありません。 たとえば、現代のコンピュータ システムは、複数のプログラムをプロセスの形でメモリに同時にロードし、プロセッサの時分割多重化を使用して、1 つのプロセッサ上で同時に実行しているような感覚を与えることができます。

パラレルとは、同時に発生する 2 つの同時イベントを指し、並行性の意味を持ちますが、同時性は必ずしも並行しているわけではありません。

同時実行と並列処理の違いは、1 つのプロセッサが複数のタスクを同時に処理するのに対し、複数のプロセッサまたはマルチコア プロセッサは複数の異なるタスクを同時に処理することです。 前者は論理的同時性であり、後者は物理的同時性です。

PHPのさまざまな同時実行モデル

2つのモデルがあるので、PHPはどちらを使用するのでしょうか?答えは、それらはすべてサポートされているということです。これは、PHP がマルチスレッド モデルをサポートしていることを意味します。マルチスレッドの状況では、通常、リソースの共有と分離の問題を解決する必要があります。 PHP 自体はスレッドセーフです。

具体的なモデルは、どの SAPI が使用されるかによって異なります。たとえば、Apache では、マルチスレッド モデルまたはマルチプロセス モデルが使用されます。また、php-fpm はマルチプロセス モデルを使用します。

現在推奨されている方法は、php-fpm モデルを使用することです。このモデルには PHP にとって多くの利点があります。

  1. メモリ解放が簡単で、マルチプロセス モデルを使用する場合は、次の方法で簡単にプロセスを解放できます。 PHP には多くの拡張機能があるため、FPM はプロセスの終了によって暴力を排除するだけで問題を解決します。

  2. 同じ問題に対して、拡張機能または PHP が単一プロセス マルチスレッド モデルの場合、PHP 全体がハングする可能性があります。これはサービスに影響しますが、複数のプロセスが存在する場合、特定のプロセスが停止してもサービス全体には影響しません。

マルチプロセスにはマルチプロセスの利点があり、マルチスレッドにもマルチスレッドの利点があります。たとえば、HHVM はマルチスレッド モデルを選択します。 マルチスレッド モデルの最大の利点は、ポインタを同じプロセス空間で直接使用できるため、情報の共有と通信が便利になることです。

たとえば、PHP、apc、opcache などでは共有メモリを使用してオペコードを共有しますが、HHVM では共有メモリを使用する必要がなく、保存が不便です。複雑なデータ構造。ポインターの問題により、C/C++ のデータ構造はマルチスレッド状況で共有できます。これは効率の向上にも役立ちます。

マルチプロセッシングとマルチスレッドの間には、リクエストを処理する際のロジックという明らかなモデルの違いもあります。

マルチプロセスの場合、プロセスをまたいでFD接続を渡すことが困難です。通常、多くのプロセスは親プロセスで負荷分散を実装します。このようなモデルでは群集問題が発生する可能性があります。 listen(), 然后各个子进程accept()

マルチスレッド モデルでは、独立したスレッドを使用してリクエストを受け入れ、それを各ワーカー スレッドにディスパッチできます。

関連する推奨事項:

シングルスレッド JS 実行の問題の詳細な説明

PHP のマルチスレッド プログラミングのサポートと、

を使用して PHP マルチスレッド クラスを実装するケース

以上がPHPのスレッドプロセスと同時インスタンスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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