调度算法的评价指标
- cpu利用率
cpu利用率=cpu有效工作时间 / (cpu有效工作时间+cpu空闲时间)
- 系统吞吐量:单位时间内完成作业的数量
系统吞吐量=总共完成作业数 / 总共耗费时间
- 周转时间:从作业被提交到作业完成为止的时间间隔
周转时间 = 作业完成时间 - 作业提交时间
- 带权周转时间
带权周转时间 = 周转时间 / 作业实际运行时间
- 平均周转时间
平均周转时间 = 各作业周转时间之和 / 作业数
- 平均带权周转时间
平均带权周转时间 = 各作业带权周转时间之和 / 作业数
- 等待时间:进程或者作业处于等待处理机状态时间之和
- 只涉及计算,不涉及I/O操作:
等待时间 = 周转时间 - 运行时间- 若涉及I/O操作,则:
等待时间 = 周转时间 - 运行时间 - I/O操作时间
- 响应时间:提出请求到首次收到回复的时间
补充
进程调度方式:
1.非剥夺调度方式也称为非抢占方式:只允许进程主动放弃处理机
2.剥夺调度方式也称为抢占方式:进程状态可以被动进入阻塞态
调度算法
一、不适合用于交互式系统
1.先来先服务(FCFS调度算法)
- 算法:按照进程或者作业到达的先后顺序
- 特征:非抢占式算法;适用于作业调度,也适用于进程调度
- 优点:公平、算法实现简单
- 缺点:排在长作业后面的短作业需要等待很长时间,带权周 转时间大,对短作业来说用户体验不好。即FCFS算法对长作业有利,对短作业不利
例题:用先来先服务调度算法求下表中各个进程的周转时间、带权周转时间、等待时间、平均周转时间、平均带权周转时间、平均等待时间
调度顺序:P1->P2->P3->P4(按照到达的先后顺序)
- 周转时间:
(1) P1 = 7-0 = 7 (2) P2 = 11-2 = 9
(3) P3 = 12-4 = 8 (4) P4 = 16-5 = 11 - 带权周转时间:
(1) P1= 7/7 = 1 (2) P2 = 9/4 = 2.25
(3) P3 = 8/1 = 8 (4) P4 = 11/4 = 2.75 - 等待时间:
(1) P1= 7-7 = 0 (2) P2 = 9-4 = 5
(3) P3 = 8-1 = 7 (4) P4 = 11-4 = 7 - 平均周转时间 = (7+9+8+11) / 4 = 8.75
- 平均带权周转时间 = (1+2.25+8+2.75) / 4 = 3.5
- 平均等待时间 = (0+5+7+7) / 4 =4.75
2.短作业优先(SJF调度算法)
- 算法:当前已经到达且最短的作业或者进程优先得到服务
- 特征:非抢占式算法,也有抢占式算法【最短剩余时间优先算法(SRTN算法)】;适用于作业调度,也适用于进程调度
- 优点:最短的平均等待时间、平均周转时间
- 缺点:对短作业有利,对长作业不利,可能产生饥饿现象
例题:(1)用短作业优先非抢占式调度算法:求下表中各个进程的周转时间、带权周转时间、等待时间、平均周转时间、平均带权周转时间、平均等待时间
调度顺序:P1->P3->P2->P4
-
0时刻:只有P1到达
-
7时刻:P2、P3、P4均到达且P3运行时间最短,选择P3
-
8时刻:P2比P4先到达,所以选择P2
-
周转时间:
(1) P1 = 7-0 = 7 (2) P2 = 12-2 = 10
(3) P3 = 8-4 = 4 (4) P4 = 16-5 = 11 -
带权周转时间:
(1) P1= 7/7 = 1 (2) P2 = 10/4 = 2.5
(3) P3 = 4/1 = 4 (4) P4 = 11/4 = 2.75 -
等待时间:
(1) P1= 7-7 = 0 (2) P2 = 10-4 = 6
(3) P3 = 4-1 = 3 (4) P4 = 11-4 = 7 -
平均周转时间 = (7+4+10+11) / 4 = 8
-
平均带权周转时间 = (1+2.5+4+2.75) / 4 = 2.56
-
平均等待时间 = (0+6+3+7) / 4 =4
(2)用最短剩余时间优先算法:求下表中进程的调度顺序
注:(1)每当有进程加入就绪队列,就需要进行进程调度
(2)Pi(n):i代表第i个进程,n代表运行时间
调度顺序:
- 0时刻:只有P1到达:P1(7)
- 2时刻:P2加入就绪队列,此时P1(5)、P2(4),选择P2
- 4时刻:P3加入就绪队列,此时P1(5)、P2(2)、P3(1),选择P3
- 5时刻:P4加入就绪队列,此时P1(5)、P2(2)、P4(4),选择P2
- 7时刻:P1(5)、P4(4)选择P4
…
P1->P2->P3->P2->P4->P1
3.高响应比优先算法(HRRN)
- 算法:每次调度时先计算各个作业或者进程的响应比,响应比最高的优先
- 响应比 = (等待时间+要求服务时间)/ 要求服务时间
- 特征:非抢占式算法;适用于作业调度,也适用于进程调度
- 优缺点:
1.综合考虑等待时间和运行时间。
2.等待时间相同时,具有SJF调度算法的优点。
3.要求服务时间相同时,具有FCFS调度算法的优点。
4.对于长作业,随着等待时间越来越久,其响应比会越来越大
例题:用高响应比优先算法:求下表中进程的调度顺序
响应比求解:
0时刻:只有P1
7时刻:
- P2等待时间 = 7-2 = 5,P2响应比 = (5+4)/ 4 = 2.25
- P3等待时间 = 7-4 = 3,P3响应比 =(3+1)/ 1 = 4
- P4等待时间 = 7-5 = 2,P4响应比 = (2+4)/ 4 = 1.5
所以选择P3
8时刻:
- P2等待时间 = 8-2 = 6,P2响应比 = (6+4)/ 4 = 2.5
- P4等待时间 = 8-5 = 3,P4响应比 = (3+4)/ 4 = 1.75
所以选择P2
12时刻:只有P4
调度顺序:P1->P3->P2->P4
二、适合用于交互式系统
1.时间片轮转调度算法(RR)
- 算法:按照各进程到达就绪队列的顺序,轮流让各个进程执行一个时间片。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排列
- 特征:抢占式算法;仅适用于进程调度
- 优点:公平、响应快,适用于分时操作系统
- 缺点:高频率的进程切换导致有一定开销;不区分任务紧急程度
- 时间片设置:
1.时间片太大,会退化为FCFS算法,并且会增大进程响应时间
2.时间片太小,会导致进程切换过于频繁,系统会花大量时间来处理进程切换,从而导致实际用于进程执行的实际比例减少。
例题:用时间片轮转调度算法:分析时间片大小为2时的进程运行情况
时间片大小为2:
- 0时刻:只有P1,P1(5)
- 2时刻:
P2到达,插入就绪队列;P1未执行完,重新插入就绪队列队尾:P2(4)->P1(3) - 4时刻:
P3到达,插入就绪队列,P2未执行完,重新插入就绪队列:P1(3)->P3(1)->P2(2) - 5时刻:
P4到达,插入就绪队列:P1(2)->P3(1)->P2(2)->P4(6) - 6时刻:
P1未执行完,重新插入就绪队列队尾:P3(1)->P2(2)->P4(6)->P1(1) - 7时刻:
P3执行完,提前进程调度: P2(2)->P4(6)->P1(1) - 9时刻:
P4(6)->P1(1)
…
调度顺序:P1->P2->P1->P3->P2->P4->P1->P4
2.优先级调度算法
- 算法:每个作业或者进程有各自的优先级数,优先级数高的优先
- 特征:抢占式算法,也有非抢占式算法;适用于进程调度和作业调度,也可用于I/O调度
- 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统,比较灵活
- 缺点:若源源不断地有高级优先进程到来,可能导致饥饿。
例题:(1)用优先级调度非抢占式算法:求下表中进程的调度顺序(一般情况,优先数越大,优先级越高)
调度顺序:
- 0时刻:只有P1
- 7时刻:P2、P3、P4依次已到达,P3优先数高,选择P3
- 8时刻:P2和P4优先数相同,P2先到达,选择P2
…
P1->P3->P2->P4
(2)用优先级调度非抢占式算法:求下表中进程的调度顺序(一般情况,优先数越大,优先级越高)
调度顺序:
- 0时刻:只有P1到达,P1(7)
- 2时刻:P2到达,调度切换,此时:P2(4)、P1(5),但P2优先数高,所以选择P2
- 4时刻:P3到达,调度切换,此时:P1(5)、P2(2)、P3(1),P3优先数高,选择P3
- 5时刻:P4到达,此时:P1(5)、P2(2)、P4(4),P2和P4优先数高且相等,但P2先到达就绪队列,选择P2
…
P1->P2->P3->P2->P4->P1
3.多级反馈队列调度算法
- 算法:
1.设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
2.新进程到达时先进入第1级队列,按FCFS原则排队等待分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经在最下级队列,则重新放回该队列队尾
3.只有第K级队列为空时,才会为K+1级队头进程分配时间片- 特征:抢占式算法,也有非抢占式算法;适用于进程调度
- 优点:用优先级区分紧急程度、重要程度,适用于实时操作系统,比较灵活
- 缺点:若源源不断地有高级优先进程到来,可能导致饥饿。
例题:用多级反馈队列调度算法:分析下表中进程运行的过程
多级就绪队列
分析:
- 0时刻:P1进入第1级队列,执行时间片,此时:P1(7),P1进入第2级队列
- 1时刻:P2进入第1级队列,因为第1级队列有进程,所以不执行第2级队列,对P2执行时间片,此时:P1(7),P2(3),P2进入第2级队列
- 2时刻:因为第1级队列没有进程,所以调度P1,此时:P1(5),P2(3),P1进入第3级队列
- 4时刻:P2(3),P1(5),执行第2级队列,调度P2,此时P2(2),P1(5)
- 5时刻:P3到达,抢占处理机,此时:P3(1),P2(2),P1(5)
- 6时刻:P3处理完成,继续运行P2,此时:P2(2),P1(5)
- 8时刻:只剩P1,在第3级队列
P1->P2->P1->P2->P3->P2->P1