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