HaiPeng(lzuzhp@gmail.com)
一台PC机,CPU是核心,对于操作系统,管理CPU的那部分便是OS的核心,这就是进程管理,我就认为“得进程管理者得linux内核”,OS的其他资源(内存、磁盘、网络等)都要提供该该资源的操作函数来供进程来使用。
打印内核中的所有进程
通过ulk我们知道,linux内核的所有进程是通过双向链表串在一起的,而且每一个进程都有一个进程描述符来代表(其实就是一个结构体struct,只不过内核中的结构体贼多,而且进程的结构体又常用,所以就给它另外起了个名字),这个描述符就是struct task_struct,该结构体包含了一百多个元素,就像人(一个进程代表一个人,内核中有很多进程,就像一个工厂)一样是由很多部分组成的,解剖的时候当然想知道每一个人每一个部分的状态,为了达到我们的目地,我们继续读ulk(目前我认为只要自己想到的,前人一定做过了),发现3.2.2.4专门是将进程中的双向链表的,for_each_process便可以获得内核中的每一个进程,但是怎么用这个宏呢?查看内核源代码(使用sourceinsight即可),看看内核是怎么使用的,内核函数check_for_tasks使用了该宏,原来很简单,只需要定义一个struct task_struct *p的结构体指针便可以啦。但是如何写代码呢,我的方法是使用systemtap的embedded c,这是目前我找到的效率最高的方法啦。使用systemtap写的脚本语言如下:
1//process_list.stp
2 %{
3 #include <linux/list.h>
4 #include <linux/sched.h>
5 %}
6 function process_list ()
7 %{
8 struct task_struct *p;
9 struct list_head *_p,*_n;
10 for_each_process(p){
11
12 _stp_printf("%-15s (%-5d)\n",p->comm,p->pid);
13 }
14 %}
15 probe begin
16 {
17 process_list();
18 exit()
19 }
运行的时候使用命令:sudostap –gv process_list.stp便可以看到你的内核中的所有进程啦。输出结果(部分):
Pass 5: starting run.
init (1 )
kthreadd (2)
ksoftirqd/0 (3 )
migra