関係: 1. プロセスは複数のスレッドを持つことができますが、少なくとも 1 つのスレッドが存在し、スレッドは 1 つのプロセスのアドレス空間内でのみアクティブにできます。 2. リソースはプロセスに割り当てられ、同じプロセスのすべてのスレッドがプロセスのすべてのリソースを共有します。 3. CPU はスレッドに割り当てられます。つまり、スレッドはプロセッサ上で実際に実行されます。 4. スレッドは実行中に連携して同期する必要があり、異なるプロセスのスレッドは同期を達成するためにメッセージ通信を使用する必要があります。
このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。
プロセスはリソース割り当ての基本単位であり、スレッドは CPU のスケジューリングとディスパッチの基本単位です。
スレッドはプロセスの一部です。スレッドは 1 つのプロセスにのみ所属できます。プロセスは複数のスレッドを持つことができますが、少なくとも 1 つのスレッドが存在します
各プロセスには独立したコードとデータ領域 (プログラム コンテキスト) があり、プログラム間の切り替えにはコストがかかり、スレッドは軽量プロセスと見なすことができ、スレッドは同じタイプのスレッドはコードとデータ空間を共有します。各スレッドは独自の独立した実行スタックとプログラム カウンター (PC) を持ちます。スレッド間の切り替えのコストは小さいです。
オペレーティング システムでは、複数のプロセス (プログラム)同じプロセス内 (プログラム) 内の複数のスレッドが同時に実行されます (CPU スケジューリングにより、各タイム スライスで 1 つのスレッドのみが実行されます)
システムは、(プログラム) に異なるメモリ空間を割り当てます。 CPU を除くスレッド さらに、システムはスレッドにメモリを割り当てず (スレッドによって使用されるリソースは、スレッドが属するプロセスのリソースから取得されます)、スレッド グループはリソースのみを共有できます。 ##既存のプロセスはシングルスレッドとみなされません。プロセス内に複数のスレッドがある場合、実行プロセスは 1 行ではありません。複数のスレッド (スレッド) がまとめて完了します。
スレッドはプロセスの一部であり、したがって、スレッドは軽量プロセス/軽量プロセスと呼ばれます
プロセスとスレッドの関係1. プロセスには次のようなものがあります。複数のスレッド、ただし少なくとも 1 つのスレッド、およびスレッドはプロセスのアドレス空間内でのみアクティビティを実行できます。
2. リソースはプロセスに割り当てられ、同じプロセスのすべてのスレッドがプロセスのすべてのリソースを共有します。
3. CPU はスレッドに割り当てられます。つまり、スレッドはプロセッサ上で実際に実行されます。
4. スレッドは実行中に連携して同期する必要があり、異なるプロセスのスレッドは同期を達成するためにメッセージ通信を使用する必要があります。
プロセス間で何を共有できるでしょうか? スレッドによって共有される環境には、プロセス コード セグメント、プロセスの公開データ (これらの共有データを使用すると、スレッドは相互に簡単に通信できます)、およびプロセスによって開かれるファイル記述が含まれます。 . シンボル、シグナル ハンドラー、プロセスの現在のディレクトリ、プロセスのユーザー ID とプロセス グループ ID。
プロセスには多くの共通点がありますが、独自の個性もあります。これらの特性により、スレッドは同時実行性を実現できます。
1. スレッド ID
各スレッドには、このプロセス内で一意の独自のスレッド ID があります。プロセスはこれを使用してスレッドを識別します。
スレッドは同時に実行されるため、各スレッドには独自の異なる実行手がかりがあります。あるスレッドから別のスレッドに切り替えるとき、元のスレッドのレジスタの状態将来再びスレッドが切り替えられたときにスレッドを復元できるように、セットを保存する必要があります。
スタックは、スレッドが独立して実行されるようにするために必要です。 スレッド関数は関数を呼び出すことができ、呼び出される関数は階層ごとにネストできるため、関数呼び出しが他のスレッドの影響を受けずに正常に実行できるように、スレッドには独自の関数スタックが必要です。
同一プロセス内で多数のスレッドが同時に動作しているため、システム構築後に特定のスレッドが errno 値を設定する可能性があります。このスレッドではこのエラーはまだ処理されておらず、この時点でスケジューラによって別のスレッドが実行されるため、エラー値が変更される可能性があります。
したがって、異なるスレッドには独自のエラー戻りコード変数が必要です。
5. スレッドのシグナル マスキング コード
各スレッドが関心のあるシグナルは異なるため、スレッドのシグナル マスキング コードはスレッド自体によって管理される必要があります。ただし、すべてのスレッドは同じシグナル ハンドラーを共有します。
スレッドはプロセスと同様にスケジュールする必要があるため、スケジュールに使用できるパラメーターが必要です。このパラメーターはスレッドの優先順位です。
プロセス間通信の 5 つの方法
1. (名前なし) パイプ半分二重、つまりデータを同時に両方向に送信することはできません。一部のシステムは全二重をサポートする場合があります。
親プロセスと子プロセスの間のみ。古典的な形式では、パイプは親プロセスによって作成され、プロセスが子プロセスをフォークした後、親プロセスと子プロセスの間でパイプを使用できるようになります。
2. 名前付きパイプ (FIFO)
無関係なプロセスでもデータを交換できます。
3. メッセージ キュー
メッセージ キューは、メッセージのリンクされたリスト、つまりカーネルに保存されている一連のメッセージのリストです。ユーザー プロセスは、メッセージ キューにメッセージを追加したり、メッセージ キューからメッセージを読み取ることができます。
パイプライン通信と比較すると、メッセージ キューの利点は、メッセージごとに特定のメッセージ タイプを指定できることです。受信時にキューの順序に従う必要はなく、カスタム メッセージに基づいて特定のタイプのメッセージを受信できます。条件。
メッセージは、特定の形式と特定の優先度を持つレコードとして考えることができます。メッセージ キューに対する書き込み権限を持つプロセスは、特定のルールに従ってメッセージ キューに新しいメッセージを追加でき、メッセージ キューに対する読み取り権限を持つプロセスは、メッセージ キューからメッセージを読み取ることができます。
4. セマフォ
セマフォはカウンターであり、主に複数のプロセスが共有データにアクセスする必要がある場合に使用されます。この状況を考慮すると、2 つのプロセスが同時に同じデータにアクセスすることはできないため、そのようなことはセマフォの助けを借りて実現できます。
その主なプロセスは次のとおりです。
リソースを制御するセマフォを確認します。
セマフォの値が 0 より大きい場合、リソースは使用可能であり、リソースは減少します。 1 ずつ増加し、現在のセマフォが使用されていることを示します。
セマフォ値が 0 の場合、プロセスはセマフォ値が 0 より大きくなるまでスリープします。
つまり、実際には別のセマフォが提供されます。プロセスまたはプロセスの異なるスレッド間でのアクセス同期の手段
5. 共有メモリ
共有メモリにより、2 つ以上のプロセスが特定の記憶領域を共有できます。この記憶領域は 2 つ以上のプロセスで使用できます。プロセスは自身のアドレス空間にマッピングされており、あるプロセスが共有メモリに書き込んだ情報は、その共有メモリを利用する他のプロセスが簡単なメモリリードで読み出すことができ、プロセス間通信を実現します。
通信に共有メモリを使用する主な利点の 1 つは、プロセスがデータのコピーなしでメモリを直接読み書きできるため、効率が高いことです。パイプやメッセージ キューなどの通信方法の場合、カーネルは次のことを行う必要があります。データはユーザー空間に 4 回コピーされますが、共有メモリは 2 回だけコピーされます。1 回目は入力ファイルから共有メモリ領域に、もう 1 回目は共有メモリから出力ファイルにコピーされます。
一般に、プロセスがメモリを共有する場合、少量のデータの読み書き後に必ずしもマップが解除されるわけではなく、新しい通信があると共有メモリ領域が再確立され、代わりに共有領域が再構築されます。通信が完了するまでデータ内容は共有メモリに保持され、ファイルには書き戻されません。共有メモリの内容は、マップ解除時にファイルに書き戻されることが多いため、共有メモリを使用した通信方法は非常に効率的です。
6. ソケット:
ソケットもプロセス間通信メカニズムであり、他の通信メカニズムとは異なり、異なるコンピューター間で使用できます。
7. シグナル (信号)
シグナルは、イベントが発生したことを受信プロセスに通知するために使用される比較的複雑な通信方法です。さらに関連する知識については、
FAQ以上がスレッドとプロセスの関係は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。