1--基本概念
CPU调度:
从进程的就绪队列中挑选一个进程/线程作为CPU将要运行的下一个进程/线程;
在下图中,进程产生状态转换时(运行→结束、运行→等待,等等)都会发生相应的CPU调度;
内核运行调度程序进行CPU调度的条件:(满足其一即可)
① 一个进程从运行状态切换到等待状态;
② 一个进程被终止了;
调度程序分为抢占式和非抢占式调度,同时抢占式和非抢占式可以发生在用户态和内核态:
① 非抢占式调度:
调度程序必须等待当前事件结束(当前进程结束后才能执行其它进程);
② 抢占式调度(切换当前进程,抢占CPU执行另一个进程)情形:
调度程序在中断被响应后就执行;
当前进程从运行态切换至就绪态,或者一个进程从等待态切换至就绪态;
当前运行的进程可以被换出;
2--调度原则
CPU调度需要考虑多方面的因素,包括:
① CPU使用率:CPU处于忙碌状态所占时间的百分比;
② 吞吐量:单位时间内完成的进程数量;
③ 周转时间:一个进程从初始化到结束,包括所有等待时间的总和;
④ 等待时间:进程在就绪队列中的总时间;
⑤ 响应时间:一个请求被提交到产生第一次响应所花费的总时间;
CPU调度需要遵循以下原则:
① 高带宽(吞吐量表示操作系统的计算带宽)、低延迟(响应时间表示操作系统的计算延迟);
② 减少响应时间;
③ 减少平均响应时间的波动;
④ 增加吞吐量:减少系统开销、实现CPU、I/O等系统资源的高效利用;
⑤ 减少每个进程的等待时间;
⑥ 确保公平性:尽量保证每个进程占用CPU的运行时间和在就绪队列的等待时间相同;
3--调度算法
FCFS算法:
FCFS 表示先来先服务算法(First Come, First Service),通过一个队列来管理进程,按进队顺序执行相应的进程;
FCFS 算法规定,如果当前执行的线程阻塞,则 CPU 的使用权移交给下一个进程;
FCFS算法缺点:
由于进程入队的顺序不确定,进程的平均等待时间波动较大;
FCFS 算法可能会导致花费时间少的任务排在花费时间长的任务之后,导致等待时间变长;
短进程优先算法:
SPN(Shortest process next)、SJF(Shortest job first)、SRT(Shortest remaining time)等均为短进程优先算法,其首先对进程进行排序,按照预测的运行时间进行排序和入队,短进程将优先执行;
短进程优先算法具有最优的平均等待时间,但其可能会导致长时间进程无法执行,破坏公平性原则;因为当不断有短进程出现时,短进程会优先排在长进程前,导致长进程长时间不能由 CPU 执行;
短进程优先可以分为抢占式和非抢占式,抢占式的算法会在每一个 CPU 时间片后进行判断,当前进程的剩余执行时间与新进程执行时间的长短,如果新进程的执行时间更短,可能会抢占 CPU 执行新的进程;
最高响应比算法:
HRRN(Highest Response Ratio Nest)算法(不能抢占)会计算每个进程的响应比,选择响应比最高的进程优先执行;
响应比 R = (w + s) / s; w表示进程的等待时间,s表示进程的服务(运行)时间;
4--实时调度
实时调度系统可以分为强实时调度系统和弱实时调度系统;
强实时调度系统:要求在保证的时间内完成重要的任务,必须完成;
弱实时调度系统:要求重要的进程其优先级更高,需要尽量完成,非必须;
强实时和弱实时调度系统相应地引出硬时限和弱时限(deadline):
硬时限:当错过最后期限时会导致灾难性的严重后果,必须验证在最坏情况下也能满足期限;
软时限:理想情况下,期限应该被最大满足,可以相应地降低要求;
实时调度算法:
RM速率单调调度:最佳的静态优先调度,通过周期安排调度,周期越短优先级越高,执行周期最短的进程;
EDF最早期限调度:最佳的动态优先调度,deadline期限越早优先级越高,执行deadline最早的进程;
5--优先级反转
优先级反转:
高优先级任务被低优先级任务阻塞,高优先级任务不能得到调度,中等优先级任务抢占CPU资源的异常现象;
具体实例如下:
有三个线程即Thread A (高优先级)、Thread B(中优先级)、Thread C(低优先级),线程A的执行需要获取线程C的资源,此时线程A会因为线程C而阻塞,指导资源得到满足;这时为了满足线程A的继续执行,线程C会执行并返回相应的资源;然而在线程C执行时,由于线程B的优先级高于线程C,所以线程B会抢占CPU,导致线程C无法顺利执行;当线程C无法执行时,线程A也无法顺利执行,尽管线程A的优先级最高;
解决优先级反转的两个方法:
优先级继承:让低优先级线程继承高优先级线程的优先级,即升级低优先级线程的优先级;在上面的例子中,可以将线程C的优先级临时升级为线程A的优先级;
优先级天花板:是当线程申请某共享资源时,把该线程的优先级提升为可访问这个资源的所有线程中的最高优先级,这个优先级称为该资源的优先级天花板;