この記事では、オペレーティング システムのマルチスレッド モデルについて理解します。
マルチスレッドモデル:
マルチスレッドを使用すると、アプリケーションはタスクを個々のスレッドに分割できます。マルチスレッドでは、同じ処理やタスクをスレッドの数だけ実行できます。マルチスレッドでは、タスクを実行するスレッドが複数あるとも言えます。マルチスレッドを使用すると、マルチタスクを実現できます。
カプセル化Java
シングル スレッド システムの主な欠点は、一度に 1 つのタスクしか実行できないことです。そのため、このシングル スレッドの欠点を克服するために、複数のタスクの実行を可能にするマルチスレッドが存在します。
例えば:
上記の例では、client1、client2、client3 は待ち時間なしで Web サーバーにアクセスしています。マルチスレッドでは、複数のタスクを同時に実行できます。
オペレーティング システムでは、スレッドはユーザー レベルのスレッドとカーネル レベルのスレッドに分割されます。ユーザーレベルのスレッドはカーネル上で独立した形式で処理されるため、カーネルのサポートなしで管理されます。反対に、オペレーティング システムはカーネル レベルのスレッドを直接管理します。それにもかかわらず、ユーザーレベルのスレッドとカーネルレベルのスレッドの間には、ある形式の関係が存在する必要があります。
これらの関係を分類する 3 つの確立されたマルチスレッド モデルが存在します。
- 多対 1 マルチスレッド モデル
- 1対1のマルチスレッドモデル
- 多対多のマルチスレッド モデル
多対 1 マルチスレッド モデル:
多対 1 モデルでは、多くのユーザー レベルのスレッドが 1 つのカーネル スレッドにマップされます。このタイプの関係により、効果的なコンテキスト切り替え環境が促進され、スレッド サポートのない単純なカーネルでも簡単に実装できます。
Javaでのリストの例
このモデルの欠点は、カーネル レベルのスレッド スケジュールが常に 1 つだけであるため、このモデルはマルチスレッド プロセスまたはマルチプロセッサ システムによって提供されるハードウェア アクセラレーションを利用できないことです。この場合、すべてのスレッド管理はユーザー空間で行われます。ブロッキングが発生した場合、このモデルはシステム全体をブロックします。
nginx変数
上の図では、多対 1 モデルは、すべてのユーザーレベルのスレッドを単一のカーネルレベルのスレッドに関連付けます。
1対1のマルチスレッドモデル
1 対 1 モデルは、単一のユーザーレベルのスレッドを単一のカーネルレベルのスレッドにマップします。このタイプの関係により、複数のスレッドの並列実行が容易になります。ただし、この利点には欠点もあります。すべての新しいユーザー スレッドの生成には、対応するカーネル スレッドの作成が含まれている必要があります。これによりオーバーヘッドが発生し、親プロセスのパフォーマンスが妨げられる可能性があります。 Windows シリーズと Linux オペレーティング システムは、スレッド数の増加を制限することでこの問題に対処しようとしています。
上の図では、1 つのモデルが 1 つのユーザーレベルのスレッドを 1 つのカーネルレベルのスレッドに関連付けます。
多対多モデル マルチスレッド モデル
このタイプのモデルには、いくつかのユーザーレベルのスレッドといくつかのカーネルレベルのスレッドがあります。作成されるカーネル スレッドの数は、特定のアプリケーションによって異なります。開発者は両方のレベルで同じ数のスレッドを作成できますが、同じではない場合があります。多対多モデルは、他の 2 つのモデルの間の妥協点です。このモデルでは、いずれかのスレッドがブロック システム コールを行った場合、カーネルは別のスレッドの実行をスケジュールできます。また、マルチスレッドの導入により、以前のモデルのような複雑さはありません。このモデルでは複数のカーネル スレッドの作成が可能ですが、このモデルでは真の同時実行性を実現することはできません。これは、カーネルが一度に 1 つのプロセスしかスケジュールできないためです。
マルチスレッド モデルの多対多のバージョンでは、複数のユーザー レベルのスレッドが、上の図と同じか、より少ない種類のカーネル レベルのスレッドに関連付けられます。