task_struct

[toc]

阅前提示:本文来自《LINUX内核设计与实现》第三章内容总结,如有不足和错误,请在评论区告诉我

task_struct结构体

task_struct 被称为进程描述符,它定义在<linux/sched.h>文件中,进程描述符中包含一个具体进程的所有信息

进程描述符中包含的数据能完整的描述一个正在执行的程序:程序打开的文件,进程的地址空间,挂起的信号,进程的状态,等等

image-20220306151727315

分配进程描述符

Linux通过slab分配器分配 stak_struct 结构,目的是为了达到对象复用和缓存着色(注:通过预先分配和重复使用 task_struct,可以避免动态分配和释放所带来的资源消耗)。每个进程的 task_struct 存放在它们内核栈的栈尾。

image-20220306154628782

slab分配器在栈底(对于向下增长的栈来说)或栈顶(对于向上增长的栈来说)创建一个新的结构 struct thread_info,此结构中的 task域中存放指向该任务实际 task_struct的指针,以方便在汇编代码中计算其偏移。

image-20220306154716090

进程描述符的存放

内核通过一个唯一的进程标识符(process identification value)或 PID 来表示每个进程。PID是一个最大默认值为 32768 的 int型数。它被存放在各自的进程描述符中。

进程状态

进程描述符中的 state域描述了进程的当前状态,该域的值:

状态标志(域值)说明
TASK_RUNNING运行,表示进程是可执行的;它或者正在执行,或者在运行队列中等待执行
TASK_INTERRUPTIBLE可中断,进程被阻塞,等待某些条件达成,一旦条件满足,进程就被唤醒,切换为运行状态
TASK_UNINTERRUPTIBLE不可中断,进程不会因为接收到信号而被唤醒切换为运行
TASK_ZOMBIE僵死,该进程已经结束了,但其父进程还没有释放其所获得的资源
TASK_STOPPED停止,进程没有投入运行,也不能投入运行

image-20220306160507272