ユーザーレベルのスレッドとカーネルレベルのスレッドの違いは何ですか?


33

いくつかのソースを読んだ後も、ユーザーレベルとカーネルレベルのスレッドについては混乱しています。

特に:

スレッドは、ユーザーレベルとカーネルレベルの両方に存在できます。

ユーザーレベルとカーネルレベルの違いは何ですか?


1
これは本当にComp Sci(理論)ですか、それともプログラミングですか?
Mehrdad

6
@Mehrdad、オペレーティングシステムはコンピューターサイエンスの一部です。
カベ

回答:


28

マルチタスクオペレーティングシステムカーネルの役割の1つはスケジューリングです。実行する実行スレッドを決定します。そのため、このようなカーネルにはスレッドまたはプロセスの概念があります。スレッドは、実行中の連続したコードであり、独自のスタックと他のデータを持っています。オペレーティングシステムのコンテキストでは、通常、プロセスを使用して、独自のメモリスペースを持つスレッドを意味し、スレッドを使用して、メモリスペースを他のスレッドと共有するスレッドを意味します。プロセスは1つ以上のスレッドを持つことができます。

古いUNIXシステムなどの一部のオペレーティングシステムは、プロセスのみを提供します。カーネルが管理するすべてのスレッドには、独自のメモリ空間があります。他のオペレーティングシステム、たとえば最新のUNIXシステムでは、プロセスに複数の実行スレッドを含めることができます。これらは、スレッドのカーネルレベルの概念を提供します。

プロセスが独自のスレッドを管理することも可能です。協調マルチスレッド、各スレッドのコードは、別のスレッドに切り替え命令を含みます。ではプリエンプティブマルチスレッド、プロセスが定期的に要求した非同期別のスレッドに切り替えることにより、これらの通知にカーネルからの通知、および反応します。このように、マルチスレッドは、ユーザーレベルでライブラリにカーネルの協力なしで実装されます。

システムは、カーネルレベルとユーザーレベルの両方のスレッドを提供できます。これはハイブリッドスレッディングとして知られています。

ユーザーレベルのスレッドとカーネルレベルのスレッドにはそれぞれ利点と欠点があります。多くの場合、ユーザーレベルのスレッド間の切り替えは、カーネル内スケジューラーに切り替えて再びプロセスに切り替えるためにメモリ保護をリセットする必要がないため、高速です。これは、いくつかの高水準言語(特にErlang)やそのグリーンスレッドなど、非常に短命のスレッドを多数使用する大規模な並行システムで最も重要です。ユーザーレベルのスレッドでは、カーネルのサポートが少なくて済むため、カーネルがよりシンプルになります。カーネルレベルのスレッドは、同じプロセス内の別のスレッドがシステムコールでブロックされている間、スレッドを実行できます; ユーザーレベルのスレッドを持つプロセスは、プロセスのすべてのスレッドをブロックするため、システムコールをブロックしないように注意する必要があります。カーネルレベルのスレッドは、純粋にユーザーレベルのスレッドでは達成できないマルチプロセッサマシン上で同時に実行できます。


最後の行には、「カーネルレベルのスレッドをマルチプロセッサマシンで同時に実行できますが、純粋にユーザーレベルのスレッドでは達成できません」と書かれています。しかし、与えられたリンクによると、ULTは同時にstackoverflow.com/questions/14791801/…を実行できます。何か問題がありますか?
ギャリック

上記のコメントをご確認ください。
ギャリック

1
@Garrick複数のユーザーレベルのスレッドは、異なるカーネルレベルのスレッド内で実行されていれば、異なるコアで同時に実行できます。ツールとしてULTのみを使用している場合、単一のプロセッサに制限されます。KLTが利用可能な場合、カーネルスレッドを複数のプロセッサに分散し、利用可能なカーネルスレッド間でULTをディスパッチできます。
ジル 'SO-悪であるのをやめる'

4

カーネルレベルのスレッドを「仮想プロセッサ」と見なし、ユーザーレベルのスレッドを単なるスレッド見なします(ここではそのように呼びましょう)。さて、スレッドが実行されるために、プロセッサに割り当てられましたか?そのため、各スレッドは、実行できるように仮想プロセッサに割り当てられます。

ここに事実があります

  • 新しい仮想プロセッサの作成には少しコストがかかります。(カーネルは、スレッド制御ブロックにエントリを作成し、スタックなどを割り当てる必要があります。)

  • スレッドの作成は、新しい仮想プロセッサの作成に比べて非常に簡単です。アプリケーション開発者は、プログラミング言語によって提供されるスレッドライブラリを使用してスレッドを作成でき、ユーザースペースで管理されます。また、さまざまな言語がさまざまな方法でマルチスレッドを実装しています。

モデル

  • スレッドが単一の仮想プロセッサにマップされている場合、他のスレッドは同時に実行できないため、どのスレッドでもブロッキングシステムコールを行わないように注意する必要があります。

  • この制限は、さらにいくつかの仮想プロセッサを作成できる場合に克服できます。現在では、スレッドは並行して実行できます(複数の実プロセッサが存在する場合は並行して)。スレッドは、他の仮想プロセッサにマップされている他のスレッドには影響しません。

  • 後者のモデルでは、1つまたは多数のスレッドを仮想プロセッサにマッピングできます。

  • 上記のモデルは、それぞれ多対1、1対1、および多対多と呼ばれます。

Referenes:Galvinらによるオペレーティングシステムの概念 トピック:スレッド->マルチスレッドモデル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.