专栏名称: 刘超的通俗云计算
刘超,网易云解决方案首席架构师,代码级略懂OpenStack、Hadoop、Docker、Lucene、Mesos等开源软件,曾出版《Lucene应用开发揭秘》,个人博客可搜索popsuper1982。
目录
相关文章推荐
51好读  ›  专栏  ›  刘超的通俗云计算

图说Linux进程

刘超的通俗云计算  · 公众号  · 架构  · 2017-08-30 18:47

正文

进程在Linux里面最普通不过了,可是你知道在内核里面都有哪些数据结构吗?


一、进程链表


每个进程在内核里面对应如下的数据结构


struct task_struct {


所有的进程是串在一个列表上的,struct list_head tasks;


struct list_head {

struct list_head *next, *prev;

};


这是一个双向列表,列表头是struct task_struct init_task = INIT_TASK(init_task)的实例。


有的同学马上就明白了。对啊,在Linux系统启动的时候,会首先启动一个Init进程,Init进程会在/etc/inittab下面将Daemon程序启动,这些Daemon进程是Init进程的子进程。最后创建一个子进程运行tty,等待用户登录,成功登录后运行shell。


这Init进程的PID是1,ps命令就能看的。


但是这里的init_task却不是init进程,这个进程的PID是0,被称为idle进程,在这个结构后面链接的第一个tast_struct对应的才是init进程,PID为1.


一个进程往往有多个线程,不但进程对应一个task_struct,线程也在这链表里面。


二、进程状态


进程有状态volatile long state;



当一个进程创建的时候,初始化阶段,进程是处于TASK_UNINTERRUPTIBLE的状态,这个时候是不接受任何中断信号的。


一旦初始化完毕,进程就处于TASK_RUNNING的状态,处于这个状态不意味着进程已经在运行了,仅仅是放在队列中,等待内核调度它到CPU上,这个时候,这个进程除了等待CPU,不等待任何其他的资源或者事件。


终于轮到这个进程了,被内核Dispatch到某个CPU上,进程开始运行,但是状态还是TASK_RUNNING,并不改变,当运行完毕自己的时间片之后,进程被抢占,让出资源,回到队列,但是状态还是TASK_RUNNING。







请到「今天看啥」查看全文


推荐文章
国际家居  ·  高级灰沙发,想怎么搭就怎么搭!
7 年前
征集网  ·  5000元 张壁古堡重奖征集广告语
7 年前
文学投稿小助手  ·  【诗歌】小城四月
7 年前