一、CPU调度的相关概念
- CPU调度 : 其任务是控制、协调进程对CPU的竞争;即按一定的调度算法从就绪队列中选择一个进程把CPU的使用权交给被选中的进程
如果没有就绪进程,系统会安排一个系统空闲进程或IDLE进程
- 系统场景
- N个进程就绪、等待上CPU运行
- M个CPU。M>=1
- 需要决策:给哪一个进程分配哪一个CPU?
二、CPU调度需要解决的问题
- WHAT:按什么原则选择下一个要执行的进程——调度算法
- WHEN:何时进行选择 —— 调度时机
- HOW: 如何让被选中的进程上CPU运行——调度过程(进程的上下文切换)
三、 CPU调度的时机
3.1系统运行时会发生很多事件:
创建、唤醒、退出等进程的控制操作
进程等待I/O、I/O中断
时钟中断(时间片用完、计时器到时)
进程执行过程中出现abort异常
事件的发生->当前运行的进暂停运行->硬件机制响应后->进入操作系统,处理相应的事件->结束处理后:
某些进程的状态发生变化,也可以有创建了一些新的进程->就绪队列改变了->需要进程调度根据预设的调度算法从就绪队列选一个进程
3.2 进程调度的时机
- 进程正常终止或由于某种错误而终止
- 新进程创建或一个等待进程编程就绪
- 当一个进程从运行态进入阻塞态
- 当一个进程从运行态变为就绪态
总之,内核对中断、异常、系统调用处理后返回到用户态时 要重新调度
四、 CPU调度过程
4.1 进程切换
进度调度程序从就绪队列中选择了要运行的进程:这个进程可以是刚刚被暂停执行的进程,也可能是令另一个进程
进程切换——是指一个进程让出处理器,由另一个进程占用处理器的过程。
进程切换的主要工作:
- 切换全局页目录以加载一个新的地址空间
- 切换内核栈和硬件上下文,其中硬件上下文包括了内核执行新进程需要的全部信息,如:CPU相关寄存器
切换过程包括了对原来进程各种状态的保存和对新进程各种状态的恢复。
4.2 上下文切换的具体步骤
场景: 进程A下CPU,进程B上CPU
- 保存进程A的上下文环境(程序计数器、程序状态字、其他寄存器。。。)
- 用新状态和其他相关信息更细进程A的PCB
- 把进程A移至合适的队列(就绪、阻塞、、、)
- 将进程B的状态设置为运行态
- 从进程B的PCB中恢复上下文(程序计数器、程序状态字、其他寄存器。。。)
上下文切换开销(COST)
- 直接开销:内核完成切换所用的CPU时间
- 保存和回复寄存器...
- 切换地址空间(相关指令比较昂贵)
- 间接开销
- 高速缓存(Cache)、缓冲区缓存(Buffer Cache)和TLB(Translation Lookup Buffer)失效
五、CPU调度算法
5.1 CPU调度算法的设计
|
用户角度 |
系统角度 |
性能 |
周转时间、响应时间、最后期限 |
吞吐量、CPU利用率 |
其他 |
可预测性 |
公平性、强制优化级、平衡资源 |
调度算法的衡量指标:
- 吞吐量 Throughput - 每单位时间完成的进程数目
- 周转时间TT(Turnaround Time)- 每个进程从提出请求到运行完成的时间
- 响应时间RT(Response Time)- 从提出请求到第一次回应的时间
- 其他指标
- CPU利用率(CPU Utilization)- CPU做有效工作的时间比例
- 等待时间(Waiting Time) - 每个进程在就绪队列(Ready Queue)中等待的时间
5.2 调度算发设计中需要考虑的问题:
- 进程控制块PCB中 - 需要记录哪些与CPU调度有关的信息
- 进程优先级及就绪队列的组织
- I/O密集型与CPU密集型进程
- 时间片
优先级
静态优先级:进程创建时指定了一个优先级、运行过程中不可改变
动态优先级:进程创建时指定了一个优先级、运行过程中可以动态变化
进程就绪队列组织
抢占与非抢占(占用CPU的方式)
- 可抢占式Preemptive(可剥夺式)- 当有比正在运行的进程优先级更高的进程就绪时,系统可强行剥夺正在运行进程的CPU,提供给更高优先级的进程使用
- 不可抢占式Non-Preemptive(不可剥夺式)- 某一进程被调度运行后,除非由于它自身原因不能运行,否则一直运行下去
I/O密集型与CPU密集型进程
- I/O密集型或I/O型(I/O-bound)- 频繁的进行I/O,通常会花费很多时间等待I/O操作完成
- CPU密集型或CPU型或计算密集型(CPU-bound)- 需要大量的CPU时间进行计算
六、时间片(Time slice 或 quantum)
一个时间段,分配给调度上CPU的进程,确定了允许该进程运行的时间长度。
6.1 确定时间片时应考虑的因素:
1.进程切换的开销
2.对相应时间的要求
3.就绪进程的个数
4.CPU能力
5.进程的行为
七、批处理系统中采用的调度算法
主要衡量算法的因素(吞吐量、周转时间、CPU利用率、公平、平衡)
7.1 先来先服务(FCFS)--First Come First Serve
特点:先进先出 First in First out(FIFO) 按照进城就绪的先后顺序使用CPU 非抢占式的
优缺点: 公平 实现简单;长进程后面的短进程需要等待很长时间,不利于用户体验
例子: 三个进程按顺序就绪: P1 ,P2 , P3
进程
P1执行需要24s, 而P2 , P3各自需要3s
1.采用FCFS调度算法:
2. 改变调度顺序:
P2 , P3,P1
7.2 短作业优先SJF(Shortest Job First)
特点: 具有最短完成时间的进程优先执行; 非抢占式的
最短剩余时间优先:(shortest Remaining Time Next(SRTN))
SJF抢占式版本,即当一个新就绪的进程比当前进程具有更短的完成时间时,系统抢占当前进程,选择新就绪的进程执行。
算法思想: 先完成短的作业;改善短作业的周转时间
例子:
非抢占式的:
(P4结束为16)
抢占式的:
(P1结束为16)
优缺点:
优点: 最短的平均周转时间(条件: 在所有进程同时可运行时,采用SJF调度算法可以得到最短的平均周转时间)
缺点:不公平(源源不断的段任务到来,可能使长的任务长时间得不到运行->产生“饥饿”现象(starvation))
7.3 最高相应比优先HRRN(Highest Response Ratio Next)
1. 是一个综合的算法
2. 调度时,首先计算每个进程的响应比R:之后总是选择R最高的进程执行
<span style="font-size:18px;"> 相应比R = 周转时间/处理时间 = (处理时间 + 等待时间)/ 处理时间 = 1 + (等待时间 / 处理时间)</span>
八、交互式系统中采用的调度算法
衡量指标(响应时间;公平;平衡)
8.1 时间片轮转调度算法
B用完了时间片后,就到了队列队尾,然后调度选择了下个进程F进入CPU(依次轮流)。。。
1. 目标: 为短任务改善平均响应时间
2. 解决思路:
- 周期性切换
- 每个进程分配一个时间片
- 时钟中断 -> 轮换
3.如何选择合适的时间片
4.优缺点
- 公平
- 有了与交互式计算,响应时间快
- 由于进程切换,时间片轮转算法要花费较高的开销
- RR对不同大小的进程是有利的(如果相同大小的进程可以看下面的例子)
5. 例子
8.2 虚拟轮转法(VIRTUAL RR)
8.3 最高优先级调度算法()
1.选择优先级最高的进程投入运行
2.通常: 系统进程优先级 高于 用户进程
前台进程优先级 高于 后台进程
操作系统更偏好 1/O型进程
3.优先级可以是静态不变的,也可以是动态调整
优先数可以决定优先级
4.就绪队列可以按照优先级组织
5.特点:实现简单;不公平(产生饥饿现象)
6.优先级反转问题(Priority Inversion)-- 又称 优先级反置、反转、倒挂
这个问题是基于 优先级抢占式的调度算法
一个低优先级的进程持有一个高优先级进程所需要的资源,使得高优先级进程等待低优先级进程运行。
影响:系统错误; 高优先级进程停滞不前,导致系统性能降低
解决方案: 设置优先级上限;优先级继承;使用中断禁止