次のページ 前のページ 目次へ

8. カーネルデーモン

ps aux コマンドを実行すると、以下に示すようなものが現れる。

USER      PID %CPU %MEM  SIZE   RSS TTY STAT START   TIME COMMAND
root        1  0.1  8.0  1284   536   ? S    07:37   0:04 init [2] 
root        2  0.0  0.0     0     0   ? SW   07:37   0:00 (kflushd)
root        3  0.0  0.0     0     0   ? SW   07:37   0:00 (kupdate)
root        4  0.0  0.0     0     0   ? SW   07:37   0:00 (kpiod)
root        5  0.0  0.0     0     0   ? SW   07:37   0:00 (kswapd)
root       52  0.0 10.7  1552   716   ? S    07:38   0:01 syslogd -m 0 
root       54  0.0  7.1  1276   480   ? S    07:38   0:00 klogd 
root       56  0.3 17.3  2232  1156   1 S    07:38   0:13 -bash 
root       57  0.0  7.1  1272   480   2 S    07:38   0:01 /sbin/agetty 38400 tt
root       64  0.1  7.2  1272   484  S1 S    08:16   0:01 /sbin/agetty -L ttyS1
root       70  0.0 10.6  1472   708   1 R   Sep 11   0:01 ps aux 

上記はシステム上で動いているプロセスのリストである。これらの情報は、前章で説明 した /proc ファイルシステムから取得される。init のプロセス ID が 1 であることに注意してほしい。プロセス ID の 2,3,4 と 5 は、それぞれ kflushd, kupdate, kpiod, そして kswapd である。しかしこれには奇妙な点がある。仮想ストレージサイズ(SIZE)とリアルスト レージサイズ(RSS)の行に注目すると、これらのプロセスのサイズはゼロとなっている。 プロセスがメモリを消費しないことが起こりうるだろうか?

これらのプロセスは、カーネルデーモンである。カーネルの大部分はプロセス リストには現れないので、それらが消費するメモリの量を割り出すには、システムの 総メモリ量から利用可能なメモリ量を引いて計算するしかない。カーネルデーモンは、 init の後で起動されるため、通常のプロセスと同様にプロセス番号を持つ。 しかし、それらのコードとデータは、カーネル用のメモリ領域に置かれる。

上記の表では COMMAND の行に丸カッコがついているエントリがあるが、 これは、/proc ファイルシステムに、それらのプロセスのコマンドライン 情報が含まれていないからである。

では、カーネルデーモンは何のためにあるのか? わたしはカーネルデーモンについて ほとんど知らなかったので、今回の改訂版を出すまで、その点に関し、この文書では 読者からの教えを請うていた。以下の断片的な説明は、読者からの様々な返答を つなぎ合わせたものであり、疑問に答えてくれたひとたちには非常に感謝している。 より詳しい手がかりや参照先、この文の訂正なども引き続き歓迎している。

入力と出力は、メモリ内の buffers 経由で行われる。実行速度を上げる ためである。プログラムの出力は一旦メモリに、つまりバッファに蓄えられ、その後で より安価で大容量を実現できるディスクに書き込まれる。kflushd と kupdate デーモンは、この処理を担当している。kupdate は、 定期的に(5 秒ごとに?)書き込まれたバッファ(dirty buffer)がないかチェック する。そうしたバッファがある場合、kflushd を呼び出して、それを ディスクに書き込ませる。

プロセスは、何もしていない状態になることがしばしばあり、実行中のプロセスと いえどもそのコードとデータ全部をメモリ内に置く必要があるわけではない。すなわ ちこれは、実行中のプロセスの使用されていない部分を、ハードディスクのスワップ パーティションに移すことで、メモリを有効利用できることを意味する。 必要に応じてそうしたデータをメモリから出し入れする処理は、kpiod と kswapd によって行われる。ほぼ毎秒、kswapd が起動し、 メモリの状態をチェックする。そして、ディスクに書き出された情報をメモリに 戻す必要があったり、空きメモリの量が不足していたりする場合、kpiod が呼び出される。

また、カーネルに省電力機能を組み込んでいる場合は、システム上で kapmd デーモンが走っているかもしれない。

8.1 設定

update プログラムを使えば、kflushd と kswapd を 設定することができる。コマンド update -h を使えば詳しい情報が 表示される。

スワップ空間は、swapon コマンドで有効になり、swapoff コマンドで無効になる。初期化スクリプト(/etc/rc.sysinit もしくは /etc/rc.d/rc.sysinit)は、通常、システム起動時に swapon を 呼び出す。swapoff は、ラップトップ上での消費電力節約のために有効で あるそうだ。

8.2 演習

update -d と打ち、表示された行の最後に「兄弟バッファ殺し の閾値(threshold for buffer fratricide)」と書かれていることに注目せよ。 面白そうな概念である。調べてみよう!

/proc/sys/vm ディレクトリに行き、そこにあるファイルの内容を cat で出力し、出力結果を見ること。

8.3 参考文献等

Linux Documentation Project の "The Linux Kernel" ( URL については、 ここを見ること。)

勇気ある読者は、Linux カーネルのソースコードを読むこと。 kswapd のコードは、linux/mm/vmscan.c にあり、 kflushd と kupdate のコードは linux/fs/buffer.c にある。


次のページ 前のページ 目次へ