调度算法
名称 | 英文 | 作业调度 | 进程调度 | 说明 | 特点 |
---|---|---|---|---|---|
先来先服务 | First-come first-served, FCFS | 适用 | 适用 | 按作业到达先后顺序(即优先考虑等待时间最长的) | 非抢占式 |
短作业优先 | short job first, SJF | 适用 | 适用 | 作业越短(即运行时间越短)优先级越高 | 非抢占式(有抢占式) |
优先级调度算法 | priority-scheduling algorithm, PSA | 适用 | 适用 | 优先级由作业紧迫程度决定 | 抢占式和非抢占式两种 |
高响应比优先调度算法 | Highest Response Ratio Next, HRRN | 适用 | 优先级动态改变且与时间关联,响应比的计算增加系统开销 | 非抢占式 | |
时间片轮转 | Round Robin, RR | 适用 | 就绪队列的进程每次运行一个时间片 | 抢占式 | |
多级反馈队列调度算法 | multi level feedback queue, MLFQ | 适用 | 多个优先级队列,每个队列采用FCFS,优先级高的队列空了再从低的队列调度 | 抢占式 |
*SJF算法有抢占式版本,后文可见
基于公平性角度考虑还有保证调度算法和公平分享调度算法。
保证调度算法的目标是:保证对于n个进程,每个进程都获得1/n的处理机时间
平分享调度算法是针对用户而言的。若用户1有4个进程而用户二有1个,如果按RR调度,用户1则占用了80%的处理机时间,而用户2才占用20%。该算法的目的是确保用户1和用户2占用的处理机时间一样,而不是进程。
系统采用调度算法未必只有一个,可以结合使用
例如MLFQ就可以为每个队列使用FCFS
各算法详细说明
FCFS(最简单的非抢占式调度算法)
对短作业不利,对长作业有利
这里的是否有利的衡量标准是带权周转时间。只考虑等待时间意味着对长作业有利,只考虑运行时间则对短作业有利,
这个思路就是一个队列,队首是下一次要执行的,而要后加入的进入队尾。
具有Convoy 效应,又作护航效应:所有其他进程都等待一个大进程释放CPU资源。
SJF(具有抢占式版本SRTF)
可能存在饥饿问题(长进程得不到处理),具有抢占和非抢占两种方式
常用于长程调度
优点是在所有调度算法中平均等待时间最短,缺点是实际不可行(因为不知道执行时间),当然,可以用先前的估算。
Shortest Remaining Time First (SRTF)是SJF的抢占式版本,其中处理器被分配给最接近完成的作业。 但开销也更多。
PSA
为了照顾紧迫型进程,应采用PSA
貌似也有人管这个叫PR
可以模拟其他调度算法
HRRN
响应比的额外计算增加开销,但是避免了长作业饥饿的问题
优先权 = 等待时间 + 要求服务时间 要求服务时间 = 响应时间 要求服务时间 优先权=\frac{等待时间+要求服务时间}{要求服务时间}=\frac{响应时间}{要求服务时间} 优先权=要求服务时间等待时间+要求服务时间=要求服务时间响应时间
RR
分时系统一般采用RR
时间片太大,意味着每个进程都能在一轮执行完毕,则退化为FCFS。
上下文切换开销大。
新创建的进程被添加到就绪队列的末尾(有点像FCFS)
某种程度上算是FCFS的抢占式版本
MLFQ
只有当前一级别队列空时,才去调度后一级别队列
较低优先级队列中的进程可能会由于一些短进程占用所有 CPU 时间而遭受饥饿。
上述问题可以通过定期提高所有进程的优先级并将它们全部放入最高优先级队列中解决。
关键知识点
抢占与非抢占区别
抢占意味着可以被中断,非抢占意味着只要执行了就一定能执行完。
非抢占式开销小,实现简单。
在抢占式调度中,调度程序可根据某种原则暂停某个正在执行的进程,将已分配给它的CPU重新分配给另一进程。这种方式比较复杂,系统开销大。进程切换频繁,但是可防止单一进程长时间独占CPU。
主要原则有:
- 优先权原则
- 短进程优先原则
- 时间片原则
在非抢占式调度方式中,引起进程调度的原因有:
- 正在执行的进程执行完毕,或因发生某事件而使其无法执行
- 正在执行的进程因提出I/O请求而暂停执行
- 进程通信/同步过程执行了某种原语(如block)
非抢占式调度方式是进程主动让出,而抢占式由调度程序去操作它让出
各类“时间”
就绪队列里的是进程,不是作业
到达时间(Arrival Time):进程进入就绪队列的时间
运行时间(Burst Time/Execution time/Running time):进程在 CPU 上执行所需的时间,在执行进程之前无法预先知道该进程的运行时间。
周转时间(Turn Around Time):进程从提交到运行结束的全部时间(进程花费的总时间)
等待时间(Waiting Time):进程等待调度(没有运行)的时间片总和(等待获取CPU的时间)
响应时间(Response Time):从进程提交到首次运行的时间段(首次运行不意味着运行完毕)
带权周转时间:周转时间/执行时间
响应时间<=等待时间
周转时间=等待时间+运行时间
周转时间=完成时间-等待时间
两道时间计算题解析
假设一个系统中有3个进程,到达时间依次为0,1,3。运行时间依次为3、5和2。若按照时间片轮转(时间片为2)调度算法调度CPU,那么各进程的平均周转时间为:____
6
其中竖着的黑线意思是到达时间,不难看出(7+3+9)/3≈6.3≈6
另外该图亦体现出RR很重要的一点:当时间片未用完且仅进程结束,时间片也会终止,进行下一轮
假设一个系统中有5个进程,它们到达的时间依次为0、1、2、3和4,运行时间依次为2、3、2、4和1,优先数分别为3、4、2、1、5。若按照非抢占优先数调度算法(优先数小则优先级高)调度CPU,那么各进程的平均周转时间为:____
5.4
先明确一点:非抢占式,也就是每个进程只要运行就能一次运行完,不会被中断。
(2+10+2+5+8)/5=5.4
短程调度和长程调度之差异
短程调度:频率高、速度快、开销小
长程调度:频率低、速度慢、开销大
*长程调度主要用于多道批处理系统,分时和实时系统不设置这个
CPU调度时机
从运行转到等待(非抢占式)
从运行转到就绪(抢占式)
从等待转到就绪(抢占式)
终止运行(非抢占式)
调度层次
名字 | 又作 | 又作 | 调度对象 |
---|---|---|---|
高级调度 | 长程调度 | 作业调度 | 作业 |
中级调度 | 内存调度 | 进程 | |
低级调度 | 短程调度 | 进程调度 | 进程(或内核级线程) |
中程调度将进程在内存和外存间换进换出(暂时不能用的进程调入外存,即挂起),以提高内存利用率。
习题
下列进度调度算法中,( )可能出现进程长期得不到运行的情况。
A、静态优先数算法
B、抢占式短作业优先算法
C、时间片轮转调度算法
D、先来先服务算法
A
抢占式CPU调度可能发生在一个进程()时。
A、从运行转到就绪
B、从运行转到等待
C、从运行转到终止
D、新建进程
A
其实意思是,从运行态,发生了抢占之后,会到哪个状态,显然是就绪态。
当系统中( )时,将不会引起系统执行进程调度原语。
A、一个新进程被创建
B、在非抢占调度中,进程A正在运行而进程B恰好被唤醒
C、当前进程执行了P操作
D、分时系统中的时间片用完
B
当然,对于A,如果当前系统的是抢占式,新进程优先级又是最高的,那其实A也不对,当然,答案给的是B。二来新进程被创建,如果是创建->静止就绪,那么被安置在外存,不参与调度(汤晓丹计算机操作系统第四版P43页上方)
B的唤醒,只是说它在就绪队列排好队了,但是不涉及调度
P操作是:当进程在等待资源的时候执行p操作,将信号量减1,如果执行减1后的信号量大于等于0,则该进程则进入执行环节,否则会继续等待。
参考与一些有学习价值的网页
geekforgeeks
[易百教程]操作系统教程