1)CPU调度的相关概念
a.CPU调度——其任务是控制、协调进程对CPU的竞争;即按一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程;如果没有就绪进程,系统会安排一个系统空闲进程或idle进程
b.CPU要解决的三个问题
CPU调度的时机(就绪队列的改变引发了重新调度):事件发生—》当前运行的进程暂停运行—》硬件机制响应后—》进入操作系统,处理相应事件—》结束处理后:某些进程的状态会发生变化,也可能又创建了一些新的进程—》就绪队列改变了—》需要进程调度根据预设的调度算法从就绪队列选一个进程
4中情况(内核对中断/异常/系统调用处理后返回到用户态时)
进程正常终止或者由于某种错误而终止
新进程创建或一个等待进程变成就绪
当一个进程从运行态进入阻塞态
当一个进程从运行态变为就绪态
调度过程——进程切换
进程调度从就绪队列选择了要运行的进程:这个进程可以是刚刚被暂停执行的进程,也可能是另一个新的进程
进程切换:是指一个进程让出CPU,由另一个进程占用CPU的过程,包括了对原来进程各种状态的保存和对新进程各种状态的的恢复
*切换全局目录以加载一个新的地址空间
*切换内核栈和硬件上下文,其中硬件上下文包括了内核执行新进程需要的全部信息,如CPU相关寄存器
上下文切换开销:直接开销:内核完成切换所用的CPU时间(保存恢复寄存器;切换地址空间 相关指令比较昂贵)
间接开销:高速缓存(Cash)、缓冲区缓存(Buffer Cache)和TLB(Translation Lookup Buffer)失效
CPU调度算法设计:
衡量调度算法的指标:
吞吐量——每单位时间完成的进程数目
周转时间——每个进程从提出请求到运行完成的时间
响应时间——从提出请求到第一次回应的的时间
CPU利用率——CPU做有效工作的时间比例
等待时间——每个进程在就绪队列中等待的时间
进程的优先级(数)
选择时间片考虑的因素:进程切换的开销;对响应时间的要求;就绪进程个数;CPU能力;进程的行为
2)批处理系统的调度算法(吞吐量,周转时间,CPU利用率,公平、平衡)
a.先来先服务(FCFS调度算法):按照进程就绪的先后顺序使用CPU,非抢占
优点:公平,实现简单
缺点:长进程后面的短进程需要等很长时间,不利于用户体验
b.最短作业优先(SJF调度算法Shortest Job First):具有最短完成时间的进程优先执行,非抢占式
优点:(在所有进程同时可运行时,)采用SJF调度算法可以得到最短平均周期时间
缺点:不公平,源源不断的短任务到来,可能使长任务长时间得不到运行,产生“饥饿”现象
c.对短剩余时间优先:SJF抢占式版本,即当一个新就绪的进程比当前运行进程具有更短完成时间时,系统抢占当前进程,选择新就绪的进程执行
d.最高响应比优先(Highest Response Ratio Next)(折衷权衡):调度时,首先计算每个进程的响应比R;之后,总是选择R最高的进程执行
响应比R = 周转时间/处理时间 = (处理时间 + 等待时间)/ 处理时间 = 1 + (等待时间 / 处理时间)
3)交互式系统中采用的调度算法(响应时间,公平、平衡)
a.时间片轮转调度算法:(不适合相同大小的进程)
目标:改善了短任务平均响应时间
解决问题的思路:周期性切换;为每个进程分配一个时间片;时钟中断——》轮转
典型的时间片长度:10ms~100ms
优点:公平;有利于交互式计算,响应时间快
缺点:由于进程切换,时间片轮转算法要花费较高的开销
b.最高优先级调度:选择优先级最高的进程投入运行
通常:系统进程优先级高于用户进程;前台进程优先级高于后台进程;操作系统更偏好I/O型进程
优点:简单
缺点:不公平,有饥饿现象
优先级反转问题:一个低优先级进程持有一个高优先级进程所需要的资源,使得高优先级进程等待低优先级进程运行
影响:系统错误;高优先级进程停滞不前,导致系统性能降低
解决方案:设置优先级上限;优先级继承;使用中断禁止
c.多级反馈队列:设置多个就绪队列,第一级队列优先级最高
给不同就绪队列中进程分配长度不同的时间片,第一级队列时间片最小,随着队列优先级别的降低,时间片增大
当第一级队列为空时,在第二级队列调度,以此类推
各级队列新创建进程就绪后,进入第一级队列
进程用完时间片而放弃CPU,进入下一级就绪队列
由于阻塞而放弃CPU的进程进入相应的等待队列,一旦等待的事件发生,该进程回到原来一级就绪队列(队尾or队首……)
d.最短进程优先
4)多处理器调度算法设计
不仅要决定选择哪个进程执行,还要决定在哪个CPU上执行
要考虑进程在多个CPU之间迁移时的开销(高速缓存失效,TLB失效,尽可能使进程总在同一个CPU上执行)
考虑负载均衡问题
5)典型操作系统所采用的调度算法
a.UNIX 动态优先数法
b.5.3BSD 多级反馈队列法
c.Linux 抢占式调度
d.Windows 基于优先级的抢占式多任务调度
调度单位是线程,采用基于动态优先级的、抢占式调度,结合时间配额的调整
就绪线程按优先级进入相应队列
系统总是选择优先级最高的就绪线程运行
同一优先级的各线程按时间片轮转进行调度
多CPU系统中允许多个线程并行运行
引发线程调度的条件:一个线程的优先级改变了;一个线程改变了它的亲和处理机集合
线程正常终止或由于某种错误而终止
新线程创建或一个等待线程变成就绪
当一个线程从运行态进入阻塞态
当一个线程从运行变为就绪态
Windows使用32个线程优先级,分为3类
16~31:实时优先级线程不改变其优先级
1~15:可变优先级线程:其优先级可以在一定范围内升高或降低(基本优先级和当前优先级)
0:零页线程:用于对系统中空闲物理页面清零
线程的时间配额:时间配额不是一个时间长度值,而一个称为配额单位的整数
一个线程用完了自己的时间配额时,如果没有其他相同优先级的线程,Windows将重新给该线程分配一个新的时间配额,
让它继续运行
Windows会提升这样的进程的当前优先级(针对可变优先级范围内的线程优先级)
I/O操作完成
信号量或事件等待结束
前台进程中的线程完成一个等待操作
由于窗口活动而唤醒窗口线程
线程处于就绪态超过了一定时间还没有运行——“饥饿”现象
e.Solaris 综合调度算法