カーネルスレッドはプロセスとデーモンですか?


10

MauererのLinuxカーネルアーキテクチャから、

カーネルスレッドは、カーネル自体によって直接開始されるプロセスです。カーネル機能を別のプロセスに委任し、そこでシステムの他のプロセスと「並列」で(そして実際には、カーネル自体の実行と並列に)実行します。カーネルスレッドは、しばしば(カーネル)デーモンと呼ばれます。たとえば、以下のタスクを実行するために使用されます。

  • 変更されたメモリページを、ページの作成元のブロックデバイス(たとえば、mmapを使用してマップされたファイル)と定期的に同期します。
  • めったに使用されないメモリページをスワップ領域に書き込むため。
  • 遅延アクションを管理するため。
  • ファイルシステムのトランザクションジャーナルを実装します。

基本的に、カーネルスレッドには2つのタイプがあります。

  • タイプ1 —スレッドは開始され、特定のアクションを実行するようカーネルから要求されるまで待機します。
  • タイプ2 —開始されると、スレッドは定期的な間隔で実行され、特定のリソースの使用率をチェックし、使用率が設定された制限値を超えるか下回ったときにアクションを実行します。カーネルは、このタイプのスレッドを継続的な監視タスクに使用します。
  1. Mauererの本には、カーネルスレッドはプロセスであると記載されているため、カーネルモードではなく、ユーザーモードで実行する必要があると思います。(または私は間違っていますか?プロセスは、ユーザーモードまたはカーネルモードのいずれかで異なる時間に実行できますか、それとも1つのモードだけで実行できますか?)

    しかし、BovetのLinuxカーネルの理解によると、カーネルスレッドはカーネルモードでのみ実行されます(下の引用を参照)。2冊の「カーネルスレッド」の概念は同じ概念ですか?

    従来のUnixシステムは、ディスクキャッシュのフラッシュ、未使用のページの交換、ネットワーク接続のサービスなど、いくつかの重要なタスクを断続的に実行するプロセスに委任しています。実際、これらのタスクを厳密に直線的に実行することは効率的ではありません。それらの機能とエンドユーザープロセスの両方がバックグラウンドでスケジュールされていると、応答が向上します。一部のシステムプロセスはカーネルモードでのみ実行されるため、最近のオペレーティングシステムは、不要なユーザーモードコンテキストに邪魔されないカーネルスレッドに機能を委任します。Linuxでは、カーネルスレッドは次の点で通常のプロセスと異なります。

    • カーネルスレッドはカーネルモードでのみ実行されますが、通常のプロセスはカーネルモードとユーザーモードで交互に実行されます。
    • カーネルスレッドはカーネルモードでのみ実行されるため、PAGE_OFFSETより大きい線形アドレスのみを使用します。一方、通常のプロセスは、ユーザーモードまたはカーネルモードのいずれかで、4ギガバイトのリニアアドレスをすべて使用します。
  2. Mauererの本は、カーネルスレッドはカーネルによって直接開始されると述べており、デーモンはカーネルスレッドの同義語であるとも言われているようです。したがって、デーモンはカーネルによって直接開始される必要があると思います。

    しかし、https://unix.stackexchange.com/a/193918/674によると、screenデーモンはscreenユーザーインターフェイスによって起動されます(下の引用を参照)。screenユーザーインターフェースはカーネルではなくプロセスだと思います。概念であるdaemonMauererの本の中で、リンクされた回答では、同じ概念?

    を最初に起動するとscreen、実際にはユーザーインターフェイス(ui)が開始されます。これにより、デフォルトでデーモン(セッションマネージャー)が作成されます。

  3. 一般的に、「カーネルスレッド」、「プロセス」、および「デーモン」の概念、それらの関係および違いをどのように理解しますか?


ティム、私は数日からあなたを見ているので、あなたはいくつかの大きな研究をしているわ。
rɑːdʒɑ

回答:


10

最初:クレジットは /programming/15983872/difference-between-user-level-and-kernel-supported-threads

ユーザースレッドとカーネルスレッドはまったく同じです。(/ proc /を見ると、カーネルスレッドもそこにあることがわかります。)

ユーザースレッドは、ユーザー空間のコードを実行するスレッドです。しかし、いつでもカーネル空間を呼び出すことができます。高いセキュリティレベルでカーネルコードを実行していても、「ユーザー」スレッドと見なされます。

カーネルスレッドは、カーネルコードのみを実行し、ユーザー空間プロセスに関連付けられていないスレッドです。これらは、カーネルのみのデーモンであることを除いて、「UNIXデーモン」に似ています。つまり、カーネルはマルチスレッドプログラムであると言えます。たとえば、スワップ用のカーネルスレッドがあります。これにより、すべてのスワップの問題が強制的に1つのストリームに「シリアル化」されます。

ユーザースレッドが何かを必要とする場合、それはカーネルを呼び出し、そのスレッドをスリープ状態としてマークします。その後、スワップスレッドがデータを見つけ、ユーザースレッドを実行可能としてマークします。その後も、「ユーザースレッド」は何も起こらなかったかのようにカーネルからユーザーランドに戻ります。

実際、clone()操作はカーネル空間で行われるため、すべてのスレッドはカーネル空間で始まります。(そして、ユーザー空間で新しいプロセスに「戻る」ことができる前に行うべき多くのカーネル会計があります。)

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