摘自 《C++多核高级编程》 5.6章节。
当执行进程时,操作系统将它指派到一个处理器上。进程将在一个时间片(quantum)内执行它的指令。进程时可抢占的,因此另外一个进程可以被指派到这个处理器上。操作系统调度器将进程、用户或系统的代码切换给另一个进程的代码,为每个进程执行提供指令的机会。进程可以分为系统进程和用户进程。
1)执行系统代码的进程被称为系统进程,有时候也被称为内核进程。系统进程用于管理整个系统。它们执行内部管理(housekeeping)任务,例如分配内存、在内部和二级存储器之间交换内存页面、检测设备等。它们还为用户进程执行任务,例如满足I/O请求、分配内存等
2)用户进程可执行它们自己的代码,有时候也会进行系统函数的调用。当一个用户进程执行它自己的代码时,它将处于用户模式。在用户模式下,进程不能够执行某些特权机器指令。当用户进程发出系统函数调用(例如,read()、write()或open())函数时,它将执行操作系统指令。用户进程将暂停,直到系统调用结束。处理器交给内核来完成系统调用。此时,我们说用户进程处于内核模式,不能够被任何用户进程抢占。
5.6.1 进程控制块
进程拥有一些用来标识它们病决定运行期间的行为的特性。内核维护数据结构并提供允许用户访问这些信息的系统函数。有些信息保存在进程控制块(process control block, PCB)中。PCB中保存的信息将向操作系统描述进程。PCB是进程的一部分。操作系统需要这些信息来管理每个进程。当操作系统在当前利用CPU的进程同另一个进程间进行切换时,它将当前执行进程的状态以及上下文保存到PCB的保存区中,这样当进程下一次被指派到CPU时可以重新启动。PCB可被操作系统的多个模块读取和更改。设计监视操作系统性能、调度、资源分配和中断处理的模块都会访问和、或更改PCB。通过PCB,使得进程对操作系统可见,而类似用户线程的实体对操作系统不可见。
PCB中的信息包括:
1)进程的当前状态和优先级
2)进程标识符、父进程标识符、子进程标识符
3)指向已分配资源的指针
4)指向进程内存位置的指针
5)指向进程的父进程和子进程的指针
6)进程所使用的处理器
7)控制和状态寄存器
8)栈指针
PCB中保存的信息可以按照如下方式来组织:
1)同进程控制相关的信息,例如进程的当前状态和优先级、指向父子PCB的指针、指向已分配资源和内存的指针。还包括与进程间通信(IPC)相关的任何调度相关的信息、进程权限、标志、消息和信号。操作系统需要进程控制信息,从而能够协调并发的活动进程。
2)与处理器状态相关的用户上下文、控制、状态寄存器和栈指针。当进程运行时,信息被置于CPU的寄存器中。一旦操作系统决定切换到另一个进程,这些寄存器总的所有信息都被必须被保存下来。当进程再次获得对CPU的使用权时,这些信息将被恢复。
3)同进程标识符相关的其他信息。这包括进程ID和父进程ID。这些标识数字对于每个进程是唯一的,它们时正整数。
5.6.2 进程的剖析
进程的地址空间分为3个逻辑段:代码段、数据段、栈段。下图显示了进程的逻辑布局。地址空间的底部是代码段,这段包含被称作程序代码的待执行指令。位于代码段之上的数据段包含该进程的被初始化的全局变量、外部变量和静态变量。栈段包含分配的局部变量和传递给函数的参数。由于进程既可以进行系统函数调用,也可以进行用户定义函数调用,所以在栈段中维护着两个栈,分别时用户栈和内核栈。当发起函数调用时,会构建一个栈帧,根据进程处于用户模式还是内核模式,将栈帧放置到用户栈或内核栈。栈段的增长方式时向下朝着数据段。当函数返回时,栈帧从栈中弹出。代码段、数据段和栈段以及进程控制块共同构成了进程映像(process image).
进程的地址空间可以时虚拟的。虚拟存储使得在执行的进程中引用的地址同内部内存中的实际可用地址是无关的。这使得可寻址的存储空间远远大于实际内存大小。进程的虚拟地址空间的段时连续的内存块。每个段以及物理地址空间被分成被称为页(page)的区块(chunk)。每个页有着唯一的页帧号(page frame number)。虚拟页帧号(virtual page frame number, VPFN)用作进程页表中的索引。页表中的每一项中包含物理页帧号,这样将虚拟页帧映射到物理页帧。如下图所示,虚拟地址空间时连续的,但可以以任何顺序映射到物理页面。
虽然每个进程的虚拟地址空间都是受到保护,以防止其他进程访问它,但是进程的代码段可以在多个进程之间共享。上图中还显示了两个进程如何共享相同的程序代码。相同的页帧号保存在两个进程的页表的表项中。如上图所示,进程A的虚拟页帧0映射到物理页帧5,而进程B的虚拟页帧2也映射到物理页帧5.
操作系统为了保护管理保存在内存中的所有进程,它将创建并维护进程表。实际上,操作系统还有一个表,内容包括它所管理的所有实体。要知道操作系统不仅管理进程,而且还管理所有的计算机资源,包括设备、内存和文件。有些内存、设备和文件时为了用户进程二管理的。这些信息会在将资源分配给进程时被引用到PCB中。内存中的每个进程映像在进程表中均有一个条目,如下图所示。每个条目包含进程id和父进程id,实际有效用户id和组id,未决信号列表,代码段、数据段和栈段的位置。进程的当前状态。当操作系统需要访问一个进程时,会在进程表中查找该进程,然后再在内存中定位进程映像。