处理机调度的层次
高级调度
高级调度又称为作业调度或长程调度,其主要功能是根据某种算法,把外存上处于后备队列中的那些作业调入内存,也就是说,它的调度对象是作业。
1.作业和作业步
作业:一个比程序广泛的概念,不仅包含了通常的程序和数据,而且还应有一份作业说明书,系统根据说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。
作业步:在作业运行期间,每个作业都必须经过若干个相对独立又相互关联的顺序加工步骤才能得到结果,我们把其中的每一个加工步骤称为一个作业步,各作业步之间存在着相互联系,往往是把上一个作业步的输出作为下一个作业步的输入。一个典型的作业可以分为三步:①编译作业步;②连结装配作业步;③运行作业步。
作业流:若干个作业进入系统后,被依次存放在外存上,这便形成了输入的作业流,在OS控制下,逐个作业进行处理,便形成了作业流。
2.作业控制块JCB
为了管理和调度作业,在多道批处理系统中为每个作业设置而来一个作业控制块,其中保存了系统对作业进行管理和调度所需的全部信息。通常应包含:作业标识,用户名称,用户账户,作业类型,作业状态,调度信息,资源需求,进入系统时间,开始处理时间,作业完成时间,作业退出时间,资源使用情况等。JCB类似进程的PCB。
3.作业调度
作业调度的主要功能是根据作业控制块中的信息,审查系统能否满足用户作业的资源需求,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程,分配必要的资源。然后再将新创建的进程插入到就绪队列,准备执行。
在每次执行作业调度时,都须做出以下两个决定:接纳多少个作业(取决于多道程序度);接纳哪些作业(取决于所采用的调度算法)。
低级调度
低级调度也称为进程调度或短程调度,它所调用的对象是进程。它是最基本的一种调度。
低级调度的主要功能如下:①保存处理机的现场信息;②按某种算法选取进程;③把处理器分配给进程。
进程调度中的三个基本机制:
①排队器。为了提高进程调度的效率,应事先将系统中所有的就绪进程按一定的方式排成一个或多个队列,以便调度程序能够最快的找到它。
②分派器。分派器把由进程调度所选定的进程,从就绪队列取出该进程,然后进行上下文切换,将处理机分配给它。
③上下文切换机制。当对处理机进行切换时,会发生两对上下文切换操作。在第一对上下文切换时,操作系统将保存当前进程的上下文,而装入分派程序的上下文,以便分派程序运行;在第二对上下文切换时,将移出分派程序,而把新选进程的CPU现场信息装入到处理机的各个相应寄存器中。
3.进程调度方式
1) 非抢占方式(Non-preemptive Mode)
在采用非抢占调度方式时,可能引起进程调度的因素可归结为这样几个:① 正在执行的进程执行完毕, 或因发生某事件而不能再继续执行; ② 执行中的进程因提出I/O请求而暂停执行;③ 在进程通信或同步过程中执行了某种原语操作,如P操作(wait操作)、Block原语、Wakeup原语等。这种调度方式的优点是实现简单、系统开销小,适用于大多数的批处理系统环境。但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。显然,在要求比较严格的实时系统中,不宜采用这种调度方式。
2) 抢占方式(Preemptive Mode)
这种调度方式允许调度程序根据某种原则去暂停某个正在执行的进程,将已分配给该进程的处理机重新分配给另一进程。优点是可以防止一个长进程长时间占用处理机,能为大多数进程提供更公平的服务,特别是能满足对响应时间有着较严格要求的实时任务的需求。抢占调度方式的原则:优先权原则(对一些重要的和紧急的作业赋予较高的优先权);短作业或进程优先原则(当新到达的作业比正在执行的作业明显的短时,将暂停当前的长作业的执行,将处理机分配给新到达的作业);时间片原则(各进程按时间片轮转运行,当一个时间片用完后,便停止该进程的执行而重新进行调度)。
中级调度
中级调度又称中程调度(Medium-Term Scheduling)。 引入中级调度的主要目的,是为了提高内存利用率和系统吞吐量。 为此,应使那些暂时不能运行的进程不再占用宝贵的内存资源,而将它们调至外存上去等待,把此时的进程状态称为就绪驻外存状态或挂起状态。当这些进程重又具备运行条件、且内存又稍有空闲时,由中级调度来决定把外存上的哪些又具备运行条件的就绪进程,重新调入内存,并修改其状态为就绪状态,挂在就绪队列上等待进程调度。
调度队列模型和调度准则
调度队列模型
1. 仅有进程调度的调度队列模型
2. 具有高级和低级调度的调度队列模型
3. 同时具有三级调度的调度队列模型
②当要求服务的时间相同时,作业的优先权决定于其等待时间,等待时间愈长,其优先权愈高,因而它实现的是先来先服务。
③ 对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可升到很高, 从而也可获得处理机。
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间。
②开始截止时间和完成截止时间
④资源要求
对于一些小的实时系统,如果能预知任务的开始截止时间,则对实时任务的调度可采用非抢占调度机制,以简化调度程序和对任务调度时所花费的系统开销。但在设计这种调度机制时,应使所有的实时任务都比较小,并在执行完关键性程序和临界区后,能及时地将自己阻塞起来,以便释放出处理机, 供调度程序去调度那种开始截止时间即将到达的任务。
(1) 对外部中断的快速响应能力。为使在紧迫的外部事件请求中断时系统能及时响应,要求系统具有快速硬件中断机构,还应使禁止中断的时间间隔尽量短, 以免耽误时机(其它紧迫任务)。
(2) 快速的任务分派能力。在完成任务调度后,便应进行任务切换。为了提高分派程序进行任务切换时的速度, 应使系统中的每个运行功能单位适当的小,以减少任务切换的时间开销。
(3) 分配矩阵Allocation。这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
(4) 需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查:
(1) 如果Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2) 如果Requesti[j]≤Available[j],便转向步骤(3);否则, 表示尚无足够资源,Pi须等待。
Available[j]∶=Available[j]-Requesti[j];
Allocation[i,j]∶=Allocation[i,j]+Requesti[j];
Need[i,j]∶=Need[i,j]-Requesti[j];
(4) 系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则, 将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
① Finish[i]=false; ② Need[i,j]≤Work[j]; 若找到, 执行步骤(3), 否则,执行步骤(4)。
(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]∶=Work[i]+Allocation[i,j];
Finish[i]∶=true;
go to step 2;