如果你执行 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
文件系统不包含这些进程的命令行信息。
那么这些内核守护进程是用来做什么的呢?本文档的早期版本曾请求帮助,因为我对内核守护进程了解不多。以下部分内容是从对该请求的各种回复中拼凑而成的,对此我非常感激。非常欢迎进一步的线索、参考资料和更正!
输入和输出是通过内存中的缓冲区完成的。这使得事情运行得更快。程序写入的内容可以保存在内存中的缓冲区中,然后以更大、更高效的块写入磁盘。守护进程 kflushd
和 kupdate
处理这项工作:kupdate
定期运行(5 秒?),以检查是否有任何脏缓冲区。如果有,它会调用 kflushd
将它们刷新到磁盘。
进程通常没有什么事情可做,而正在运行的进程通常不需要将其所有代码和数据都放在内存中。这意味着我们可以更好地利用我们的内存,通过将运行程序中未使用的部分移出到硬盘的交换分区中。根据需要将这些数据移入和移出内存的工作由 kpiod
和 kswapd
完成。大约每秒一次,kswapd
会唤醒并检查内存状况,如果磁盘上的某些内容需要在内存中,或者可用内存不足,则会调用 kpiod
。
如果你的内核配置了自动电源管理,那么你的系统上可能还会运行一个 kapmd
守护进程。
程序 update
允许你配置 kflushd
和 kswapd
。尝试 update -h
获取一些信息。
交换空间通过 swapon
命令开启,通过 swapoff
命令关闭。init 脚本(/etc/rc.sysinit
或 /etc/rc.d/rc.sysinit
)通常在系统启动时调用 swapon
。我听说 swapoff
对于笔记本电脑节省电量很有用。
执行 update -d
,注意最后一行关于“缓冲区自相残杀阈值”的喋喋不休。现在这是一个有趣的概念,去调查一下!
将目录更改为 /proc/sys/vm
并 cat
那里的文件。看看你能弄明白什么。
Linux 文档项目的 “The Linux Kernel”(参见 The Linux Kernel 部分的 URL)
Linux 内核源代码,如果你足够勇敢的话!kswapd
代码在 linux/mm/vmscan.c
中,kflushd
和 kupdate
在 linux/fs/buffer.c
中。