文章目录
从一个状态切换到另一个状态时,会触发一次 调度 。
- 内核运行调度程序的条件 (满足一条即可):
(1)一个进程从运行状态切换到等待状态。
(2)一个进程终止了。
早期是非抢占式策略,就是说 调度程序必须等待事件结束。另一种是 抢占式策略,当前运行的进程可以被换出。
如下图所示,进程会让 CPU 进行计算,这是个波动的图像,某个时刻可能占用 CPU 百分比很高,有时候又很低(可能去做 IO 操作了,CPU处于等待状态)。
现在要考虑的是如何选择进程来执行,即 调度算法,可以使得 CPU 的利用率变得合理。
一、调度准则
- 比较调度算法的准则
(1) CPU 利用率:
CPU 处于忙状态所占事件的百分比。
(认为 CPU 利用率越高,调度算法效率越高。)
(2)吞吐量:
在单位时间内完成的进程数量。
(3)周转时间:
一个进程从初始化到结束,包括所有等待时间所花费的时间。
(4)等待时间:
进程在就绪队列里的总时间。
(5)响应时间:
从一个请求被提交 到 产生第一次响应所花费的总时间。
人们需要 “更快” 的服务:比如 传输文件时的高带宽;玩游戏时的低延迟。所以希望能减少响应时间【是操作系统的计算延迟】(及时处理用户的输出并尽快将输出提供给用户);减少平均响应时间的波动(在交互系统中,可预测性比高差异低平均更重要);增加吞吐量【是操作系统的计算带宽】——减少开销(操作系统开销、上下文切换)、系统资源的高效利用(CPU、I/O设备);减少等待时间。
“公平” ???? 是很重要的调度指标。
公平是指:
保证每个进程占用相同的CPU时间
保证每个进程的等待时间相同
二、调度算法
先来先服务算法(First Come First Served, FCFS)
依据进程进入就绪状态的先后顺序排列。
特点:简单。
缺点:
(1)平均等待时间波动较大,花费时间少的任务可能排在花费时间长的任务后面。
(2)可能导致 I/O 和 CPU 之间的重叠处理。CPU密集型进程会导致I/O设备闲置时,I/O密集型进程也等待。
短进程优先算法(SPN)
选择就绪队列中执行时间最短进程占用CPU进入运行状态。
缺点:
(1)可能导致饥饿,连续的短进程流会使长进程无法获得CPU资源。
(2)需要预知未来,如何预估下一个CPU计算的持续时间?有一种方法——用历史的执行时间来预估未来的执行时间,公式如下:
最高响应比优先算法(HRRN)
选择就绪队列中响应比R值最高的进程。
- R=(w+s)/s 。
其中 w:是 等待时间(waiting time),s 是执行时间(service time)。选择R值最高的进程。
该算法是在短进程优先算法的基础上改进的,关注进程等待的时间,且只考虑不可抢占的情况;
时间片轮转算法(RR, Round-Robin)
在时间片的离散单元中分配处理器,时间片结束时,切换到下一个准备好的进程。(即 让各个进程轮流占用 CPU 执行。)
这个算法的花销主要是额外的上下文切换,而且需要设置合理的时间片(如果时间片太大,会导致等待时间过长,极限情况退化成 PCFS;如果时间片太小,吞吐量会由于大量的上下文切换开销受到影响。)根据经验:维持上下文切换开销处于 1% s 以内。 (最近的系统可以是 0.1% s) 。
多级反馈队列算法(MLFQ)
- 多级队列(MQ):
把就绪队列划分成独立的队列,每个队列拥有自己的调度策略;比如最高级的队列采取短进程优先,低优先级的队列采取批处理。
不同阶段的进程的特点可能是不同的,所以需要动态地调整进程在不同队列中的级别 。——进程可在不同队列间移动的多级队列算法:时间片大小随优先级级别增加而增加;如进程在当前的时间片没有完成,则降到下一个优先级;I/O密集型进程停留在高优先级。
MLFQ算法的特点:CPU密集型进程的优先级下降很快。
公平共享调度算法(FSS, Fair Share Scheduling)
多用户共享计算机时,希望能在 ”用户“级别 实现资源共享。每个用户拥有的进程可能是不同的,最新的 Linux 采用的就是这种公平调度机制。
三、实时调度
面向实时系统,如火车、机床等,需要确保任务在规定时间内完成。
- 实时系统的定义:
正确性依赖于其时间和功能两方面的一种操作系统。 - 实时系统的分类:
(1)强实时系统:需要在保证的时间内完成重要的任务,否则会引起灾难性后果。
(2)弱实时系统:尽量完成,并非必须。
一些概念:
(1)任务(工作单元):
一次计算,一次文件读取,一次信息传递等等。
(2)周期实时任务:一系列相似的任务,任务有规律地重复。
(3)硬时限(Hard deadline):
错过任务时限会导致灾难性或非常严重的后果,必须验证,在最坏情况下能够满足时限。
(4)软时限(soft deadline):
通常能满足任务时限,如有时不能满足,则降低要求。尽力保证满足任务时限。
静态优先级调度是说 任务执行之前,任务的优先级已经确定;而 动态优先级是说随着任务的执行,优先级可能会变化。
-
速率单调调度算法(RM, Rate Monotonic)
最佳静态优先级调度;通过周期安排优先级,周期越短,优先级越高,执行周期最短的任务。 -
最早截止时间优先算法 (EDF, Earliest Deadline First)
最佳的动态优先级调度,Deadline越早,优先级越高,执行 Deadline最早的任务。