誰でも教えてください。「カーネルスレッド」、「ネイティブスレッド」、「OS スレッド」という用語はすべてカーネルスレッドを表していますか? それとも違いますか?それらが異なる場合、すべての間の関係は何ですか?
1 に答える
そのための本当の基準はありません。用語は文脈によって異なります。ただし、私が知っているさまざまな種類のスレッドについて説明しようと思います (完全を期すために、ファイバーを追加して、人々がスレッドと呼ぶのを見てきました)。
--カーネル内のスレッド化これらは、カーネルスレッドの用語が指すものである可能性が最も高いです。それらはカーネルレベルでのみ存在します。これらは、カーネル コード自体の (ある程度制限された) 並列実行を可能にします。
--アプリケーションのスレッド化これらは、スレッドという用語が一般的に意味するものです。それらは、同じアドレス空間を共有し、オペレーティングシステムによって単一のプロセスとして処理される、異なるプロセッサでスケジュールされる可能性のある並列実行の個別のスレッドです。
POSIX 標準は、POSIX 準拠のシステムでスレッドが持つべきプロパティを定義します (実際には、ライブラリと、各ライブラリ エントリがどのように動作することになっているか)。Windows のスレッド モデルは POSIX のモデルと非常によく似ており、私の知る限り、スレッドについては一般的に、私が行った方法で話しても問題ありません。つまり、同じプロセス内で発生し、異なるプロセッサでスケジュールできる並列実行です。
--古い Linux スレッド初期の Linux カーネルはスレッド化をサポートしていませんでした。ただし、同じアドレス空間を共有する 2 つの異なるプロセスの作成はサポートされていました。これを使用してある種のスレッド機能を実装しようとするプロジェクト (LinuxThreads) がありました。
もちろん、問題は、カーネルがまだそれらを別個のプロセスとして扱っていることでした。したがって、結果は POSIX 準拠ではありませんでした。たとえば、シグナルの処理には問題がありました (シグナルはプロセス レベルの概念であるため)。「ネイティブ」という用語が一般的になり始めたのは、この非常に特定のコンテキストでした。これは、「カーネル レベル」のスレッド化サポートの「ネイティブ」を指します。
カーネルの助けを借りて、POSIX 準拠のスレッド化の実際のサポートが最終的に実装されました。今日、その名前に値する唯一の種類のスレッドです。実際、古い方法は実際のスレッド化ではありません。複数のプロセスによるアドレス空間の共有であり、そのように参照する必要があります。しかし、それがスレッド化と呼ばれていた時期がありました(Linux で実行できるのはスレッド化だけだったからです)。
--ユーザーレベルとグリーンスレッドこれは、別のスレッド モデルと対比するために「ネイティブ」がよく使用される別のコンテキストです。グリーン スレッドとユーザー レベルのスレッドは、同じプロセス内で発生するスレッドですが、ユーザー レベルで完全に処理されます。グリーン スレッドは仮想マシン (特に Java 仮想マシンの場合のように pcode 実行を実装するもの) で使用され、多くの言語 (例: Haskell、Racket、Smalltalk) によってライブラリ レベルでも実装されます。
これらのスレッドは、カーネルによるスレッド化機能に依存する必要はありません (ただし、多くの場合、非同期 I/O に依存します)。そのため、通常、別のプロセッサでスケジュールすることはできません。これらのコンテキストでは、「ネイティブ スレッド」または「OS スレッド」を使用して、グリーン/ユーザー レベルのスレッドとは対照的に、実際のカーネル スケジュール スレッドを参照できます。
「別々のプロセッサでスケジュールすることはできません」は、それらが単独で使用されている場合にのみ当てはまることに注意してください。ユーザー レベル/グリーン スレッドとネイティブ/OS スレッドの両方を持つハイブリッド システムでは、プロセッサごとにネイティブ/OS スレッドを 1 つだけ作成できる場合があります (一部のシステムでは、アフィニティ マスクを設定して、それぞれが特定のプロセッサでのみ実行されるようにします)。特定のプロセッサ) を作成し、ユーザーレベルのスレッドをこれらに効果的に割り当てます。
--ファイバーと協調的マルチタスキング一部の人々がこれらのスレッドと呼んでいるのを見てきました。不適切です。正しい名前はファイバーです。それらは並列実行のモデルでもありますが、スレッド (およびプロセス) とは異なり、協調的です。つまり、ファイバーが実行されているときはいつでも、実行中のファイバーが自発的に実行を「譲り渡し」、一時停止を受け入れ、最終的に後で再開するまで、他のファイバーは実行されません。