回答:
マルチタスクオペレーティングシステムカーネルの役割の1つはスケジューリングです。実行する実行スレッドを決定します。そのため、このようなカーネルにはスレッドまたはプロセスの概念があります。スレッドは、実行中の連続したコードであり、独自のスタックと他のデータを持っています。オペレーティングシステムのコンテキストでは、通常、プロセスを使用して、独自のメモリスペースを持つスレッドを意味し、スレッドを使用して、メモリスペースを他のスレッドと共有するスレッドを意味します。プロセスは1つ以上のスレッドを持つことができます。
古いUNIXシステムなどの一部のオペレーティングシステムは、プロセスのみを提供します。カーネルが管理するすべてのスレッドには、独自のメモリ空間があります。他のオペレーティングシステム、たとえば最新のUNIXシステムでは、プロセスに複数の実行スレッドを含めることができます。これらは、スレッドのカーネルレベルの概念を提供します。
プロセスが独自のスレッドを管理することも可能です。協調マルチスレッド、各スレッドのコードは、別のスレッドに切り替え命令を含みます。ではプリエンプティブマルチスレッド、プロセスが定期的に要求した非同期別のスレッドに切り替えることにより、これらの通知にカーネルからの通知、および反応します。このように、マルチスレッドは、ユーザーレベルでライブラリにカーネルの協力なしで実装されます。
システムは、カーネルレベルとユーザーレベルの両方のスレッドを提供できます。これはハイブリッドスレッディングとして知られています。
ユーザーレベルのスレッドとカーネルレベルのスレッドにはそれぞれ利点と欠点があります。多くの場合、ユーザーレベルのスレッド間の切り替えは、カーネル内スケジューラーに切り替えて再びプロセスに切り替えるためにメモリ保護をリセットする必要がないため、高速です。これは、いくつかの高水準言語(特にErlang)やそのグリーンスレッドなど、非常に短命のスレッドを多数使用する大規模な並行システムで最も重要です。ユーザーレベルのスレッドでは、カーネルのサポートが少なくて済むため、カーネルがよりシンプルになります。カーネルレベルのスレッドは、同じプロセス内の別のスレッドがシステムコールでブロックされている間、スレッドを実行できます; ユーザーレベルのスレッドを持つプロセスは、プロセスのすべてのスレッドをブロックするため、システムコールをブロックしないように注意する必要があります。カーネルレベルのスレッドは、純粋にユーザーレベルのスレッドでは達成できないマルチプロセッサマシン上で同時に実行できます。
カーネルレベルのスレッドを「仮想プロセッサ」と見なし、ユーザーレベルのスレッドを単なるスレッドと見なします(ここではそのように呼びましょう)。さて、スレッドが実行されるために、プロセッサに割り当てられましたか?そのため、各スレッドは、実行できるように仮想プロセッサに割り当てられます。
ここに事実があります
新しい仮想プロセッサの作成には少しコストがかかります。(カーネルは、スレッド制御ブロックにエントリを作成し、スタックなどを割り当てる必要があります。)
スレッドの作成は、新しい仮想プロセッサの作成に比べて非常に簡単です。アプリケーション開発者は、プログラミング言語によって提供されるスレッドライブラリを使用してスレッドを作成でき、ユーザースペースで管理されます。また、さまざまな言語がさまざまな方法でマルチスレッドを実装しています。
スレッドが単一の仮想プロセッサにマップされている場合、他のスレッドは同時に実行できないため、どのスレッドでもブロッキングシステムコールを行わないように注意する必要があります。
この制限は、さらにいくつかの仮想プロセッサを作成できる場合に克服できます。現在では、スレッドは並行して実行できます(複数の実プロセッサが存在する場合は並行して)。スレッドは、他の仮想プロセッサにマップされている他のスレッドには影響しません。
後者のモデルでは、1つまたは多数のスレッドを仮想プロセッサにマッピングできます。
上記のモデルは、それぞれ多対1、1対1、および多対多と呼ばれます。
Referenes:Galvinらによるオペレーティングシステムの概念 トピック:スレッド->マルチスレッドモデル