三、处理机调度
文章目录
进程调度是有代价的,频繁进行进程调度就会把时间用在进程的调度上,而真正用户数据的处理的时间就变少了,就使整个系统的效率下降。
【注意】处于临界区的进程,也可能因为中断、抢占而被调度。
1.三个调度层次
1.1高级调度/作业调度
长程调度、作业调度
调度的对象是作业,外存静态的作业。
过程:外存有很多个作业(程序),按一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程。每个作业只调入一次,调出一次。作业调入时会建立PCB,调出时撤销PCB。
用户向系统提交一个作业 = 用户让操作系统启动一个程序(来处理一个具体的任务)。
1.2中级调度/内存调度
中程调度、内存调度
调度的对象是挂起的进程。
目的:提高内存利用率和系统的吞吐量。
暂时调到外存等待的进程状态,就是挂起。但是PCB还是会在内存。
1.3低级调度/进程调度
短程调度、进程调度、处理机调度
调度的对象是进程、LWP。
进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。
进程调度的频率很高,一般几十毫秒一次。
作业调度(高级调度) | 内存调度(中级调度) | 进程调度(低级调度) | |
---|---|---|---|
发生频率 | 低 | 中 | 高 |
发生方式 | 外存->内存(作业) | 外存->内存(进程) | 内存->CPU |
对进程状态的影响 | 无->创建态->就绪态 | 挂起态->就绪态 | 就绪态->运行态 |
2.何时进行进程调度
- 可以进行调度
- 进程主动放弃处理机(有的系统中只允许主动放弃处理机)
- 进程正常终止
- 进程发生异常终止
- 进程主动请求阻塞(如等待I/O)
- 进程被动放弃处理机
- 进程时间片用完
- 有更紧急的处理(如I/O中断)
- 有更高优先级的进程进入就绪队列
- 进程主动放弃处理机(有的系统中只允许主动放弃处理机)
- 不可以进行调度
- 在处理中断的过程。中断处理很复杂,与硬件密切相关,很难进行进程切换。
- 进程在操作系统内核程序临界区。(但是普通临界区可以调度、切换)
- 在进行原语操作。
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:访问临界资源的那段代码。
内核程序临界区:一般是用来访问某种内核数据结构的,比如进程的就绪队列(由各就绪进程的PCB组成)。
(2012联考)进程处于临界区时不能进行处理机调度(×)
这里的临界区时普通的临界区,他不会影响操作系统内核的工作,所以可以进行进程调度。
3.进程调度方式
3.1非抢占调度方式
非抢占方式、非剥夺调度方式。
只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
引起它调度的原因有:
- 进程运行完毕
- 主动放弃CPU进行阻塞(I/O请求)
- 在进程通信、同步的过程中执行了某种原语。
特点:实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统。
3.2抢占调度方式
抢占方式、剥夺调度方式。
当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
原则:
- 优先级原则
- 短进程优先原则
- 时间片原则
特点:可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统。
4.进程调度、切换
- “广义的进程调度”、“狭义的进程调度”、“进程切换”的区别:
进程切换:指一个进程让出处理机,由另一个进程占用处理机的过程。
狭义的进程调度:指的是从就绪队列中选中一个要运行的进程。(这个进程可以是刚刚被暂停执行的进程,也可能是另一个进程,后一种情况就需要进程切换)
广义的进程调度:包含了选择一个进程和进程切换两个步骤。
进程切换的过程主要完成了:
- 对原来进程保存CPU现场信息(给PCB);
- 对新的进程各种数据进行恢复。
(如:程序计数器PC、程序状态字PSW、各种数据寄存器等处理机现场信息,这些信息一般保存在进程控制块PCB)
【注意】进程切换是有代价的,因此如果过于频繁的进行进程调度、切换,必然会使整个系统的效率降低,使系统大部分时间都花在了进程切换上,而真正用于执行进程的时间减少。
5.调度器、闲逛进程
5.1调度器/调度程序 scheduler
调度程序:控制让哪个程序运行,运行多久。
调度时机――什么事件会触发“调度程序”?
- 创建新进程。
- 进程退出。
- 运行进程阻塞。
- I/O中断发生(可能唤醒某些阻塞进程)。
- 非抢占式调度策略,只有运行进程阻塞或退出才触发调度程序工作。
- 抢占式调度策略,每个时钟中断或k个时钟中断会触发调度程序工。
5.2闲逛进程 idle
CPU不会彻底闲下来,调度程序永远的备胎,没有其他就绪进程时,运行闲逛进程(idle)。
闲逛进程的特性:
- 优先级最低
- 可以是0地址指令,占一个完整的指令周期(指令周期末尾例行检查中断)
- 能耗低
6.调度算法目标
处理机调度算法的共同目标:
- 资源利用率
- 公平性
- 平衡性
- 策略强制执行
批处理系统的目标:
- 平均作业周转时间短
- 系统吞吐量高
- 处理机利用率高
分时操作系统目标:
- 保证响应时间快
- 保证均衡性
实时操作系统目标:
- 保证满足截止时间要求
- 保证可预测性
7.调度算法的评价指标
CPU利用率
C
P
U
利用率
=
有效工作时间
总工作时间(有效
+
空闲等待)
CPU利用率=\frac{有效工作时间}{总工作时间(有效+空闲等待)}
CPU利用率=总工作时间(有效+空闲等待)有效工作时间
系统吞吐量:单位时间完成的作业数量。
系统吞吐量
=
总共完成的作业数
总共花费的时间
系统吞吐量=\frac{总共完成的作业数}{总共花费的时间}
系统吞吐量=总共花费的时间总共完成的作业数
周转时间:作业从提交的系统到作业完成是时间(越小越好)。
(作业)周转时间
=
作业完成时间刻
−
作业提交时间刻
=
等待时间
+
运行时间(理解,但这个不常用)
\color{red}(作业)周转时间=作业完成时间刻-作业提交时间刻 \\ =等待时间+运行时间(理解,但这个不常用)
(作业)周转时间=作业完成时间刻−作业提交时间刻=等待时间+运行时间(理解,但这个不常用)
平均周转时间:
平均周转时间
=
周转时间之和
作业数
\color{red} 平均周转时间=\frac{周转时间之和}{作业数}
平均周转时间=作业数周转时间之和
带权周转时间一定是 >=1 的。(越小越好)。
带权周转时间
=
周转时间
作业实际运行的时间
带权周转时间=\frac{周转时间}{作业实际运行的时间}
带权周转时间=作业实际运行的时间周转时间
等待时间:在等待处理机的时间。调度算法一般影响的就是等待时间。
响应时间:用户从提交请求到首次产生响应的时间。
相应比:
相应比
=
等待时间
+
要求服务时间
要求服务时间
相应比 = \cfrac{等待时间+要求服务时间}{要求服务时间}
相应比=要求服务时间等待时间+要求服务时间
❗8.调度算法
8.1非抢占式
这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间等评价系统整体性能的指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕,不适合用于现在交互式系统的调度算法。
因此这三种算法一般适合用于早期的批处理系统,当然,FCFS算法也常结合其他的算法使用,在现在也扮演着很重要的角色。
8.1.1先来先服务FCFS
first come first server
按照作业/进程到达的先后顺序进行服务。
用于作业、进程调度。
优点:公平,算法实现简单,系统开销小。
缺点:排在长作业后面的短作业的带权周转时间大。对长作业有利,对短作业不利。
长作业是占用很长时间CPU,少用I/O的进程,可以理解成CPU繁忙型。
不会造成饥饿。
8.1.2短作业优先SJF
short job first
短作业优先级高(先运行):先来的作业先进行,进行完了之后,使用SJF挑选最短的作业放入后面。
用于进程时叫短进程优先SPF。SJF和SPF都是非抢占式的,但是最短剩余时间优先(SRTN) 是抢占式的。
最短剩余时间优先(SRTN):每次进入一个新的作业(进程),会重新计算每一个作业剩余的时间有多少,重新规划下一个剩余时间最短的作业放入后面。
优点:最短的平均等待时间。
缺点:对短作业有利,对长作业不利。
可能会导致长作业饥饿
【注意】
- 如果题目中未特别说明,所提到的“短作业/进程优先算法”默认是非抢占式的。
- 在所有进程都几乎同时到达时,采用SJF调度算法的平均等待时间、平均周转时间最少(可以抢占的话那就SRTN,所有实际是不一定)。
8.1.3高响应比优先HRRN
highest response ratio next
第一个进程先进行,完成之后主动放弃,这时候计算作业的响应比(等待时间是:不同的进程此时已经等待的时间)。响应比(response ratio)大的优先。
相应比一定>=1。
相应比
(
>
=
1
)
=
已经等待时间
+
要求服务时间
(
运行时间
)
要求服务时间
相应比(>=1)=\frac{已经等待时间+要求服务时间(运行时间)}{要求服务时间}
相应比(>=1)=要求服务时间已经等待时间+要求服务时间(运行时间)
用于作业、进程调度。
优点:综合考虑了等待时间和运行时间,从而避免了长作业饥饿的问题。
不会造成饥饿。
8.2抢占式
交互式系统
8.2.1时间片轮转RR
round robin
用于分时操作系统。
将就绪进程按照FCFS排成一个就绪队列,设置一个时间片(分割为大小相同的时间片),一个进程在时间片内未执行完,剥夺处理机(时钟中断),并把它重新放到队尾。
仅用于进程调度。
优点:公平、响应快,适合分时操作系统,人机交互。
缺点:高频率进程切换,开销太大。不区分任务紧急程度。
不会造成饥饿。
【2010年408真题】进程时间片用完是降低进程优先级的合理时机。
如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度RR算法退化为先来先服务FCFS调度算法,并且会增大进程响应时间。因此时间片不能太大。
另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
一般来说,设许时间片时要让切换进程的开销占比不超过1%。
8.2.2优先级调度算法
priority-scheduling algorithm
可以抢占也可以不抢占。
实时系统的进程调度是抢占式优先级高优先算法。
用于作业、进程调度。
根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种:
- 静态优先级:优先级在创建进程时确定,保持不变。
- 动态优先级:在进程创建初赋予一个优先级,后续会随着进程或时间改变而改变。
优点:用优先级区分紧急程度,可以灵活地调整进程。
缺点:如果一直有高优先级的进程进入,那么低优先级就饥饿。
低优先级可能会造成饥饿。
【注意】就绪队列未必只有一个,可以按照不同优先级来组织。也可以把优先级高的进程排在更靠近队头的位置。
- 如何设置优先级:
系统进程优先级高于用户进程
前台进程优先级高于后台进程
I/O型进程(I/O繁忙型进程)优先级高于计算型进程(CPU繁忙型进程)
因为I/O尽早的开始工作,资源利用率、系统吞吐量越高
- 如何调整动态优先级:
可以从追求公平、提升资源利用率等角度考虑:
- 如果某进程在就绪队列中等待了很长时间,则可以适当提升其优先级
- 如果某进程占用处理机运行了很长时间,则可适当降低其优先级
- 如果发现一个进程频繁地进行l/O操作,则可适当提升其优先级
8.2.3多级反馈队列MLFQ
multilevel feedback queue
FCFS算法的优点是公平。
SJF算法的优点是能尽快处理完短作业,平均等待/周转时间等参数很优秀。
RR算法可以让各个进程得到及时的响应。
优先级调度算法可以灵活地调整各种进程被服务的机会。
综合上述5种算法,得到综合表现最好的算法:多级反馈队列调度算法MLFQ。
设计多级反馈队列调度算法,需要考虑的是:(2020年408真题)
- 就绪队列的数量;
- 就绪队列的优先级;
- 各级就绪队列的调度算法;
- 进程在就绪队列的迁移时间。
流程:划分多个队列,每个队列内部采用FCFS,队列1的进程执行完成之后进入队列2的队尾。当队列1有进程时,队列2内进程无法进行,上一级队列空,下一级队列开始进行。
当发生更高优先级进程进入,会剥夺当前进程的处理机,放入它当前出发的队列(而不是下一级队列),然后进程新来的优先级高的进程。
时间片越往下越大,优先级越往下越小。
用于进程调度。目前公认最好。
可能会造成饥饿。
缺点:系统开销大。
【注意】各队列可采用不同的调度策略,如:
- 系统进程队列采用优先级调度
- 交互式队列采用RR
- 批处理队列采用FCFS