进程再其声明周期中,会在各种调度队列中迁移。

为了调度的目的,操作系统必须按照某种方式从这些队列中选择进程。

选择进程是通过相应的调度器/调度程序(scheduler)来做到的。

对于批处理系统:

进程更多的是提交,而不是马上执行。这些进程被放在大容量存储设备(比如磁盘)的缓冲池中,保存在哪里以便以后执行。

长期调度程序( long-term scheduler)或者作业调度程序(job scheduler)从这个池中选择进程并将它们加载到内存中以准备执行。而短期调程序( short-term scheduler)或者CPU调度程序(CPU scheduler)会从准备执行的进程选择进程,并为之分配CPU资源。

这两个调度程序的主要区别是它们的执行频率。短期调度程序必须频繁的为CPU选择进程。在等待I/O请求之前,一个进程可能只执行几毫秒。通常,短期调度程序至少100ms执行一次。因为执行间隔很短,短期调度程序必须很快。如果它花费了10ms来决定为哪个进程执行100ms的话,那么也就是说10 / (100 + 10) = 9%的CPU事件被浪费在调度工作上。

长期调度器执行的频率要低得多;在系统中创建一个新的进程到下一次创建新的进程的时间间隔可能有数分钟之久。

长期调度程序可以控制多道程序设计的程度(degree of multiprogramming)(即内存中进程的数量)。如果多道程序设计是稳定的,那么创建进程的平均速度必须等于进程离开系统的平均速度。因此只有当进程离开系统时,才可能需要调用长期调度程序。长期调度器可以花更多的时间来决定。 应该选择哪个进程执行?

长期调度程序作出谨慎的选择是非常重要的。通常,大多数进程可以被描述为I/O bound或CPU bound。

I/O -bound的进程指的是在I/O上花费的时间大于花费在计算上的时间。

CPU bound的进程则是指很少生成I/O请求,更多的事件用在计算上。

因此,长期调度程序选择一个合理的混合I/O-bound和CPU-bound进程的组合进程。如果所有的进程都是I/O-bound的,就绪队列将会经常是空的。而短期调度程序几乎没有事情做。而如果所有的进程都是CPU-bound的,那么I/O等待队列经常是空的,设备将不再使用,系统也将失去平衡。因此,最佳性能的系统是CPU-bound和I/O-bound的进程的组合。

某些系统,可能没有或者很小限度的长期调度程序。例如,UNIX或者Windows的分时系统通常没有长期调度程序。只是简单的将所有的新进程放在内存中以供短期调度程序使用。这些系统的稳定性依赖于物理限制(如可用的终端数)或者用户的自我调整。如果用户系统上的性能下降到令人难以接受的地步,那么有用户干脆会退出。

有的操作系统,比如分时系统,可能会引入中期调度程序中期调度程序的关键思想是能将进程从内存(或者从CPU竞争)中移出,从而降低多道程序设计的程度。之后,进程能重新调度内存,并从中断处继续执行,这种方案称为交换(swapping).通过中期调度程序,进程可以被换出,并在之后再换入。

为了改善进程的混合,或者因为内存需求的变化已经超出了可用内存,需要释放内存,这些情况下,就有必要使用交换啦。

results matching ""

    No results matching ""