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