操作系统进程的调度算法

1. 先来先服务 (FCFS,first come first served)

先来先服务的调度算法:最简单的调度算法,既可以用于作业调度 ,也可以用于程序调度,当作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,优先从后备队列中,选择一个或多个位于队列头部的作业,把他们调入内存,分配所需资源、创建进程,然后放入"就绪队列",直到该进程运行到完成或发生某事件堵塞后,进程调度程序才将处理机分配给其他进程。

优缺点:

有利于长作业(进程)而不利于短作业(进程)

有利于CPU繁忙型作业(进程)而不利于I/O繁忙型作业(进程)

2.短作业优先(SJF, Shortest Job First) 

短作业优先是对先来先服务算法的改进,其目标是减少平均周转时间。

算法思想:对预计执行时间短的作业(进程)优先分派处理机。通常后来的短作业不抢先正在执行的作业。

(1) 优点:

比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间;

提高系统的吞吐量;

(2) 缺点:

对长作业非常不利,可能长时间得不到执行;

扫描二维码关注公众号,回复: 3895210 查看本文章

未能依据作业的紧迫程度来划分执行的优先级;

难以准确估计作业(进程)的执行时间,从而影响调度性能。

3.最高响应比优先法(HRRN,Highest Response Ratio Next) 

高响应比优先调度算法(Highest Response Ratio Next)是一种对CPU中央控制器响应比的分配的一种算法。HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折中算法,既考虑作业等待时间又考虑作业运行时间,既照顾短作业又不使长作业等待时间过长,改进了调度性能。

基本思想:

短作业优先调度算法 + 动态优先权机制

既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。

优缺点:

短作业与先后次序的兼顾,且不会使长作业长期得不到服务

响应比计算系统开销,增加系统开销

4.时间片轮转算法(RR,Round-Robin)

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一时间段,称作它的时间片,即该进程允许运行的时间。

基本思想:

在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间

时间片大小的确定

1.系统对响应时间的要求

2.就绪队列中进程的数目

3.系统的处理能力

5.多级反馈队列(Multilevel Feedback Queue) 

多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。(对比一下FCFS与高优先响应比调度算法的缺陷)。

多级(假设为N级)反馈队列调度算法可以如下原理:

1、设有N个队列(Q1,Q2....QN),其中各个队列对于处理机优先级是不一样的,也就是说位于各个队列中的作业(进程)的优先级也是不一样的。一般来说,优先级Priority(Q1) > Priority(Q2) > ... > Priority(QN)。怎么讲,位于Q1中的任何一个作业(进程)都要比Q2中的任何一个作业(进程)相对于CPU的优先级要高(也就是说,Q1中的作业一定要比Q2中的作业先被处理机调度),依次类推其它的队列。

2、对于优先级最低的队列来说,里面是遵循时间片轮转法。也就是说,位于队列QN中有M个作业,它们的运行时间是通过QN这个队列所设定的时间片来确定的;对于其他队列,遵循的是先来先服务算法,每一进程分配一定的时间片,若时间片运行完时进程未结束,则进入下一优先级队列的末尾。

3、各个队列的时间片是一样的吗?不一样,这就是该算法设计的精妙之处。各个队列的时间片是随着优先级的增加而减少的,也就是说,优先级越高的队列中它的时间片就越短。同时,为了便于那些超大作业的完成,最后一个队列QN(优先级最低的队列)的时间片一般很大(不需要考虑这个问题)。

算法描述:

1、进程在进入待调度的队列等待时,首先进入优先级最高的Q1等待。

2、首先调度优先级高的队列中的进程。若高优先级中队列中已没有调度的进程,则调度次优先级队列中的进程。例如:Q1,Q2,Q3三个队列,当且仅当在Q1中没有进程等待时才去调度Q2,同理,只有Q1,Q2都为空时才会去调度Q3。

3、对于同一个队列中的各个进程,按照FCFS分配时间片调度。比如Q1队列的时间片为N,那么Q1中的作业在经历了N个时间片后若还没有完成,则进入Q2队列等待,若Q2的时间片用完后作业还不能完成,一直进入下一级队列,直至完成。

4、在最后一个队列QN中的各个进程,按照时间片轮转分配时间片调度。

5、在低优先级的队列中的进程在运行时,又有新到达的作业,此时须立即把正在运行的进程放回当前队列的队尾,然后把处理机分给高优先级进程。换而言之,任何时刻,只有当第1~i-1队列全部为空时,才会去执行第i队列的进程(抢占式)。特别说明,当再度运行到当前队列的该进程时,仅分配上次还未完成的时间片,不再分配该队列对应的完整时间片。

算法示例:

假设系统中有3个反馈队列Q1,Q2,Q3,时间片分别为2,4,8。 [1] 

设有3个作业J1,J2,J3分别在时间 0 ,1,3时刻到达。而它们所需要的CPU时间分别是3,2,1个时间片。

1、时刻0 J1到达。于是进入到队列1 , 运行1个时间片 , 时间片还未到,此时J2到达。

2、时刻1 J2到达。 由于同一队列采用先来先服务,于是J2等待。 J1在运行了1个时间片后,已经完成了在Q1中的2个时间片的限制,于是J1置于Q2等待被调度。当前处理机分配给J2。

3、时刻2 J1进入Q2等待调度,J2获得CPU开始运行。

4、时刻3 J3到达,由于同一队列采用先来先服务,故J3在Q1等待调度,J1也在Q2等待调度。

5、时刻4 J2处理完成,由于J3,J1都在等待调度,但是J3所在的队列比J1所在的队列的优先级要高,于是J3被调度,J1继续在Q2等待。

6、时刻5 J3经过1个时间片,完成。

7、时刻6 由于Q1已经空闲,于是开始调度Q2中的作业,则J1得到处理器开始运行。 J1再经过一个时间片,完成了任务。于是整个调度过程结束。

从上面的例子看,在多级反馈队列中,后进的作业不一定慢完成。

猜你喜欢

转载自blog.csdn.net/Damn_Yang/article/details/83062702