之前总结知识的时候有个图是稍微有些问题的。task_struct 应该画在内核空间里面,我画在外面了。

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux 内核的进程控制块是task_struct 结构体。之前有一篇笔记,这里是补充。https://ahoj.cc/2019/06/cjww8ru23006pzyo4vc40niei/

task_struct的位置

这个结构体大概 400 多行。。。好大啊🙄。

这个结构体中有以下内容(找资料弄得,不全,后面看到了再补上):

进程id,系统中每个进程有唯一的 id,在 C 语言中用 pid_t 表示,pid_t 是 typedef 的,本质是一个 unsigned int。

进程状态,有init、就绪、运行、挂起、停止等状态。

上下文,进程切换时候需要保存和恢复的一些 CPU 寄存器。

虚拟地址-物理地址映射表

描述控制终端的信息,运行 ps 后 TTY 那一列。

当前进程的工作目录,每个进程的工作目录可能是不一样的,所以要记录一下。

umask掩码

文件描述符表,包含很多指向 file 结构体的指针。

和信号相关的信息

用户 id 和组 id

会话(Session)和进程组。

进程可以使用的资源上限(resource limit)。ulimit -a (╯3╰)。