8.1 背景 CPU调度
8.1.1 上下文切换:
- 切换CPU的当前任务,从一个进程/线程转换到另一个进程/线程;
- 但是切换之前要保护现场,保存当前进程/线程在PCB/TCP中的执行上下文(也就是CPU的状态);
- 切换任务,当然要读取下一个进程/线程的上下文。
8.1.2 CPU调度:
- 从就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程;
- 需要调度程序(挑选进程/线程的内核函数);
- 需要考虑的问题是 调度的时机。
8.1.3 在进程/线程生命周期的什么时候进行调度?
从一个状态到另一个状态的时候会发生调度。
8.1.4 内核运行调度程序的条件(满足其一即可)
- 一个进程从运行状态切换到等待状态
- 一个进程被终结了
8.1.5 CPU调度方式
(1)不可抢占
调度程序必须等待事件结束(效率低,不采用);
(2)可以抢占
- 调度程序在中断被响应后执行;
- 当前的进程从运行切换到就绪,或者一个进程从等待切换到就绪;
- 当前运行的进程可以被换出。
注意,以上一般指用户态;内核态也可能涉及到是否抢占。
8.2 调度原则
(1)调度策略
(2)程序执行模型
执行模型:程序在CPU突发和I/O中交替
->每个调度决定都是关于在下一个CPU突发时将哪个工作交给CPU;
->在时间分片机制下,线程可能在结束当前CPU突发前被迫放弃CPU;
(3)比较调度算法的准则
- CPU使用率:CPU处于忙状态所占时间的百分比;
- 吞吐量:在单位时间内完成的进程数量;
- 周转时间:一个进程从初始化到结束,包括所有等待时间所花费的时间;
- 等待时间:进程在就绪队列中的总时间;
- 响应时间:从一个请求被提交到产生第一次响应所花费的时间。
(4)吞吐量vs延迟
- 对快的评价指标:传输文件时的高带宽;玩游戏时的低延迟(这两点相互独立);
- 减少响应时间:及时处理用户的输出并尽快将输出提供给用户;
- 减少平均响应时间的波动:在交互系统中,可预测性比高差异/低平均更重要;
- 增加吞吐量:减少开支(操作系统开支/上下文切换);系统资源的高效利用(CPU,I/O设备);
- 减少等待时间:减少每个进程的等待时间。
低延迟调度增加了交互式表现(个人电脑):
如果移动了鼠标,希望屏幕迅速反馈光标的移动。
操作系统保证吞吐量不受影响(服务器):
若想结束长时间的编程,所以操作系统必须不时进行调度,即使存在许多交互任务。
吞吐量是操作系统的计算带宽;响应时间是操作系统的计算延迟。