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

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

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

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

8.1 設定

update プログラムを使えば、kflushdkswapd を 設定することができる。コマンド 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 にあり、 kflushdkupdate のコードは linux/fs/buffer.c にある。


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