进程数据结构

在 Linux 里面,无论是进程还是线程,到了内核里面,我们统一都叫任务 task ,由一个统一的结构 task_struct 进行管理;内核中通过链表串起 task_struct
.
任务 ID
task_struct 里面涉及任务 ID 的,有 pid tpid 和 group_leader:
任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。
但是,如果一个进程创建了其他线程,那就会有所变化了。线程有自己的 pid,tgid 就是进程的主线程的 pid,group_leader 指向的就是进程的主线程。
任务状态
在运行中的进程,一旦要进行一些 I/O 操作,需要等待 I/O 完毕,这个时候会释放 CPU,进入睡眠状态。
在 Linux 中,有两种睡眠状态。
一种是TASK_INTERRUPTIBLE,可中断的睡眠状态这是一种浅睡眠的状态,也就是说,虽然在睡眠,等待 I/O 完成,但是这个时候一个信号来的时候,进程还是要被唤醒。只不过唤醒后,不是继续刚才的操作,而是进行信号处理。当然程序员可以根据自己的意愿,来写信号处理函数,例如收到某些信号,就放弃等待这个 I/O 操作完成,直接退出,也可也收到某些信息,继续等待。
另一种睡眠是TASK_UNINTERRUPTIBLE,不可中断的睡眠状态。这是一种深度睡眠状态,不可被信号唤醒,只能死等 I/O 操作完成。一旦 I/O 操作因为特殊原因不能完成,这个时候,谁也叫不醒这个进程了。你可能会说,我 kill它呢?别忘了,kill 本身也是一个信号,既然这个状态不可被信号唤醒,kill 信号也被忽略了。除非重启电脑,没有其他办发。
一种新的进程睡眠状态,TASK_KILLABLE 可以终止的新睡眠状态。进程处于这种状态中,它的运行原理类似 TASK_UNINTERRUPT,只不过可以响应致命信号。

猜你喜欢

转载自www.cnblogs.com/JaPer/p/10853513.html