处理机调度层次
调度层次分为三种
- 高级调度 = 作业调度 = 长程调度
- 低级调度 = 进程调度 = 短程调度
- 中级调度 = 中程调度
作业调度往往是发生在一个作业运行完毕,退出系统,而需要重新调入一个(批)作业进入内存时,故作业调度的周期较长,大约几分钟一次,因此把它称为长程调度。由于其运行频率较低,故允许作业调度算法花费较多的时间。
进程调度的运行频率最高,在分时系统中通常是 10~100 ms 便进行一次进程调度,因此把它称为短程调度。为避免进程调度占用太多的CPU时间,进程调度算法不宜太复杂。
中级调度的运行频率基本上介于上述两种调度之间,因此把它称为中程调度。
(1)高级调度
高级调度的主要功能是根据某种算法,把外存上处于后被队列中的那些作业调入内存,也就是说它们的调度对象是作业。所以高级调度又称作业调度。
-
作业和作业步
[1]作业
作业不仅包含通常的程序和数据,还应配有一份作业说明书,系统根据说明书对程序的运行进行控制。
在批处理系统中,是以作业为基本单位从外存调入的。
[2]作业步
通常,在作业运行期间,每个作业都必须经过若干个相对独立,又相互关联的顺序加工步骤才能得到结果,我们把其中的每一个加工步骤称为一个作业步。
各作业步之间存在着相互联系,往往是把上一个作业步的输出作为下一个作业步的输入。
-
一个典型的作业可分成三个作业步:
① “编译”作业步,通过执行编译程序对源程序进行编译,产生若干个目标程序段;
② “连结装配”作业步,将“编译”作业步所产生的若干个目标程序段装配成可执行的目标程序;
③ “运行”作业步,将可执行的目标程序读入内存并控制其运行。
[3]作业流
- 若干个作业进入系统后,被依次存放在外存上,这便形成了输入的作业流;
- 在操作系统的控制下,逐个作业进行处理,于是便形成了处理作业流。
-
作业控制块(Job Control Block)
为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块。每当作业进入系统时,系统便为每个作业建立一个 JCB,根据作业类型将它插入相应的后备队列中。
如同进程控制块是进程在系统中存在的标志一样,它是作业在系统中存在的标志,其中保存了系统对作业进行管理和调度所需的全部信息。
在 JCB 中所包含的内容因系统而异,通常应含的内容有:作业标识、用户名称、用户帐户、作业类型(CPU繁忙型、I/O繁忙型、批量型、终端型)、作业状态、调度信息(优先级、作业已运行时间)、资源需求(预计运行时间、 要求内存大小、要求 I/O 设备的类型和数量等)、进入系统时间、开始处理时间、作业完成时间、作业退出时间、资源使用情况等。
作业调度程序依据一定的调度算法来调度作业,被调度到的作业将会装入内存。在作业运行期间,系统就按照 JCB 中的信息对作业进行控制。当一个作业执行结束进入完成状态时,系统负责回收分配给它的资源,撤消它的作业控制块。
-
作业调度
作业调度的功能:
-
作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。
然后再将新创建的进程插入就绪队列,准备执行。因此,有时也把作业调度称为接纳调度(Admission Scheduling)。
周转时间:
-
对用户而言,总希望自己作业的周转时间尽可能的少,最好周转时间就等于作业的执行时间。
然而对系统来说,则希望作业的平均周转时间尽可能少,有利于提高CPU的利用率和系统的吞吐量。
为此,每个系统在选择作业调度算法时,既应考虑用户的要求,又能确保系统具有较高的效率。在每次执行作业调度时,都须做出以下两个决定:
① 决定接纳多少个作业
作业调度每次要接纳多少个作业进入内存,取决于多道程序度(Degree of Multiprogramming),即允许多少个作业同时在内存中运行。
当内存中同时运行的作业数目太多时,可能会影响 到系统的服务质量,比如,使周转时间太长。
但如果在内存中同时运行作业的数量太少时, 又会导致系统的资源利用率和系统吞吐量太低。
因此,多道程序度的确定应根据系统的规模和运行速度等情况做适当的折衷。
② 决定接纳哪些作业
应将哪些作业从外存调入内存,这将取决于所采用的调度算法。下面是几种调度算法:
-
先来先服务调度算法
将最早进入外存的作业最先调入内存;
-
短作业优先调度算法
是将外存上最短的作业最先调入内存;
-
基于作业优先级的调度算法
该算法是将外存上优先级最高的作业优先调入内存;
”响应比高者优先”的调度算法。
-
在批处理系统中,作业进入系统后,总是先驻留在外存的后备队列上,因此需要有作
业调度的过程,以便将它们分批地装入内存。
然而在分时系统中,为了做到及时响应,用户通过键盘输入的命令或数据等都是被直接送入内存的,因而无需再配置上述的作业调度机制而只需要低级调度。但也需要有某些限制性措施来限制进入系统的用户数。即,如果系统尚未饱和,将接纳所有授权用户,否则,将拒绝接纳。类似地,在实时系统中通常也不需要作业调度。
(2)低级调度
低级调度 = 进程调度 = 短程调度
它所调度的对线是进程或内核级线程。
它是最基本的调度,在多道批处理、分时、实时三种类型的OS中都必须配备这级调度。
-
低级调度的功能
低级调度用于决定就绪队列中的哪个进程应获得处理机,然后再由分派程序执行把处理机分配给该进程的具体操作。
低级调度的主要功能如下:
-
保存处理机的现场信息
在进程调度进行调度时,首先需要保存当前进程的处理机的现场信息,如程序计数器、多个通用寄存器中的内容等,将它们送入该进程的进程控制块(PCB)中的相应单元。
-
按某种算法选取进程
低级调度程序按某种算法如优先数算法、轮转法等,从就绪队列中选取一个进程,把它的状态改为运行状态,并准备把处理机分配给它。
-
把处理器分配给进程
由分派程序(Dispatcher)把处理器分配给进程。
此时需为选中的进程恢复处理机现场,即把选中进程的进程控制块内有关处理机现场的信息装入处理器相应的各个寄存器中,把处理器的控制权交给该进程,让它从取出的断点处开始继续运行
-
-
进程调度的三个基本机制
- 排队器
为了提高进程调度的效率,应事先将系统中所有的就绪进程按照一定的方式排成一个或多个队列,以便调度程序能最快地找到它。
-
分派器
分派器把由进程调度程序所选定的进程,从就绪队列中取出该进程,然后进行上下文切换,将处理机分配给它。
-
上下文切换机制
当对处理机进行切换时,会发生两对上下文切换操作。
在第一对上下文切换时,操作系统将保存当前进程的上下文,而装入分派器程序的上下文,以便分派程序运行;
在第二对上下文切换时,将移出分派器程序,而把新选进程的CPU现场信息装入到处理机的各个相应寄存器中。
-
进程调度的方式
-
非抢占方式(Non-preemptive Mode)
在采用这种调度方式时,一旦把处理机分配给某进程后,不管它要运行多长时间,都一直让它运行下去,决不会因为时钟中断等原因而抢占正在运行进程的处理机,也不允许其它进程抢占已经分配给它的处理机。
直至该进程完成,自愿释放处理机,或发生某事件而被阻塞时,才再把处理机分配给其他进程。
在采用非抢占调度方式时,可能引起进程调度的因素可归结为如下几个:
① 正在执行的进程执行完毕,或因发生某事件而不能再继续执行;
② 执行中的进程因提出 I/O 请求而暂停执行;
③ 在进程通信或同步过程中执行了某种原语操作,如P操作(wait 操作)、Block原语、Wakeup原语等。
这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。
但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果,因而在要求比较严格的实时系统中,不宜采用这种调度方式。
-
抢占方式(Preemptive Mode)
这种调度方式允许调度程序根据某种原则去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。
抢占方式的优点是,可以防止一个长进程长时间占用处理机,能为大多数进程提供更公平的服务,特别是能满足对响应时间有着较严格要求的实时任务的需求。
但抢占方式比非抢占方式调度所需付出的开销较大。
抢占调度方式可以采取几种原则,主要有如下几条:
-
优先权原则
通常是对一些重要的和紧急的作业赋予较高的优先权。
当这种作业到达时,如果其优先权比正在执行进程的优先权高,便停止正在执行(当前)的进程,将处理机 分配给优先权高的新到的进程,使之执行;或者说,允许优先权高的新到进程抢占当前进程的处理机。
-
短进程优先原则
当新到达的作业(进程)比正在执行的作业(进程)明显的短时,将暂停当前长作业(进程)的执行,将处理机分配给新到的短作业(进程),使之优先执行。
-
时间片原则
各进程按时间片轮流运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。
这种原则适用于分时系统、大多数的实时系统,以及要求较高的批处理系统。
-
-
(3)中级调度
中级调度(Intermediate Level Scheduling)又称中程调度(Medium-Term Scheduling)。
引入中级调度的主要目的是为了提高内存利用率和系统吞吐量。
为此,应使那些暂时不能运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态。
当这些进程重又具备运行条件且内存又稍有空闲时,由中级调度来决定把外存上的那些又具备运行条件的就绪进程重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。