解剖linux内核之进程

本文详细介绍了Linux内核中的进程管理,包括如何通过内核结构体`struct task_struct`遍历所有进程,使用systemtap脚本语言打印进程信息,以及探讨了namespace的概念并提供了验证其功能的实验。此外,还展示了通过systemtap监测进程切换频率的方法,并讨论了内核函数参数传递的方式。
摘要由CSDN通过智能技术生成

      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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值