task_struct
[toc]
阅前提示:本文来自《LINUX内核设计与实现》第三章内容总结,如有不足和错误,请在评论区告诉我
task_struct结构体
task_struct 被称为进程描述符,它定义在<linux/sched.h>文件中,进程描述符中包含一个具体进程的所有信息。
进程描述符中包含的数据能完整的描述一个正在执行的程序:程序打开的文件,进程的地址空间,挂起的信号,进程的状态,等等
分配进程描述符
Linux通过slab分配器分配 stak_struct 结构,目的是为了达到对象复用和缓存着色(注:通过预先分配和重复使用 task_struct,可以避免动态分配和释放所带来的资源消耗)。每个进程的 task_struct 存放在它们内核栈的栈尾。
slab分配器在栈底(对于向下增长的栈来说)或栈顶(对于向上增长的栈来说)创建一个新的结构 struct thread_info,此结构中的 task域中存放指向该任务实际 task_struct的指针,以方便在汇编代码中计算其偏移。
进程描述符的存放
内核通过一个唯一的进程标识符(process identification value)或 PID 来表示每个进程。PID是一个最大默认值为 32768 的 int型数。它被存放在各自的进程描述符中。
进程状态
进程描述符中的 state域描述了进程的当前状态,该域的值:
状态标志(域值) | 说明 |
---|---|
TASK_RUNNING | 运行,表示进程是可执行的;它或者正在执行,或者在运行队列中等待执行 |
TASK_INTERRUPTIBLE | 可中断,进程被阻塞,等待某些条件达成,一旦条件满足,进程就被唤醒,切换为运行状态 |
TASK_UNINTERRUPTIBLE | 不可中断,进程不会因为接收到信号而被唤醒切换为运行 |
TASK_ZOMBIE | 僵死,该进程已经结束了,但其父进程还没有释放其所获得的资源 |
TASK_STOPPED | 停止,进程没有投入运行,也不能投入运行 |