MauererのLinuxカーネルアーキテクチャから、
カーネルスレッドは、カーネル自体によって直接開始されるプロセスです。カーネル機能を別のプロセスに委任し、そこでシステムの他のプロセスと「並列」で(そして実際には、カーネル自体の実行と並列に)実行します。カーネルスレッドは、しばしば(カーネル)デーモンと呼ばれます。たとえば、以下のタスクを実行するために使用されます。
- 変更されたメモリページを、ページの作成元のブロックデバイス(たとえば、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
Mauererの本の中で、リンクされた回答では、同じ概念?を最初に起動すると
screen
、実際にはユーザーインターフェイス(ui)が開始されます。これにより、デフォルトでデーモン(セッションマネージャー)が作成されます。一般的に、「カーネルスレッド」、「プロセス」、および「デーモン」の概念、それらの関係および違いをどのように理解しますか?