调度
调度
调度:当有一堆任务要处理,但由于资源有限,需要某种规则来决定这些任务的顺序
进程(低级)调度
从就绪队列中按某种方法选取一个进程,并将处理机分配给它
-
操作系统最基本的一种调度
-
频率很高
-
主动放弃CPU:
-
进程正常终止
-
运行过程发生异常
-
进程主动请求阻塞(等待I/O)
-
-
被动放弃CPU:
-
时间片用完
-
更紧急事需要处理
-
优先级更高的事进入就绪队列
-
不能进行进程调度和切换:
-
处理中断时
-
进程在操作系统内核程序临界区
-
原子操作过程中
进程调度方式:
-
抢占式/剥夺调度方式:当有更重要进程需要使用处理机时,暂停当前进程,并将处理机分配给更紧急更重要的进程; 适合于分时、实时操作系统
-
非抢占式/非剥夺调度方式:只允许进程主动放弃处理机; 开销小,但无法及时处理紧急任务
进程切换:一个进程让出处理机,另一个进程占用处理机
-
对原来运行进程的各种数据保存
-
对新的进程各种资源的恢复
进程切换是有代价的:若过于频繁的进行进程的切换与调度,会使整个系统的效率降低 ,系统大部分时间都花在了进程切换上,真正用于执行进程的时间减少
内存(中级)调度
决定将哪个处于挂起状态的进程重新调入内存
挂起状态:暂时不能运行的进程调入外存等待,但PCB常驻内存 ,插在挂起队列 ;提高了内存的利用率和系统的吞吐量
-
就绪挂起
-
阻塞挂起
中级调度比高级调度发生更频繁
挂起的进程映像在外存中,阻塞的进程映像在内存中
作业(高级)调度
按一定原则从外存上处于后备队列的作业中挑选一个作业,给它们分配内存等资源,并建立相应的进程(建立PCB),使它们获得竞争处理机的权利
-
外存与内存间的调度
-
每个作业只调入一次(建立PCB),调出一次(撤销PCB)
高级调度 | 从后备队列调入内存,并创建进程 | 外存->内存(面向作业) | 频率最低 | 无->创建态->就绪态 |
---|---|---|---|---|
中级调度 | 挂起队列调回内存 | 外存->内存(面向进程) | 频率中等 | 挂起态->就绪态;阻塞挂起态->阻塞态 |
低级调度 | 就绪队列分配处理机 | 内存->CPU | 频率最高 | 就绪态->运行态 |
调度算法
FCFS、SJF、HRRN适合于早期的批处理系统,没有交互性
时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法适用于交互式系统
先来先服务FCFS
-
按照先后顺序进行服务;等待时间越久,越优先得到服务
-
非抢占式算法
例:
周转时间:完成时间-到达时间
P1=7-0=7;P2=11-2=9;P3=12-4=8;P4=16-5=11
带权周转时间:周转时间/运行时间
P1=7/7=1;P2=9/4=2.25;P3=8/1=8(短作业的带权周转时间太大);P4=11/4=2.75
等待时间:周转时间-运行时间
P1=7-7=0;P2=9-4=5;P3=8-1=7;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
-
优:公平、算法实现简单;不会导致饥饿 (总会被处理到)
-
缺:对长作业有利,对短作业不利
短作业优先SJF
- 最短(服务时间)的进程/作业优先得到服务
- 追求最少的平均周转时间、平均带权周转时间、平均等待时间
- 有抢占式版本,也有非抢占式版本
例:(非抢占式)
周转时间:完成时间-到达时间
P1=7-0=7;P2=12-2=10;P3=8-4=4;P4=16-5=11
带权周转时间:周转时间/运行时间
P1=7/7=1;P2=10/4=2.5;P3=4/1=4;P4=11/4=2.75
等待时间:周转时间-运行时间
P1=7-7=0;P2=10-4=6;P3=4-1=3;P4=11-4=7
平均周转时间=(7+10+4+11)/4=8
平均带权周转时间=(1+2.5+4+2.75)/4=2.56
平均等待时间=(0+6+3+7)/4=4
例:(抢占式)SRTN
周转时间:完成时间-到达时间
P1=16-0=16;P2=7-2=5;P3=5-4=1;P4=11-5=6
带权周转时间:周转时间/运行时间
P1=16/7=2.28;P2=5/4=1.25;P3=1/1=1;P4=6/4=1.5
等待时间:周转时间-运行时间
P1=16-7=9;P2=5-4=1;P3=1-1=0;P4=6-4=2
平均周转时间=(16+5+1+6)/4=7
平均带权周转时间=(2.28+1.25+1+1.5)/4=1.50
平均等待时间=(9+1+0+2)/4=3
-
若未特别说明,默认是非抢占式优先算法
-
在所有进程同时可运行/所有进程几乎同时到达,SJF平均等待时间、平均周转时间最少
-
抢占式最短优先算法的平均等待时间、平均周转时间最少
-
优:最短的平均等待时间、平均周转时间
-
缺:不公平:对短作业有利,长作业不利 ;会产生饥饿
高响应比优先HRRN
-
不仅考虑作业/进程的等待时间还要考虑运行时间
-
每次调度时计算各个作业/进程的响应比,选择响应比高的优先服务
响应比=(等待时间+运行时间)/运行时间≥1
-
非抢占式算法
-
不会导致饥饿
例:
响应比:
P1:P2=(5+4)/4=2.25;P3=(3+1)/1=4;P4=(2+4)/4=1.5
P1、P3:P2=(6+4)/4=2.5;P4=(3+4)/4=1.75
P1、P3、P2、P4
时间片轮转调度算法RR
-
公平、轮流为各个进程服务
-
按照到达就绪队列顺序,轮流让各个进程执行一个时间片,未处理完则剥夺处理机,放到就绪队尾重新排序
-
用于进程调度 (只有在进入内存建立了进程后才能被分配处理机时间片)
-
抢占式算法(由时钟装置发出时钟中断来通知CPU时间片已到)
-
常用于分时操作系统,不计算周转时间,更注重响应时间
例:
时间片=2
时间片=5
若时间片太大,使得每个进程都可以在一个时间片内就完成,因此时间片轮转调度算法退化为先来先服务调度算法
若时间片太小,导致进程切换过于频繁,系统花大量时间来处理进程切换,实际执行时间减少
合理时间片:切换进程开销占比不超过1%
-
优:公平、响应快;不会导致饥饿
-
缺:高频率的进程切换,造成一定开销;不区分任务紧急程度
优先级调度算法
-
每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程
-
有抢占式也有非抢占式
-
优先级是否可以动态改变:
-
静态优先级:创建进程时确定,之后一直不变
-
动态优先级:创建进程时确定,之后根据情况动态调整
系统进程优先级>用户进程;前台进程优先级>后台进程;操作系统更偏好I/O型进程
-
-
适用于实时操作系统
-
优:用优先级区分紧急、重要程度,灵活调整对作业/进程的偏好程度
-
缺:会导致饥饿
多级反馈队列调度算法
-
用于进程调度
-
抢占式算法
-
会导致饥饿
例:
-
设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
-
新进程先进入第1级队列,按先来先服务原则等待被分配时间片
-
若时间片用完进程未结束,则进程进入下一级队尾
-
若到了最后一级,则放入队尾
-
只有在第i级队列为空时,才会为第i+1级队列分配时间片
-
被强占处理机的进程重新放入原队队尾
调度算法的评价指标
-
CPU利用率:忙碌时间/总时间
-
系统吞吐量:总共完成的作业量/总共花的时间
-
周转时间:从作业被提交给系统开始,到作业完成为止=作业完成时间-作业提交时间
-
高级调度时间
-
低级调度时间(就绪)
-
CPU上运行时间(运行)
-
等待I/O操作时间(阻塞)
-
-
带权周转时间:作业周转时间/实际运行时间(必然≥1)
-
周转时间、带权周转时间都是越小越好
-
等待时间:
-
进程的等待时间:进程建立后,等待被服务的时间之和
-
作业的等待时间:进程建立后的等待时间+作业在外存后备队列中等待的时间
-
-
响应时间:用户从提交请求到首次产生响应的时间