《进程是什么》一节讲到,操作系统负责管理所有进程,包括进程的创建和消亡、进程状态的转换以及分配和回收进程所需要的资源等等。操作系统管理和控制进程的过程,全部要借助进程控制块才能完成。
操作系统创建每个进程时,都会额外申请一块内存空间,用来存储、管理和控制该进程所需要的信息,例如:
- 进程名称或者 ID 号,作为该进程的标识;
- 当前进程的执行状态,进程在整个执行过程中可能处于开始、就绪、运行、等待或者终止这 5 种状态;
- 进程占用的各种资源,例如内存大小、使用的输入输出设备等等。
- 还记录了进程已经执行的时间,占用 CPU 的时间等等。
我们通常将这样的存储空间称为进程控制块(Process Control Block,简称 PCB)。
也就是说,进程控制块记录了进程当前运行情况以及所占资源的详细信息,并由操作系统负责管理和维护。操作系统中进程和进程控制块的数量始终是相等的,创建多少个进程就会相应产生多少个进程控制块。
进程控制块是进程存在的唯一标识,只有借助进程控制块,操作系统才能找到目标进程,进而实施管理和控制。当进程执行结束后,操作系统只需要释放相应进程控制块占用的内存空间,目标进程也随之消亡。
进程控制块的记录信息
不同的操作系统,进程控制块中记录的进程信息也略有差异,下表给大家列举了一些通常会被记录的进程信息。
进程信息 | 描 述 |
---|---|
进程 ID | 操作系统为每个进程都分配有唯一的 ID 号,方便识别各个进程。 |
进程状态 | 进程在执行期间可能处于开始、就绪、运行、等待、终止这 5 种状态。 |
程序计数器 | 记录进程要执行的下一条指令所在的地址。 |
CPU 寄存器 | 不同的计算机体系结构,寄存器的类型和数量也会不同,包括累加器、索引寄存器、堆栈指针等等。当进程发生中断时,进程的状态信息会和程序计数器一起保存,以便一段时间后,恢复该进程继续执行。 |
内存管理信息 | 包括进程所占用的内存大小,所在的页表和段表等信息。不同的操作系统所使用的内存系统也略有不同。 |
I/O 状态信息 | 分配给进程使用的输入、输出设备,以及进程可操作的文件等等。 |
其他信息 | 进程可用的 CPU 的数量、占用 CPU 的时间等等。 |
显然,进程控制块记录着与对应进程有关的大量信息,每个进程控制块都会占用一部分内存空间。因此,如果系统中的进程数量太多,则所有的进程控制块会占用较大的内存空间,影响计算机的运行效率。
有些操作系统为了减少进程控制块对内存的占用量,仅允许一部分进程信息常驻内存,其它信息则存储在硬盘中,当进程执行时,这些信息会和进程执行所需的数据一起移入内存。
进程控制块的组织方式
多任务操作系统中,可以同时执行多个进程,因此会产生多个进程控制块。这就引出一个问题,操作系统是如何组织和管理这些进程控制块的呢?
常见的组织方式有以下 3 种:
1) 线性表方式
和另外两种方式相比,这是最简单的一种组织进程控制块的方式。
线性表方式将所有进程控制块的首地址连续存储在一整块内存空间中,操作系统每次查找目标进程时,只需要遍历这张表,就可以找到相应的进程控制块,进而控制目标进程。
此方式只适用于系统中进程数量不多的情况。
2) 索引表方式
索引表方式可以看做是线性表方式的“改进版”,它根据当前各个进程不同的执行状态,分别建立就绪索引表、阻塞索引表等,如下图所示:
图 1 索引表组织进程控制块
和线性表一样,各个索引表中存放的也是各个进程控制块的首地址,不同之处在于,不同状态的进程控制块分散存储在不同的索引表内,一定程度上提高了操作系统查找目标进程的效率。
3) 链接表方式
链接表方式会将处于相同执行状态的进程控制块通过指针串联成一个链表,从而分别组建成就绪链表、阻塞链表等,如下图所示:
图 2 链接表组织进程控制块
操作系统只需要维护好指向各个链表的头指针,必要时可通过遍历指定链表的方式找到目标进程。