初期のオペレーティング システムでは、プロセスは独立した動作の基本単位でしたが、その後になるまで、コンピューター科学者は、独立して実行できる小さな基本単位であるスレッドを提案しました。
なぜスレッドを使用するのでしょうか?
たとえば、ビデオ再生ソフトウェアを作成するとします。ソフトウェア関数には 3 つのコア モジュールがあります。
- ビデオファイルからデータを読み取る
- 読み取ったデータを解凍する
- 圧縮された動画データを再生する
単一プロセスの実装の場合:
この単一プロセスの方法では、次の問題があります。
- CPU の能力が十分でない場合、Read 中にプロセスがここで待機する可能性があり、データの解凍と再生に半日待つことになるため、再生された画像と音声が不安定になります。
- 関数は同時に実行されないため、リソースの使用効率に影響します。
次に、マルチプロセス方式に変更します。
この複数プロセスのアプローチには、まだ問題があります。
- プロセスはどのように通信し、データを共有するのでしょうか?
- プロセスの作成時、リソースの割り当て、 PCBの構築、プロセスの終了時、リソースの再利用、PCB の取り消し、プロセス間の切り替え時、現在のプロセスのステータス情報の保存など、プロセスを維持するためのシステム オーバーヘッドは比較的大きくなります。
では、どうすれば解決できるでしょうか?次のプロパティを満たす新しいエンティティが必要です。
- エンティティは同時に実行可能
- エンティティは同じアドレス空間を共有します
この新しいエンティティはスレッド (Thread)であり、同時に実行して同じアドレス空間を共有できます。
スレッドとは何ですか?
スレッドはプロセス内の実行の流れです。
同じプロセス内の複数のスレッドは、コード セグメント、データ セグメント、オープン ファイルなどのリソースを共有できますが、各スレッドには独自の独立したレジスタとスタックのセットがあり、スレッドの制御フローが相対的に独立していることが保証されます。
スレッドのメリットとデメリットは?
スレッドの利点:
- プロセス内に複数のスレッドが同時に存在できる
- 各スレッドは同時に実行可能
- アドレス空間やファイルなどのリソースをスレッド間で共有可能
スレッドの欠点:
- プロセス内のスレッドがクラッシュすると、そのスレッドが属するプロセスのすべてのスレッドがクラッシュします (ここでは C/C++ 言語の場合)。
たとえば、ゲームのユーザー設計では、マルチスレッドを使用すべきではありません。そうしないと、ユーザーが電話を切った場合に、同じプロセスの他のスレッドに影響を及ぼします。
スレッドとプロセスの比較
スレッドとプロセスの比較:
- プロセスはリソース割り当て (メモリ、開いているファイルなどを含む) の単位であり、スレッドは CPU スケジューリングの単位です。
- プロセスは完全なリソース プラットフォームを備えていますが、スレッドはレジスタやスタックなどの重要なリソースのみを共有します。
- スレッドには、準備完了、ブロック中、実行中の 3 つの基本状態があり、状態間の遷移関係もあります。
- スレッドにより、同時実行の時間とスペースのオーバーヘッドを削減できます。
プロセスと比較して、スレッドはオーバーヘッドを削減できます。これは次の点に反映されます。
- プロセスは作成プロセス中にメモリ管理情報、ファイル管理情報などのリソース管理情報も必要とし、スレッドは作成プロセス中にこれらのリソース管理情報を設計せず、共有するため、スレッドの作成時間はプロセスよりも速くなります。彼ら
- スレッドによって解放されるリソースはプロセスのリソースよりもはるかに小さいため、スレッドの終了時間はプロセスの終了時間よりも速くなります。
- 同じプロセス内のスレッド切り替えは、スレッドが同じアドレス空間 (仮想メモリ空間) を持っているため、プロセス切り替えより高速です。つまり、同じプロセスのスレッドが同じページ テーブルを持っているため、サーフェスを切り替えるときにページを切り替える必要がありません。 。プロセス間の切り替えでは、切り替え時にページテーブルを切り替える必要があり、ページテーブル切り替えのオーバーヘッドが比較的大きい。
- 同じプロセスのスレッドはメモリとファイル リソースを共有するため、スレッド間のデータ転送はカーネルを経由する必要がなく、スレッド間のデータ対話がより効率的になります。
したがって、時間効率でもスペース効率でも、スレッドはプロセスよりも優れています。
スレッドコンテキストの切り替え
プロセスとスレッドの最大の違いは、スレッドがスケジューリングの基本単位であるのに対し、プロセスはリソース所有権の基本単位であることです。
オペレーティング システムのいわゆるタスク スケジューリングは実際にスレッドをスケジュールし、プロセスは仮想メモリやグローバル変数などのリソースをスレッドに提供するだけです。
スレッドとプロセスの場合、次のように理解できます。
- プロセスにスレッドが 1 つしかない場合、プロセスはスレッドと同等であると考えることができます。
- プロセスに複数のスレッドがある場合、これらのスレッドは仮想メモリやグローバル変数などの同じリソースを共有し、コンテキストの切り替え中にこれらのリソースを変更する必要はありません。
さらに、スレッドにはスタックやレジスタなどの独自のプライベート データもあり、コンテキストの切り替え中にこれらも保存する必要があります。
スレッドコンテキストスイッチングとは何ですか?
また、スレッドが同じプロセスに属しているかどうかによっても異なります。
- 2 つのスレッドが同じプロセスに属していない場合、切り替えプロセスはプロセス コンテキストの切り替えと同じです。
- 2つのスレッドが同じプロセスに属する場合、仮想メモリが共有されるため、切り替え時に仮想メモリなどのリソースは変化せず、スレッドのプライベートデータやレジスタなど、共有されていないデータのみを切り替える必要があります。
したがって、スレッド コンテキストの切り替えは、プロセスのオーバーヘッドよりもはるかに低コストです。
スレッドの実装
スレッドには主に 3 つの実装があります。
- ユーザースレッド: ユーザー空間に実装されたスレッドはカーネルによって管理されるスレッドではなく、アプリケーションレベルのスレッドライブラリによって管理されます。カーネルはユーザースレッドの存在を認識できません。
- カーネルスレッド: カーネルに実装されたスレッドは、カーネルによって管理されるスレッドです
- 軽量プロセス: ユーザースレッドをサポートするカーネル内
ユーザースレッドとカーネルスレッドの対応
まず、最初の関係は多対1 の関係です。つまり、複数のユーザー スレッドが同じカーネル スレッドに対応します。
2 つ目は1 対1 の関係です。つまり、1 つのユーザー スレッドが 1 つのカーネル スレッドに対応します。
3 つ目は多対多の関係です。つまり、複数のユーザー スレッドが複数のカーネル スレッドに対応します。
ユーザースレッドを理解するにはどうすればよいですか? どのようなメリットとデメリットがあるのでしょうか?
ユーザー スレッドはユーザー モード スレッド管理ライブラリに基づいて実装され、スレッド制御ブロック(Thread Control Block、TCB ) もライブラリに実装されます。オペレーティング システムはこの TCB を認識できず、カーネルはユーザーを認識できません。スレッドが存在する場合、プロセス PCB 全体のみを参照できます。
したがって、オペレーティング システムはスレッド全体の管理やユーザー スレッドのスケジューリングに直接関与しませんが、ユーザー レベルのスレッド ライブラリ関数がスレッドの作成、終了、同期、スケジューリングなどのスレッド管理を完了します。
ユーザーレベルのスレッドのモデルは、前述の多対 1 の関係に似ています。つまり、次の図に示すように、複数のユーザー スレッドが同じカーネル スレッドに対応します。
ユーザースレッドの利点:
- 各プロセスには、スレッド状態情報 (PC、スタック ポインター、レジスタ) を追跡および記録するために使用されるプライベート スレッド制御ブロック (TCB) リストが必要です。
- ユーザースレッドの切り替えも、ユーザーモードとカーネルモードを切り替えることなく、スレッドライブラリ関数によって完了するため、非常に高速です。
ユーザースレッドの欠点:
- オペレーティング システムはスレッド スケジューリングに参加しないため、スレッドがシステム コールを開始してブロックすると、プロセスに含まれるユーザー スレッドを実行できず、真の同時実行性を実現できません。
- スレッドが実行を開始すると、CPU の使用権を自発的に放棄しない限り、そのスレッドが属するプロセス内の他のスレッドは実行できません。ユーザー モードのスレッドは現在実行中のスレッドに割り込むことができないため、スレッドにはこの権限がなく、動作中のスレッドのみが実行されます。システムにはそれがありますが、ユーザースレッドはオペレーティングシステムによって管理されません
- カーネル リソースの割り当てはプロセスに応じて割り当てられ、ユーザー レベル スレッドが配置されているプロセスはシステム リソースをめぐって競合できますが、各ユーザー スレッドはプロセスの内部リソースをめぐってのみ競合できます。プロセスには数千のユーザーレベルのスレッドが存在する場合がありますが、それらはシステムのリソースには影響しません。
カーネルスレッドを理解するにはどうすればよいでしょうか? どのようなメリットとデメリットがあるのでしょうか?
カーネル スレッドはオペレーティング システムによって管理され、スレッドに対応する TCB は当然オペレーティング システムに配置されるため、スレッドの作成、終了、管理はオペレーティング システムの責任になります。
- カーネルレベルのスレッドはシステム全体でリソースをめぐって競合する可能性があります
- カーネル空間にはカーネルサポートスレッドごとにスレッド制御ブロック(TCB)が設定されており、カーネルはスレッドの存在を感知し、制御ブロックに従ってスレッドを制御します。
カーネル スレッドのモデルは、前述の1 対1 の関係に似ています。つまり、次の図に示すように、1 つのユーザー スレッドが 1 つのカーネル スレッドに対応します。
カーネル スレッドの利点:
- プロセス内で、カーネル スレッドがシステム コールを開始してブロックされても、他のカーネル スレッドの動作には影響しません。
- スレッドに割り当てられると、マルチスレッド プロセスの CPU 実行時間が増加します。
カーネル スレッドの欠点:
- カーネル スレッドをサポートするオペレーティング システムでは、カーネルは、PCB や TCB などのプロセスおよびスレッドのコンテキスト情報を維持します。
- スレッドの作成、終了、切り替えはすべてシステムコールによって実行されるため、システムのオーバーヘッドは比較的大きくなります。
軽量プロセスを理解するにはどうすればよいですか?
軽量プロセス (軽量プロセス、LWP) は、カーネルによってサポートされるユーザー スレッドです。プロセスには 1 つ以上の LWP を持つことができます。各 LWP はカーネル スレッドと 1 対 1 でマップされます。つまり、LWP は次の方法で作成されます。カーネル スレッド。スレッドはサポートされており、LWP はカーネルによって管理され、通常のプロセスと同様にスケジュールされます。
ほとんどのシステムでは、LWP はスケジューラに必要な最小限の実行コンテキストと統計情報しか持たないという点で通常のプロセスとは異なります。一般に、プロセスはプログラムのインスタンスを表し、LWP はプログラムの実行スレッドを表します。実行スレッドはプロセスほど多くの状態情報を必要としないため、LWP はそのような情報を保持しません。
ユーザー スレッドは LWP 上で使用することもできるため、LWP とユーザー スレッドの間には 3 種類の対応関係があります。
- 1 : 1、つまり 1 つの LWP が 1 つのユーザー スレッドに対応します
- N : 1、つまり 1 つの LWP が複数のユーザー スレッドに対応します
- M : N、つまり、複数の LWP が複数のユーザー スレッドに対応します
1:1モード
このモデルに属するプロセス 4 に示すように、スレッドは LWP に対応し、次にカーネル スレッドに対応します。
- 利点: 並列処理が実現され、1 つの LWP がブロックされても、他の LWP には影響しません。
- 欠点: 各ユーザー スレッドはカーネル スレッドを生成し、スレッド作成のオーバーヘッドが比較的高くなります。
N:1モード
上図のプロセス 2 に示すように、複数のユーザー スレッドが 1 つの LWP に対応し、次に 1 つのカーネル スレッドに対応します。スレッド管理はユーザー空間で行われます。このモードでは、ユーザー スレッドはオペレーティング システムには表示されません。
- 利点: 複数のユーザースレッドを開いても問題なく、コンテキストの切り替えがユーザー空間で発生するため、切り替え効率が高い
- デメリット: ユーザースレッドがブロックされると、プロセス全体がブロックされます さらに、マルチコア CPU では、CPU を最大限に活用する方法がありません
M:Nモード
このモードでは、上図のプロセス 3 に示すように、複数のユーザー スレッドが複数の LWP に対応し、LWP が 1 つずつカーネル スレッドに対応する 2 つのレベルの制御が提供されます。
- 利点: 最初の 2 つの利点を組み合わせると、スレッド コンテキストのほとんどがユーザー空間で発生し、複数のスレッドがマルチコア CPU リソースを最大限に活用できます。
コンビネーションモード
上図のプロセス 5 と同様に、このプロセスでは 1:1
モデルと M:N
モデルを組み合わせます。開発者は、アプリケーションのさまざまな特性に応じてカーネル スレッドの数を調整し、物理的並列性と論理的並列性の最適なソリューションを実現できます。