スレッドとプロセスの関係は何ですか?

王林
リリース: 2023-05-22 22:35:13
転載
1136 人が閲覧しました

プロセスには少なくとも 1 つのスレッドが必要ですが、複数のスレッドを持つことができます。スレッドは 1 つのプロセスのアドレス空間内でのみ実行できます。 2. リソースはプロセスに割り当てられ、同じプロセスのすべてのスレッドがプロセスのすべてのリソースを共有します。 3. CPU はスレッドに割り当てられます。つまり、スレッドはプロセッサ上で実際に実行されます。同期を実現するには、実行スレッドが相互に連携する必要があり、プロセス間スレッドはメッセージ通信を使用する必要があります。

プロセスはリソース割り当ての基本単位であり、スレッドは CPU のスケジューリングとディスパッチの基本単位です。

スレッドはプロセスの一部です。スレッドは、プロセスにのみ属することができます。 1 つのプロセスに複数のスレッドを含めることができます。ただし、少なくとも 1 つのスレッドを持つことができます。

各プロセスには、独立したコードとデータ領域 (プログラム コンテキスト) があります。プログラム間の切り替えにはコストがかかります。スレッドは軽量プロセスとみなすことができます。同じタイプのスレッドはコードとデータ空間を共有します。各スレッドは独自の独立した実行スタックとプログラム カウンタ (PC) を持ちます。スレッド間の切り替えコストは小さいです。オペレーティング システムでは、複数のプロセス (プログラム) を 1 回で実行できます。同じプロセス (プログラム) 内の複数のスレッドが同時に実行されます (CPU スケジューリングにより、各タイム スライスで 1 つのスレッドのみが実行されます)

システムは実行時に各プロセスに異なるメモリ空間を割り当てます。 CPU に加えて、システムはスレッドにメモリを割り当てません (スレッドが使用するリソースは、スレッドが属するプロセスのリソースから取得されます)。また、スレッド グループはリソースのみを共有できます。

既存のプロセスは共有できません。シングルスレッドとみなされます。プロセス内に複数のスレッドがある場合、実行プロセスは 1 行ではなく、複数のスレッド (スレッド) が一緒に完了します。

スレッドはプロセスの一部であるため、スレッドは軽量プロセス/軽量と呼ばれます。プロセス



プロセスとスレッドの関係

1. プロセスは複数のスレッドを持つことができますが、少なくとも 1 つのスレッドがあり、スレッドはアドレス空間内の 1 つのプロセスアクティビティ内にあります。

2. リソースはプロセスに割り当てられ、同じプロセスのすべてのスレッドがプロセスのすべてのリソースを共有します。

3. CPU はスレッドに割り当てられます。つまり、スレッドはプロセッサ上で実際に実行されます。

4. スレッドは実行中に連携して同期する必要があり、異なるプロセスのスレッドは同期を達成するためにメッセージ通信を使用する必要があります。

プロセス間で何を共有できるでしょうか?

スレッドによって共有される環境には、プロセス コード セグメント、プロセスの公開データ (これらの共有データを使用すると、スレッドは相互に簡単に通信できます)、プロセスによって開かれるファイル記述子、およびシグナルが含まれます。プロセッサ、プロセスの現在のディレクトリ、プロセスのユーザー ID とプロセス グループ ID。

プロセスには多くの共通点がありますが、独自の個性もあります。これらの特性により、スレッドは同時実行性を実現できます。

1. スレッド ID

各スレッドには、このプロセス内で一意の独自のスレッド ID があります。プロセスはこれを使用してスレッドを識別します。

2. レジスタ グループ値

スレッドは同時に実行されるため、各スレッドには独自の異なる実行手がかりがあります。あるスレッドから別のスレッドに切り替えるとき、元のスレッドのレジスタの状態将来再びスレッドが切り替えられたときにスレッドを復元できるように、セットを保存する必要があります。

3. スレッド スタック

スタックは、スレッドが独立して実行されるようにするために必要です。 スレッド関数は関数を呼び出すことができ、呼び出される関数は階層ごとにネストできるため、関数呼び出しが他のスレッドの影響を受けずに正常に実行できるように、スレッドには独自の関数スタックが必要です。

4. エラーリターンコード

同じプロセス内で同時に多数のスレッドが動作しているため、システム構築後に特定のスレッドが errno 値を設定する可能性があります。このスレッドではこのエラーはまだ処理されておらず、この時点でスケジューラによって別のスレッドが実行されるため、エラー値が変更される可能性があります。
したがって、異なるスレッドには独自のエラー戻りコード変数が必要です。

5. スレッドのシグナル マスキング コード

各スレッドが関心のあるシグナルは異なるため、スレッドのシグナル マスキング コードはスレッド自体によって管理される必要があります。ただし、すべてのスレッドは同じシグナル ハンドラーを共有します。

6. スレッドの優先順位

スレッドはプロセスと同様にスケジュールする必要があるため、スケジュールに使用できるパラメーターが必要です。このパラメーターはスレッドの優先順位です。

プロセス間通信の 5 つの方法

1. (名前なし) パイプ

半二重、つまり同時ではありません 両方向でデータを転送します。一部のシステムは全二重をサポートする場合があります。

親プロセスと子プロセスの間のみ。従来の形式では、親プロセスがパイプを作成し、子プロセスをフォークすることで、親プロセスと子プロセスの間で使用できるようになります。

2. 名前付きパイプ (FIFO)

無関係なプロセスでもデータを交換できます。

3. メッセージ キュー

メッセージ キューは、メッセージのリンク リストに似た、カーネルに保存されているメッセージのリストです。ユーザー プロセスは、メッセージ キューにメッセージを追加したり、メッセージ キューからメッセージを読み取ることができます。

パイプライン通信と比較すると、メッセージ キューの利点は、メッセージごとに特定のメッセージ タイプを指定できることです。受信するときにキューの順序に従う必要はなく、カスタム条件に基づいて特定のタイプのメッセージを受信できます。

メッセージは、特定の形式と特定の優先度を持つレコードとして考えることができます。メッセージ キューに対する書き込み権限を持つプロセスは、特定のルールに従ってメッセージ キューに新しいメッセージを追加でき、メッセージ キューに対する読み取り権限を持つプロセスは、メッセージ キューからメッセージを読み取ることができます。

4. セマフォ

複数のプロセスが共有データにアクセスする必要がある場合、セマフォは主にこの目的で使用されるカウンターです。 2 つのプロセスが同じデータに同時にアクセスしないようにする必要がある場合は、セマフォを使用できます。

その主なプロセスは次のとおりです。

リソースを制御するセマフォを確認します。

セマフォの値が 0 より大きい場合、リソースは使用可能であり、リソースは減少します。 1 ずつ増加し、現在のセマフォが使用されていることを示します。

セマフォ値が 0 の場合、プロセスはセマフォ値が 0 より大きくなるまでスリープします。

つまり、実際には別のセマフォが提供されます。プロセスまたはプロセスの異なるスレッド間でのアクセス同期の手段

5. 共有メモリ

共有メモリにより、2 つ以上のプロセスが特定の記憶領域を共有できます。この記憶領域は 2 つ以上のプロセスで使用できます。プロセスは自身のアドレス空間にマッピングされており、あるプロセスが共有メモリに書き込んだ情報は、その共有メモリを利用する他のプロセスが簡単なメモリリードで読み出すことができ、プロセス間通信を実現します。

通信に共有メモリを使用する主な利点の 1 つは、プロセスがデータのコピーなしでメモリを直接読み書きできるため、効率が高いことです。パイプやメッセージ キューなどの通信方法の場合、カーネルは次のことを行う必要があります。データはユーザー空間に 4 回コピーされますが、共有メモリは 2 回だけコピーされます。1 回目は入力ファイルから共有メモリ領域に、もう 1 回目は共有メモリから出力ファイルにコピーされます。

一般に、プロセスがメモリを共有する場合、少量のデータの読み書き後に必ずしもマップが解除されるわけではなく、新しい通信があると共有メモリ領域が再確立され、代わりに共有領域が再構築されます。通信が完了するまでデータ内容は共有メモリに保持され、ファイルには書き戻されません。共有メモリの内容は通常、マッピングが解除されるときにファイルに書き戻されるため、通信に共有メモリを使用する方法は非常に効率的です。

6. ソケット:

ソケットもプロセス間通信メカニズムであり、他の通信メカニズムとは異なり、異なるコンピューター間で使用できます。

7. シグナル (信号)

シグナルは、イベントが発生したことを受信プロセスに通知するために使用される比較的複雑な通信方法です。

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

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート