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
デーモンが走っているかもしれない。
update
プログラムを使えば、kflushd
と kswapd
を
設定することができる。コマンド update -h
を使えば詳しい情報が
表示される。
スワップ空間は、swapon
コマンドで有効になり、swapoff
コマンドで無効になる。初期化スクリプト(/etc/rc.sysinit
もしくは
/etc/rc.d/rc.sysinit
)は、通常、システム起動時に swapon
を
呼び出す。swapoff
は、ラップトップ上での消費電力節約のために有効で
あるそうだ。
update -d
と打ち、表示された行の最後に「兄弟バッファ殺し
の閾値(threshold for buffer fratricide)」と書かれていることに注目せよ。
面白そうな概念である。調べてみよう!
/proc/sys/vm
ディレクトリに行き、そこにあるファイルの内容を cat
で出力し、出力結果を見ること。
Linux Documentation Project の "The Linux Kernel" ( URL については、 ここを見ること。)
勇気ある読者は、Linux カーネルのソースコードを読むこと。
kswapd
のコードは、linux/mm/vmscan.c
にあり、
kflushd
と kupdate
のコードは linux/fs/buffer.c
にある。