概念、调度准则、先来先服务,短进程优先和最高响应比优先调度算法、时间片轮转,多级反馈队列,公平共享调度算法和ucore调度框架、实时调度和多处理器调度、优先级反置
背景
- 上下文切换
- 切换任务,保存当前进程的PCB,读取下一个进程的PCB。
调度原则
- 调度策略
- 抢占式
- 调度程序在中断被相应后执行。
- 运行进程可以被打断,CPU执行其他进程。
- 非抢占式
- 调度程序必须等待事件结束。
- 不能被切换,类似串行,必须等待运行进程结束才能执行。
- 抢占式
- 程序执行模型
- 程序在CPU突发和IO操作
- IO操作的时候,不占用CPU资源,所以此时CPU占用率很低。此时应该调度CPU,使其一直处于利用率较高状态,吞吐率高。
- 比较调度算法准则
- CPU使用率
- 吞吐量:在单位时间内完成的进程数量。
- 等待时间:进程在就绪队列中的总时间
- 周转时间:进程从初始化到结束,包括等待时间,所花费的时间。
- 响应时间
例子:1水龙头出水和2水井灌溉,1响应时间短,2吞吐率高,但有延时。响应时间和吞吐量是矛盾的。
- 原则
- 吞吐量 vs 延迟
- 服务器和桌面系统,linux采用不同的策略,前者更看重吞吐量,后者看重响应速度。
- 公平性
- 每个进程都能分到大致相同的时间片。
调度算法
实时调度
-
先来先服务
- 优点简单
- 缺点: 平均等待时间波动大{非抢占式},花费少的任务可能排在后面。
-
短任务优先
- 可以是抢占式或者不可抢占式
- 比如w进程执行了1s,剩余8s,这时候来了一个进程a,执行时间是5s,剩余时间小于w,不抢占式是将a插入阻塞队列,等w执行完再执行a,抢占式是将w由运行态转为就绪态,挂起到就绪队列,执行a。
- SRT:(最短剩余时间 short remaining time) 可抢占。
- SPN:不可抢占
- 优点:最优平均等待时间要好于先来先服务算法。因为长执行时间在前面,后面的短执行时间等待时间就变长了。所以平均等待时间短。
- 缺点:1. 可能导致饥饿(如果操作系统执行过程中不断有短任务插入,插在长任务前,长任务就一直得不到执行,违反了公平性。2.需要预知程序执行时间(一般情况不知道程序执行时间)
- 时间预估
根据以往单位时间内进程的执行时间,推断将来执行时间。然后根据执行时间进行排序。
- 可以是抢占式或者不可抢占式
-
最高响应比优先
R = w+s / s(w:waiting time 等待时间;s:service time 执行时间),选择R值最高的进程执行。- 关注等待时间长的进程,防止无限期推迟
- 短任务只考虑执行时间,最高响应比既考虑了执行时间,又考虑了等待时间。
- 缺点:1.仍旧需要预估执行时间。2.不支持抢占,同样来了一个更高响应比,造成低响应比饥饿,但相对于短任务优先更多的考虑了等待时间。
-
轮询调度算法
各个进程轮流调用CPU,获取时间片执行。- 好处:公平性提升
- 花销:额外的上下文切换
- 时间片设置过大或者过小都会有问题
- 依据经验,linux系统0.001s,目标是使上下文切换时间占1%,其余99%用于进程执行。
-
多级反馈队列
- 多级队列:根据进程优先级进行排队,前台进程优先级高,后台进程优先级低
- 多级反馈队列:
- 有些任务随着执行时间延长,优先级降低-CPU密集型
- 有些任务随着执行时间延长,优先级增加-IO密集型(交互型操作)
- 比如交互进程,先开始优先级高,随着时间,开始IO阻塞,这时候提高他的优先级,然后进行CPU密集型操作,再去降低它的优先级。
-
FFS公平共享调度算法
用户级别对进程公平性进行提升(对于用户群组为了保证每个用户的进程都能得到执行)
实时调度
上面讲的是通用的调度算法,本节讲的针对的具体对象不同。
- 硬实时系统:特定时间内,必须完成重要的任务。(控制水坝)
- 软实时系统:重要的进程尽量完成,非必须。(观看视频掉帧)
工作单元:Released相当于进程就绪态,execution time相当于进程的执行时间,相对截止,因为工作是一个单元+一个单元,所以这是单元或者阶段任务结束时间。绝对终止,就是任务彻底执行完的时间。
如图:周期p=5,执行时间应该0<t<5,U=e/p - 硬时限:保证必需在最后时限完成,即在执行周期内必需完成。
- 软时限:尽最大努力保证,尽量在最后时限完成。
- 静态优先级调度:根据优先级选择任务去执行,在执行前任务优先级就确定了。
- 动态优先级调度:任务优先级随着任务执行过程中,优先级动态变化,在不同时刻。
如图两种实时调度算法。
多处理器调度
通用调度和实时调度都是针对一个cpu,本节讨论多CPU情况。须解决问题:1.进程分配给哪个CPU。2.多个CPU如何做到负载均衡。
优先级反转
如图:由于共享资源,导致T1(优先级高)需要等待T3执行,但是T2,优先级高于T3,所以T2先于T3执行,所以T2先于T1执行,优先级进行了反转。
- 解决办法:低优先级任务继承高优先级任务的优先级
导致T2无法抢占T3执行,也就无法先于T1执行了。
优先级天花板,使得占有资源的进程优先级最高,能较快的执行完成,从而使得其他进程不会等待更多时间。