单处理器调度
调度类型
-
主要类型
长程调度:决定将哪个进程放入进程池中
中程调度:决定将哪些进程部分或者全部放入内存中
短程调度:决定哪个空闲进程上处理机
I/O调度:决定哪个进程的I/O请求被可用的I/O设备处理 -
处理器调度和进程状态变化
调度的主要目的是不断安排进程在处理器上执行
- 长程调度主要是创建作业: 新建→就绪(批处理作业会比较明显)
- 中程调度主要是全部或者部分内存空间换进换出: 阻塞/挂起→就绪
- 短程调度主要是选择进程获得处理器运行: 就绪→运行
层次越往下发生的频率越高(一般时间片在几十到上百ms,短程调度会非常频繁)
- 队列图
从某种意义上,调度是管理队列以最小化排队延迟和优化性能的问题。现在的个人计算机以交互式为主(interactive user),需要立刻创建任务并响应,一般都不是批处理任务,所以本章的重点在于短程调度(低级/微观)。
了解一些短程调度的条件:当发生可能导致当前进程阻塞或可能提供机会抢占当前正在运行的进程以支持另一个进程的事件时调用
- 时钟中断:时间片到了,需要进程切换
- I/O 中断:进程发出I/O请求需要从运行→阻塞,进程发生切换
- 系统调用:例如exec(),进程执行过程中执行其他程序,需要进程切换
- 信号:例如Ctrl+C,发送kill信号杀死当前进程
调度准则
-
定量分析
了解一下周转时间、响应时间、截止时间等概念,主要用于评价调度算法的性能
由于考虑系统开销的时间所以Tr = Ts + sometime。所以Tw不小于1
响应时间多指进程第一次被调度,获得处理器的时间。而交互式的响应时间一般是在2s以内。 -
定性分析
主要是对于公平性进行分析(有无死锁和饥饿等)
优先级
在就绪队列按照优先级排列,进程调度按照优先级调度
Unix使用位图实现常数级的速度找到队列的第一个可调度对象。位图(Bitmap)是一种特殊的数据结构,它使用位(Bit)序列来表示信息。
- 静态优先级
创建进程的同时确定,一般为一个整数。会根据进程类型,资源需求和用户要求变化。
一般给与I/O进程更高优先权,防止CPU型进程获取CPU时间过长,使得所有资源可以均衡利用,进程调度也可以更加公平。
-
动态优先级
-
选择函数
这里有三个参考指标w(等待时间)、e(执行时间)、s(所需要的时间)
调度策略
两种方式
调度策略主要分为两种方式:抢占式和非抢占式调度
非抢占式调度:运行态进程一直执行直到终止或阻塞
抢占式调度:运行态进程在执行的过程中可以被剥夺处理机,强制进程切换
抢占原则
- 优先权原则
- 短作业/进程优先原则
- 时间片原则
折中方式: - 内核不允许抢占
- 其他可以抢占
算法思路
我们先假设一个进程队列
第一列是进程名,第二列是进程的到达时间,第三列是需要占用的CPU时间
(1)FCFS(先来先服务)
顾名思义,FCFS就是先到的进程先服务,服务完了继续下一个,按照先来后到的顺序。
先来先到是一种基础调度策略,我们在很多的算法中都有所涉及,但是性能不是很好。
在这个例子中,由于A进程一开始占用了大量的CPU时间,导致了B和C等待的时间过长,所以平均周转时间很大。
长进程/作业占据CPU的时间过长,短作业处于劣势(一直等待,即护航效应)
同理CPU型进程长时间占据CPU,导致I/O型进程很难进行完,容易导致饥饿。
(2)时间片轮转(round robin)
- 基于抢占式的调度策略
- 时钟中断定期产生
- 中断发生就需要回到就绪队列,然后等待调度
如图示的进程到来和执行时间
时间片调度策略还是基于先来先服务,也就是优先选择在队列中队首的进程执行
跟FCFS不同的是,进程的时间片到了就要下处理机,放到就绪队列末尾,选择队首的进程继续执行。
不过要注意一下:可能在同一时刻,刚好上一个进程执行完了,并且有一个新的进程要进来,这时把刚执行完的放到最后,新来的排倒数第二。
这里的q = 1表示时间片为1,时间片小能快速响应进程的服务,但是切换的开销比较大
相反q = 4能减小进程切换的系统开销,但反应速度下降
对于I/O型进程,会因为频繁阻塞而重新就绪然后运行,在执行过程中非常不利,有学者就提出来VRR算法
使用一个AUX队列(优先级高于普通的就绪队列中的进程),提高公平性
(3)最短时间进程优先(SPN/SJF)
基于短作业优先策略,选预计执行时间最短的进程
- 如图,改善平均周转时间和平均带权周转时间;
- 难以准确估计进程执行时间,影响调度性能;
- 有利于短进程,对长进程非常不利,可能饥饿(短进程源源不断到达,长进程不断靠后)
(4)最短剩余时间优先(SRT)
回顾我们之前发生死锁的解决方案,就是要及时撤销一个没有执行多少时间,剩余执行时间最长的进程,减少对于进程自身损失。
抢占式调度算法:当有新进程到来时,SRT根据每个进程的剩余时间多少选择进程剩余执行时间最短的运行,偏向于短进程。
在10s的时候,B和D都是剩余5个时间片,OS会优先调度B,因为TLB和cache中可能会有B的痕迹,可以更加高效的执行。
(5)最高响应比优先(HRRN)
- R = (W + S)/ S,W表示wait等待时间,而S表示service是服务时间
- 基于非抢占式策略(Nonpreemptive policy)
- FCFS和SPN的折中:需估计处理时间
如图所示,A先来先执行,然后是B执行完,此次是C、D、E都来了,此时就要计算R值
t = 9:RC=1+5/4
RD=1+3/5
RE=1+1/2
选择最高响应比的C执行
t = 13:RD=1+7/5
RE=1+5/2
选择最高响应比的E执行
HRRN算法一般不会产生饥饿,可以把R看成是进程的某种优先级
(6)优先级调度
优先级调度算法又称优先权调度算法,该算法既可以用于作业调度,也可以用于进程调度,该算法中的优先级用于描述作业运行的紧迫程度。
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最髙的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
假设有四个作业的单道系统,它们的提交、运行时间如下表所示(时间单位:小时,以十进制进行计算,当前时刻是8.0)。若采用基于优先权的抢占式调度算法(优先数越小优先级越高),试回答:作业应以怎样的顺序调度?给出分析过程,并计算平均带权周转时间。
A先来先执行,执行到8.5s的时候B来了,比较两者优先级,B的优先级更低所以A继续执行。
9.0s的时候C到来,由于C的优先级更高,所以A下处理机,C上处理机执行。以此类推,得到如下的时间表:
作业号 | 到达时间 | 运行时间 | 优先数 | 开始时间 | 完成时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|---|---|---|
A | 8.0 | 2.0 | 4 | 8.0 | 10.2 | 2.2 | 1.1 |
B | 8.5 | 0.5 | 6 | 11.2 | 11.7 | 3.2 | 6.4 |
C | 9.0 | 0.2 | 2 | 9.0 | 9.2 | 0.2 | 1 |
D | 9.5 | 1.0 | 5 | 10.2 | 11.2 | 1.7 | 1.7 |
如上表所示,调度顺序为A→C→D→B,平均带权周转时间为2.55小时。
实际上,优先权调度可能会不公平,较低优先级的作业可能会长时间等待,导致饥饿问题。在上述调度顺序中,作业B的到达时间比较早,执行时间也较短,但是由于优先级低最后一个执行,导致带权周转时间最大。
(7)多级反馈队列算法(MLFQ)–了解即可
问题背景:如何估计处理时间,很难让终端用户来预估每一个进程的执行时间。
核心思想:基于进程运行的过去信息来预估之后的大致运行时间,目前的OS都是基于MLFQ的优化和完善
基于优先级的抢占式和时间片的策略,优化的规则如下
- Rule 1: If Priority(A) > Priority(B), A runs (B doesn’t).
- Rule 2: If Priority(A) = Priority(B), A & B run in round-robin fashion using the time slice (quantum length) of the given queue.
- Rule 3: When a job enters the system, it is placed at the highest priority (the topmost queue).
- Rule 4: Once a job uses up its time allotment at a given level (regardless of how many times it has given up the CPU), its priority is reduced (it moves down one queue).(解决I/O型进程的问题)
- Rule 5: After some time period S, move all the jobs in the system to the topmost queue.(解决饥饿问题)
优点:
- 为提高系统吞吐量和缩短平均周转时间而照顾短进程
- 为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程
- 不必估计进程的执行时间,动态调节