之前总结知识的时候有个图是稍微有些问题的。task_struct 应该画在内核空间里面,我画在外面了。
每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux 内核的进程控制块是task_struct 结构体。之前有一篇笔记,这里是补充。https://ahoj.cc/2019/06/cjww8ru23006pzyo4vc40niei/
这个结构体大概 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╰)。