进程在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。