カーネルスレッド

Last-modified: 2013-11-21 (木) 18:04:29

3.4.2 カーネルスレッド

連続的ではなく定期的に実行するような処理はカーネルスレッドがバックグラウンドで実行する。
これによりユーザモードコンテキストの動作が妨げられない。

◆カーネルスレッドとそれ以外のプロセスの違い

- 各カーネルスレッドは特定のカーネル関数を実行する。通常のプロセスはシステムコール経由でしか、
  カーネル関数を実行できない。
- カーネルスレッドはカーネルモードでしか実行されないが、通常のプロセスはカーネルモードと
  ユーザモードが交互に入れ替わる。
- PAGE_OFFSET番地以降のリニアアドレスしか実行しない。通常のプロセスは4GB全体を利用する。

◆カーネルスレッドの生成
kernel_thread()

◆プロセス0
swapperプロセス, start_kernel()関数によりLinuxの初期化時に生成されるカーネルスレッド。

start_kernel()関数

|カーネルが必要とするすべてのデータ構造の初期化
|割り込みの許可
↓プロセス1の生成
cpu_idle()関数の実行

◆プロセス1
初期化の続きをしたのちに、execvシステムコールを発行して実行可能プログラムinitを読み込む。

◆その他のカーネルスレッド
keventd - qt_contextタスクキューのタスクを実行(ボトムハーフ)
kapm - APM( Advanced Power Management )
kswapd - メモリの回収
kflushd - ダーティなメモリをディスクへ書き出す。
kupdate - ダーティなバッファをディスクに戻す
ksofirqd - タスクレット

[root@vmlinux01 linux]# ps -aef | grep k
root 2 1 0 16:26 ? 00:00:00 [keventd]
root 3 1 0 16:26 ? 00:00:00 [kapmd]
root 4 1 0 16:26 ? 00:00:00 [ksoftirqd/0]
root 5 1 0 16:26 ? 00:00:04 [kswapd]
root 6 1 0 16:26 ? 00:00:00 [kscand]
root 8 1 0 16:26 ? 00:00:00 [kupdated]
root 17 1 0 16:26 ? 00:00:00 [kjournald]
root 529 1 0 16:27 ? 00:00:00 [kjournald]
root 984 1 0 16:27 ? 00:00:00 klogd -x
root 2923 2778 0 20:00 pts/0 00:00:00 grep k