MauererのLinuxカーネルアーキテクチャから、
カーネルスレッドは、カーネル自体によって直接開始されるプロセスです。カーネル機能を別のプロセスに委任し、そこでシステム内の他のプロセスと「並列」で実行します(実際、カーネル自体の実行と並行しています)。カーネルスレッドはしばしば(カーネル)daemonsと呼ばれます。たとえば、以下のタスクを実行するために使用されます。
- 変更されたメモリページを、ページの作成元のブロックデバイス(mmapを使用してマップされたファイルなど)と定期的に同期します。
- 使用頻度の低いメモリページをスワップ領域に書き込むため。
- 遅延アクションを管理するため。
- ファイルシステムのトランザクションジャーナルを実装します。
基本的に、カーネルスレッドには2つのタイプがあります。
- タイプ1 —スレッドは開始され、特定のアクションを実行するようカーネルから要求されるまで待機します。
- タイプ2 —開始されると、スレッドは定期的な間隔で実行され、特定のリソースの使用率をチェックし、使用率が設定された制限値を超えるか下回ったときにアクションを実行します。カーネルは、継続的な監視タスクにこのタイプのスレッドを使用します。
Mauererの本ではカーネルスレッドはプロセスであると記載されているため、カーネルモードではなくユーザーモードで実行する必要があると思います。 (または私は間違っていますか?プロセスは、ユーザーモードまたはカーネルモードのいずれかで異なる時間に実行できますか、それとも1つのモードのみ実行できますか?)
しかし、BovetのLinuxカーネルの理解によると、カーネルスレッドはカーネルモードでのみ実行されます(下の引用を参照)。 2冊の「カーネルスレッド」の概念は同じ概念ですか?
従来のUnixシステムは、ディスクキャッシュのフラッシュ、未使用のページの交換、ネットワーク接続のサービスなど、重要なタスクを断続的に実行するプロセスに委任しています。実際、これらのタスクを厳密に直線的に実行することは効率的ではありません。それらの機能とエンドユーザープロセスの両方がバックグラウンドでスケジュールされていると、応答が向上します。一部のシステムプロセスはカーネルモードでのみ実行されるため、最新のオペレーティングシステムは、機能をカーネルスレッドに委任します。カーネルスレッドは、不必要なユーザーモードコンテキストに妨げられません。 。 Linuxでは、カーネルスレッドは次の点で通常のプロセスと異なります。
- カーネルスレッドはカーネルモードでのみ実行されますが、通常のプロセスはカーネルモードとユーザーモードで交互に実行されます。
- カーネルスレッドはカーネルモードでのみ実行されるため、PAGE_OFFSETより大きい線形アドレスのみを使用します。一方、通常のプロセスは、ユーザーモードまたはカーネルモードのいずれかで、4ギガバイトのリニアアドレスをすべて使用します。
Mauererの本は、カーネルスレッドはカーネルによって直接開始されると述べており、デーモンはカーネルスレッドの同義語であるとも言われているようです。したがって、デーモンはカーネルによって直接起動される必要があると思います。
しかし https://unix.stackexchange.com/a/193918/674 は、screen
のデーモンがscreen
ユーザーインターフェイスによって起動されることを示しています(下の引用を参照)。 screen
ユーザーインターフェイスは、カーネルではなくプロセスだと思います。マウラーの本のdaemon
の概念とリンクされた返信の概念は同じですか?
screen
を初めて起動すると、実際にはユーザーインターフェイス(ui)が起動されます。これにより、デフォルトでデーモン(セッションマネージャー)が作成されます。
一般に、「カーネルスレッド」、「プロセス」、および「デーモン」の概念、それらの関係および違いをどのように理解しますか?
最初に:クレジットが行く https://stackoverflow.com/questions/15983872/difference-between-user-level-and-kernel-supported-threads
ユーザースレッドとカーネルスレッドはまったく同じです。 (/ proc /を見ると、カーネルスレッドもそこにあることがわかります。)
ユーザースレッドは、ユーザー空間のコードを実行するスレッドです。しかし、いつでもカーネル空間を呼び出すことができます。高いセキュリティレベルでカーネルコードを実行していても、「ユーザー」スレッドと見なされます。
カーネルスレッドは、カーネルコードのみを実行し、ユーザー空間プロセスに関連付けられていないスレッドです。これらは、カーネルのみのデーモンであることを除いて、「UNIXデーモン」に似ています。つまり、カーネルはマルチスレッドプログラムであると言えます。たとえば、スワップ用のカーネルスレッドがあります。これにより、すべてのスワップの問題が強制的に1つのストリームに「シリアル化」されます。
ユーザースレッドが何かを必要とする場合、それはカーネルを呼び出し、そのスレッドをスリープ状態としてマークします。その後、スワップスレッドがデータを見つけ、ユーザースレッドを実行可能としてマークします。その後も、「ユーザースレッド」は何も起こらなかったかのようにカーネルからユーザーランドに戻ります。
実際、clone()操作はカーネル空間で行われるため、すべてのスレッドはカーネル空間で始まります。 (そして、ユーザー空間で新しいプロセスに「戻る」ことができる前に行うべき多くのカーネル会計があります。)