http://www.tulipsys.com
Figure 4.5 Queueing-diagram representation of process scheduling.
在前两种情况下,进程最终会从等待状态转换为就绪状态,并返回就绪队列中。一个进程会持续这个
循环直到终止执行,此时退出所有对列并释放自己的 PCB 和资源。
4.2.2 调度程序
进程在其生命周期中于各种调度队列之间转移。为了进行调度,操作系统必须要以某种方式从这些队
列里选择进程。而调度程序负责选择进程。
在批处理系统中,提交的进程数量常常要多于能够立即执行的进程数量。这些进程存储在大容量存储
器(典型的是磁盘)中以备稍后执行。长程调度程序(或作业调度程序)从这个池中选择进程并将其载入
内存。近程调度程序(或 CPU 调度程序)从这些进程中选择就绪进程并为其中某个分配 CPU。
这两种调度程序的主要区别在于他们的运行频率。短程调度程序必须要频繁的为 CPU 选择一个新进
程。一个进程可能在等待一个 I/O 请求之前仅仅执行数毫秒。通常短程调度程序至少每隔 100 毫秒执行一
次。因为两次执行的间隔时间很短,所以短程调度程序必须要快速。如果它需要 10 毫秒来决定一个进程,
而进程运行 100 毫秒,那么 10/(100 + 10) = 9%的 CPU 仅仅被用于调度工作(或者说是浪费在调度工作上)。
另一方面,长程调度程序就不那么频繁执行了。在系统中,可能数分钟才会创建一个新进程。长程调
度程序控制着多道程序度——内存中(同时存在)的进程数量。如果多道程序度是固定的,那么进程创建
的平均频率要与进程(终止)离开系统的平均频率相同。如此,长程调度程序可能仅仅在进程离开系统的
时候被调用。因为两次执行的间隔时间较长,所以长程调度程序能够提供更多的时间来选择一个进程。
长程调度程序必须要小心选择。通常,大多数的进程是 I/O 繁忙型(I/O bound)或 CPU 繁忙型(CPU
bound)。I/O 繁忙型进程在 I/O 上耗费的时间要多于在计算上耗费的。另一方面,CPU 繁忙型进程很少产
生 I/O 请求,与 I/O 繁忙型进程相比更多的时间消耗在计算上。长程调度程序应该选择一个由 I/O 繁忙型
和 CPU 繁忙型进程组成的进程混合集(process mix)。如果所有的进程都是 I/O 繁忙型的,那么就绪队列
几乎总是空的,而且短程调度程序几乎无事可做。如果所有的进程都是 CPU 繁忙型的,那么 I/O 等待队列
几乎总是空的,设备将处于空闲状态,系统将失去平衡。性能最好的系统要有一个 CPU 繁忙型和 I/O 繁忙
型进程的组合。
有些系统中的长程调度程序可能没有或很小。例如,分时系统(如 UNIX)常常没有长程调度程序,
只是简单的为短程调度程序把新进程放置到内存中。这些系统的稳定性取决于实际的条件限制(如可用的
终端的数量)或用户的自我调节。如果性能下降到不可接受的地步,只是简单的使部分用户退出。
有些操作系统(如分时系统)可能会引入另外一种中间级的调度。图 4.6 描述了这种中程调度程序,