一. 进程控制块
为了描述和控制进程的运行,系统为每个进程定义了一个
数据结构——进程控制块(PCB)。 它是进程重要的组成部分,它记录了操作系统所需的、用于描述进程的当前状态和控制进程的全部信息。 操作系统就是根据进程的PCB来感知进程的存在,并依此对进程进行管理和控制。 PCB是进程存在的唯一标识。
PCB主要包括如下4方面的信息
1. 进程标识信息
进程标识信息用于唯一地标识一个进程,一个进程通常有两种标识符:内部标志符&外部标识符。
- 内部标志符: 由操作系统赋予每个进程的
一个唯一的数字标识符,它通常为一个进程的序号,方便了系统使用。
- 外部标识符: 由创建者产生,是由字母和数字组成的字符串,为用户进程访问该进程提供方便。
为了描述进程间的家族关系,通常还设有父进程标识和子进程标识,以表示进程间的家族关系。
此外,还设有用户名或用户标识号表示该进程属于哪个用户。
2. 处理机状态
处理机状态信息主要由处理机的各个寄存器内的信息组成。
进程运行时的许多信息均存放在处理机的各种寄存器中。其中程序状态字(PSW)是相当重要的,处理机根据程序状态寄存器中的PSW来控制程序的运行。
3. 进程调度信息
PCB中还存放着一些与进程调度有关的信息。
- 进程状态。 标识进程的当前状态(就绪、运行、阻塞),作为进程调度的依据。
- 进程优先级。 表示进程获得处理机的优先程度。
- 为进程调度算法提供依据的其他信息。例如,进程等待时间、进程已经获得处理器的总时间和进程占用内存的时间等。
- 事件。 是指进程由某一状态转变为另一状态所等待发生的事件。(比如等待I/O释放)
4. 进程控制信息
- 程序和数据地址。 是指组成进程的程序和数据所在内存或外存中的首地址,以便在调度该进程时能从其PCB中找到相应的程序和数据。
- 进程同步和通信机制。 指实现进程同步和通信时所采取的机制,如消息队列指针和信号量等,他们可以
全部或部分存在PCB中。
- 资源清单。 列出了
进程所需的全部资源 及
已经分配给该进程的资源,但不包括CPU.
- 链接指针。它给出了
处于同一队列中的下一个PCB的首地址。
总结:
对于多道程序环境,
系统中通常存在多个PCB,这些PCB有的已经被占用,有的处于空闲状态。为了方便对这些PCB的查找,通常采用链表或索引将PCB管理起来。 无论采用哪种管理方式,均是
将具有相同状态进程的PCB组成一个队列,或是
根据进程进入该状态的原因将其组成一个队列,并
设置相应的队首指针,这样就可以非常方便的访问各个进程的PCB。
总之,系统因 PCB 而感知进程的存在,并通过 PCB 来对进程进行调度、控制、分配资源。 若进程执行结束,则通过释放 PCB 来释放进程所占有的各种资源。
一. 进程上下文与上下文切换
1. 进程上下文
进程是在操作系统支持下执行的,进程执行时需要操作系统为其设置相应的执行环境,如系统堆栈、地址映像寄存器、程序计数器、程序状态字、打开文件表以及相关通用寄存器等。 所以,把
进程的物理实体与支持进程执行的物理环境合称为进程上下文。
- 上文: 把
已执行的进程指令和数据在
相关寄存器与堆栈中的内容称为上文。
- 正文: 把正在执行的
进程指令和数据在相关寄存器与堆栈中的内容称为正文。
- 下文: 把待执行的
进程指令和数据在相关寄存器与堆栈中的内容称为下文。
Unix System Ⅴ 的进程上下文组成:由用户级上下文、寄存器上下文、系统级上下文组成。
- 用户级上下文:由进程的用户程序段部分编译而成的用户正文段、用户数据和用户栈等组成。
- 寄存器上下文:由程序计数器(PC)、处理机状态字(PS)、栈指针和通用寄存器组成。 PC给出CPU将要执行的下一条指令的虚地址;PS给出机器与该进程相关联时的硬件状态;栈指针指向下一项的当前地址;通用寄存器则用于不同执行模式之间的参数传递。
- 系统级上下文又分为静态部分和动态部分。 这里的动态部分是指进入和退出不同的上下文层次时,系统为各层上下文中相关联的寄存器值所保存和恢复的记录。 系统级上下文静态部分包括PCB结构、将进程虚地址空间映射到物理空间的有关表格、核心栈等。
这里,核心栈主要用来装载进程中所使用的系统调用的调用序列。
系统级上下文的动态部分是与寄存器上下文相关联的。
进程上下文的层次概念主要体现在动态部分中,即系统级上下文的动态部分可看成是由一些数量变化的层次组成,其变化规则符合许先进后出的堆栈方式。
2. 进程上下文切换
进程上下文切换发生在不同的进程之间而不是同一个进程内。
进城上下文切换分成三个步骤:
(1) 把被切换进程的相关信息保存到有关存储区,例如该进程的PCB中。
(2) 操作系统中的调度和资源分配程序执行,选取新的进程。
(3) 将
被选中进程的原来保存
的正文部分从有关存储区中
取出,并
送至寄存器与堆栈中,激活被选中进程执行。
总结: 进程上下文切换的切换过程涉及由谁来保护和获取进程的正文的问题,也就是如何使寄存器和堆栈等中的数据流入流出 PCB 的存储区。 另外,进程上下文切换还涉及系统调度和分配程序,这些都比较耗费CPU时间。