Linuxカーネルの理解からの私の理解に基づいて、それは正しいですか?
linuxカーネルのカーネルスレッドと軽量プロセスはどちらも、Cではtask_struct
構造体で表されます。
カーネルスレッドは常にカーネルスペースで実行されますが、軽量プロセスはユーザースペースとカーネルスペースの両方で実行できます
カーネルスレッドと軽量プロセスは、同じレベルの2つの概念です。彼らはお互いに依存していませんか?特に、軽量プロセスはカーネルスレッドに基づいて作成および実行されませんか?
それでは、オペレーティングシステムの概念からの次の引用が、軽量プロセスがカーネルスレッドにアタッチされていることを意味するのはなぜですか? (この本は一般的なOSの概念を対象としており、引用にはLinux向けとは書かれていませんが、本のほとんどの部分はLinuxに適用可能であることに注意してください)
マルチスレッドプログラムで考慮すべき最後の問題は、カーネルとスレッドライブラリ間の通信に関するものです。これは、セクション4.3.3で説明した多対多および2レベルのモデルで必要になる場合があります。このような調整により、カーネルスレッドの数を動的に調整して、最高のパフォーマンスを確保できます。
多対多または2レベルモデルのいずれかを実装する多くのシステムは、ユーザースレッドとカーネルスレッドの間の中間データ構造を配置します。 このデータ構造(通常は軽量プロセス、またはLWPとして知られています)を図4.13に示します。ユーザースレッドライブラリからは、LWPは、アプリケーションがユーザースレッドの実行をスケジュールできる仮想プロセッサのように見えます。 各LWPはカーネルスレッドに接続され、オペレーティングシステムが物理プロセッサで実行するようにスケジュールするのはカーネルスレッドです。カーネルスレッドがブロックした場合(I/O操作が完了するのを待っている間など)、LWPもブロックします。チェーンの上流では、LWPに接続されているユーザーレベルのスレッドもブロックされます。
この本では、いくつかの概念が次のように定義されています。特に、カーネルスレッドとユーザースレッドの定義は、この投稿の冒頭の質問で述べたものとは異なる場合があります。
スレッドのサポートは、ユーザースレッドの場合はユーザーレベルで、カーネルスレッドの場合はカーネルによって提供されます。ユーザースレッドはカーネル上でサポートされ、カーネルサポートなしで管理されますが、カーネルスレッドはオペレーティングシステムによって直接サポートおよび管理されます。
多対1モデル(図4.5)は、多くのユーザーレベルのスレッドを1つのカーネルスレッドにマップします。スレッド管理はユーザースペースのスレッドライブラリによって行われるため、効率的です
多対多モデル(図4.7)は、多くのユーザーレベルのスレッドを少数または同数のカーネルスレッドに多重化します。カーネルスレッドの数は、特定のアプリケーションまたは特定のマシンのいずれかに固有である可能性があります(アプリケーションには、シングルプロセッサよりもマルチプロセッサでより多くのカーネルスレッドが割り当てられる場合があります)。
ありがとう。
カーネルスレッドは常にカーネルスペースで実行されます。ユーザースレッドはユーザースペースで実行されます。つまり、ユーザーモードのアドレススペースがあります。ユーザースレッドは、カーネルのサポートの有無にかかわらず、スケジュール済みにすることができます。それがあなたの質問の後半が「カーネルスレッド」によって意味することです。要するに、同じ名前が2つのことに使用されます。