Linux系统/proc进程相关接口
Linux内核提供了接口供用户查看系统信息,常见的接口都在/proc和/sys路径下,本人主要介绍进程相关的接口
1 /proc接口的内核实现
1.1 /proc/cpuinfo
这个接口可查看当前系统的cpu核信息,知道我们有几个cpu,是否所有cpu都可用,以这个接口为例说明/proc路径下接口的内核实现。
Linux内核有个接口函数proc_create用于创造/proc路径下的接口,直接调用这个接口就能创造用户态接口:

如上图,内核创造了一个/proc/cpuinfo接口,当我们使用cat 命令查看该接口时,内核会走到cpuinfo_open,然后进入到cpuinfo_op中的c_show,我们再看c_show的实现:

上图中可知,内核逐一编译每个cpu,获取cpu信息,然后在用户终端打印。
从上面的示例我们可以看出,每个/proc路径下的接口都是通过proc_create创造的,有自己独立的xxx_proc_ops,通过这个xxx_proc_ops中的函数就能获取指定的信息。
2 /proc/stat
这个接口可查看cpu资源占用总体情况,top命令就是通过查看这个接口信息并现实的,我们具体看它的内核实现,下图是接口显示示例(top命令实际读取的就是/proc/stat和/proc/pid/stat接口内容):

/proc/stat接口代码实现如下图(在fs/proc/stat.c中):

如上图,关键实现在show_stat中,/proc/stat接口打印的cpu信息内容解释如下:
| user | 用户级进程运行时间 |
| nice | 优先级较低的进程运行时间 |
| system | 内核级进程运行时间 |
| idle | CPU空闲时间 |
| iowt | CPU等待输入输出完成时间 |
| irq | 处理中断时间 |
| softirq| 软中断时间 |
| steal | 虚拟CPU等待真实CPU运行时间 |
| guest | 虚拟CPU运行时间 |
| guest_nice | 优先级较低的虚拟CPU运行时间 |
对应代码如下:

如上图可知,内核使用cpustat数组存储各个cpu状态的时间,show_stat只是将已经统计好的数值打印出来,关键看内核如何统计这些时间?

如上图所示,update_process_times函数的注释已说明,会在定时器中断中被调用,如果是用户态就更新user时间,否则更新system时间。传参user_tick标记了是user还是system?

account_process_tick函数关键代码如上图。
我们再看中断的时间,在进入和离开中断的时候统计,如下图:

由此可知,Linux内核cpu在各个状态切换时,会记录下时间并进行累计统计,得出最终结果。当然,以上并未罗列出全部的统计时机,只梳理逻辑。
扩展:/proc/$pid/stat这个接口显示了$pid进程占用的资源信息,内核实现与/proc/stat相似,此处不再细讲。
浙公网安备 33010602011771号