现代操作系统学习第2章 — 进程与线程

2.1 进程

伪并行:严格的说,在一瞬间,CPU只能运行一个进程,但是在多道程序设计系统中,每个进程各运行几十或几百毫秒,那一秒内CPU就可以同时运行多个进程,给人产生了并行的错觉。

进程模型

一个进程就是一个正在执行程序的实例, 包括程序计数器、 寄存器和变量的当前值。

在任何一个给定的瞬间仅有一个进程真正在运行。

一个进程是某种类型的一个活动, 它有程序、输入、 输出以及状态。 单个处理器可以被若干进程共享, 它使用某种调度算法决定何时停止一个进程的工作, 并转而为另一个进程提供服务。

进程创建与终止

有4种主要事件导致进程的创建:

1)系统初始化。

2)执行了正在运行的进程所调用的进程创建系统调用。

3)用户请求创建一个新进程。

4)一个批处理作业的初始化。

迟早新的进程会终止, 通常由下列条件引起:

1)正常退出(自愿的)

2)出错退出(自愿的)

3)严重错误(非自愿)

4)被其他进程杀死(非自愿)

进程的层次结构

当进程创建了另一个进程后, 父进程和子进程就以某种形式继续保持关联。 子进程自身可以创建更多的进程, 组成一个进程的层次结构。 进程只有一个父进程,但是可以有零个、 一个、 两个或多个子进程。

在UNIX中, 进程和它的所有子女以及后裔共同组成一个进程组。当用户从键盘发出一个信号时, 该信号被送给当前与键盘相关的进程组中的所有成员。

Windows中没有进程层次的概念, 所有的进程都是地位相同的。 惟一类似于进程层次的暗示是在创建进程的时侯, 父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程。 但是, 它有权把这个令牌传送给某个其他进程, 这样就不存在进程层次了。

进程的状态

可以看到显示进程的三种状态的状态图。 这三种状态是:

1)运行态(该时刻进程实际占用CPU)。

2)就绪态(可运行, 但因为其他进程正在运行而暂时停止)。

3)阻塞态(除非某种外部事件发生, 否则进程不能运行)。
现代操作系统学习第2章 — 进程与线程

进程的实现

为了实现进程模型, 操作系统维护着一张表格(一个结构数组),即进程表(process table)。每个进程占用一个进程表项,有些作者称这些表项为进程控制块(process control block)。该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样。

现代操作系统学习第2章 — 进程与线程

中断处理和调度的过程:
现代操作系统学习第2章 — 进程与线程

多道程序设计模型

从概率的角度来看CPU的利用率。 假设一个进程等待I/O操作的时间与其停留在内存中时间的比为p。 当内存中同时有n个进程时, 则所有n个进程都在等待I/O(此时CPU空转)的概率是 p n p^n pn。 CPU的利用率由下面的公式给出:
CPU利用率= 1 − p n 1 - p^n 1pn