接前一篇文章:Linux内核进程管理子系统有什么第四回 —— 进程进阶知识(下)
本文内容参考:
Linux内核进程管理专题报告_linux rseq-CSDN博客
《趣谈Linux操作系统 核心原理篇:第三部分 进程管理》—— 刘超
《图解Linux内核 基于6.x》 —— 姜亚华 机械工业出版社
特此致谢!
前几回讲了进程以及线程相关的背景知识。从本回开始,正式“下海”、进入内核源码的海洋,对于Linux内核中进程管理的相关源码进行详细解析。当然,其中也难免会涉及到与Linux内核其它子系统的交互,届时也会对于相关内容进行一定程度的讲解。
进程管理核心结构 —— task_struct
首当其冲的,绝对就应该是task_struct结构了,正所谓“为人不识task_struct,看尽内核亦白扯”。作为进程管理中最重要的核心数据结构,struct task_struct是必须首先认识并掌握、精通的。
不过,在开始认识task_struct结构之前,先要来认识她的一位“密友”,也可以说是task_struct结构的孪生姐妹 —— PCB。这就像追女孩一样,要想最终结识并成功拿下心仪的女神,得先从她身边的闺蜜或家人开始……
认识PCB
一提到PCB,我猜有人、尤其是做过硬件的人会说了:PCB我知道,不就是电路板么,全称是Printed Circuit Board,印刷电路板。您呐,这就属于张冠李戴了,此PCB非彼PCB。那么,这里的这个PCB代表什么呢?
此处的PCB,英文全称为Process Control Block,中文译为进程控制块。PCB是操作系统核心中的一种数据结构,通常是系统内存占用区中的一个连续存区,存放着操作系统用于描述进程的当前情况以及控制进程运行的全部信息。PCB的作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,或一个能与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。
场景示例如下:
- 当OS要调度某进程执行时,要从该进程的PCB中查出其现行状态及优先级。
- 在调度到某进程后,要根据其PCB中所保存的处理机状态信息,设置该进程恢复运行的现场,并根据其PCB中的程序和数据的内存起始地址,找到其程序和数据。
- 进程在执行过程中,当需要和与之合作的进程实现同步、通信或者访问文件时,也都需要访问PCB。
- 当进程由于某种原因而暂停执行时,又须将其断点的处理机环境保存在PCB中。
由此可见,在进程的整个生命期中,系统总是通过PCB对进程进行控制的,即系统是根据进程的PCB、而不是任何别的什么而感知到该进程的存在的。PCB是进程存在的唯一标志。
PCB通常记载进程的相关信息,一般包括:
- 程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整型数字
- 特征信息:一般分系统进程、用户进程、或者内核进程等
- 进程状态:可以是运行(Running)、就绪(Ready)、阻塞(Blocked)等,表示进程现的运行情况
- 优先级:表示获得CPU控制权的优先级大小
- 通信信息:进程之间的通信关系的反映
- 现场保护区:保护阻塞的进程用
- 资源需求、分配控制信息
- 进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
- 其它信息:工作单位,工作区,文件信息等
好了,关于task_struct结构的“姊妹”PCB就介绍到这里了。这一回先讲PCB的目的是:作个铺垫,先有个总体上的概念和印象。由于task_struct结构非常大,包含的成员非常多,如果不做这个铺垫,一上来直接看如此庞大的结构容易被“吓到”;另一方面,也是要让大家认识到struct task_struct和通常所说的Process Control Block基本上是一回事。
下一回正式来认识struct task_struct。