如果你尝试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 and kswapd。这里有一件很奇怪的事:你会注意到虚拟占用(SIZE)和实际占用(RSS)列都是0,进程怎么会不使用内存呢?
这些进程就是内核守护进程。大部分内核并不显示在进程列表里,你只能通过做减法的方式来了解内核用了多少内存。守护进程在init之后启动,所以他们和其他进程一样有进程ID,但是他们的代码和数据都存放在内核占有的内存中。
守护进程带有括号,因为/proc文件系统不包含这些进程的命令行信息。There are brackets around the entries in
the command column because the /proc
filesystem does not contain
command line information for these processes.
那么守护进程是用来干吗的呢?这个文章以前的版本曾经请求大家帮助,由于我对守护进程了解不多,下面部分是由从网友回复的内容中综合而来的。欢迎发来更多的线索,参考,订正!
输入和输出是通过内存中的缓冲来完成的,这让事情变得更快,程序的写入会存放在内存缓冲中,然后再一起写入硬盘。守护进程kflushd和kupdate管理这些工作。kupdate间断的工作(每5秒?)来检查是否有写过的缓冲,如过有,就让kflushd把它们写入磁盘。
进程有时候无事可做,当他运行时也不一定需要把所有的代码和数据都放在内存中。这意味着我们可以通过把运行中程序不用的内容切换到交换分区来更好的是用内存。把这些数据移入/移出内存通过kpiod和kswapd,大约每隔1秒,kswapd醒来并检查内存情况。如果在硬盘的东西要读入内存,或者内存可用空间不足。kpiod就会被调用。
kapmd也可能在你的系统中运行,如果你在内核中配置过自动电源管理。
update程序可以让你配置Kflushd和kswapd,尝试update -h获得更多信息。
交换空间由swapon打开,由swapoff关闭。init脚本(/etc/rc.sysinit 或/etc/rc.d/rc.sysinit)通常会在启动时调用swapon。我听说swapoff可以为笔记本电脑省不少电。
运行update -d,留心关于“threshold for buffer fratricide”的讨论,这是个有趣的概念,深入调查一下。
到/proc/sys/vm 并用cat来看看里面的文件,你能发现什么?
Linux文件工程(LDP)的“The Linux Kernel”(看The Linux Kernel 的相关部分)
Linux内核源代码,如果你胆子够大!kswapd的代码在linux/mm/vmscan.c,kflushd和kupdate在 linux/fs/buffer.c里。