下一页 上一页 目录

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 是进程号为 1 的进程。进程 2、3、4 和 5 分别是 kflushd、kupdate、kpiod 和 kswapd。这里有些奇怪的地方:请注意,在虚拟存储大小 (SIZE) 和实际存储大小 (RSS) 列中,这些进程都显示为零。一个进程怎么可能不使用任何内存呢?

这些进程是内核守护进程。大部分内核根本不会在进程列表中显示,你只能通过从系统内存总量中减去可用内存来计算出它使用的内存量。内核守护进程在 init 之后启动,所以它们像普通进程一样获得进程号。但是它们的代码和数据存在于内核的内存区域中。

命令列中的条目用括号括起来,因为 /proc 文件系统不包含这些进程的命令行信息。

那么这些内核守护进程是用来做什么的呢?本文档的早期版本曾请求帮助,因为我对内核守护进程了解不多。以下部分内容是从对该请求的各种回复中拼凑而成的,对此我非常感激。非常欢迎进一步的线索、参考资料和更正!

输入和输出是通过内存中的缓冲区完成的。这使得事情运行得更快。程序写入的内容可以保存在内存中的缓冲区中,然后以更大、更高效的块写入磁盘。守护进程 kflushdkupdate 处理这项工作:kupdate 定期运行(5 秒?),以检查是否有任何脏缓冲区。如果有,它会调用 kflushd 将它们刷新到磁盘。

进程通常没有什么事情可做,而正在运行的进程通常不需要将其所有代码和数据都放在内存中。这意味着我们可以更好地利用我们的内存,通过将运行程序中未使用的部分移出到硬盘的交换分区中。根据需要将这些数据移入和移出内存的工作由 kpiodkswapd 完成。大约每秒一次,kswapd 会唤醒并检查内存状况,如果磁盘上的某些内容需要在内存中,或者可用内存不足,则会调用 kpiod

如果你的内核配置了自动电源管理,那么你的系统上可能还会运行一个 kapmd 守护进程。

8.1 配置

程序 update 允许你配置 kflushdkswapd。尝试 update -h 获取一些信息。

交换空间通过 swapon 命令开启,通过 swapoff 命令关闭。init 脚本(/etc/rc.sysinit/etc/rc.d/rc.sysinit)通常在系统启动时调用 swapon。我听说 swapoff 对于笔记本电脑节省电量很有用。

8.2 练习

执行 update -d,注意最后一行关于“缓冲区自相残杀阈值”的喋喋不休。现在这是一个有趣的概念,去调查一下!

将目录更改为 /proc/sys/vmcat 那里的文件。看看你能弄明白什么。

8.3 更多信息

Linux 文档项目的 “The Linux Kernel”(参见 The Linux Kernel 部分的 URL)

Linux 内核源代码,如果你足够勇敢的话!kswapd 代码在 linux/mm/vmscan.c 中,kflushdkupdatelinux/fs/buffer.c 中。


下一页 上一页 目录