一、常见操作系统调度策略
1、先来先服务(FCFS)
- (1)是最简单的调度算法,按照按照作业提交或进程变为就绪态的先后次序,分配 CPU。
- (2)优点:有利于长作业、CPU 繁忙的作。
- (3)缺点:不利于短作业、I/O 繁忙的作业。
2、短作业(进程)优先(SJ(P)F)
- (1)对预计执行之间短的作业(进程)优先分配 CPU,并且通常后来的短作业不抢占正在 执行的作业。
- (2)优点:比先来先服务改善平均周转时间和平均带权周转时间,缩短作业等待时间,提 高系统吞吐量。
- (3)缺点:对长作业非常不利;未能依据作业的紧迫程度来划分执行的优先级;难以准确 预估作业/进程的执行时间,影响调度性能
3、高响应比优先(HRN)
- (1)克服短作业优先缺点,响应比 R = 1 + W/T,其中 W 为等待时间,T 为执行时间,也就 是短作业优先中,优先级随着等待时间而增加。
- (2)优点:同时考虑每个作业执行时间的长短和等待时间的长短。
- (3)缺点:在同一时间段内处理的作业数少于短作业优先,因此吞吐量将小于短作业优先; 由于每次调度前都要计算响应比,系统开销也要增加。
4.时间片轮转法(RR)
- (1)将系统中所有就绪进程按先来先服务原则,排成一个队列,每次调度时将 CPU 时间片 (几 ms~几百 ms)分配给队首进程,时间片结束时将其送到队尾,如此循环。
- (2)优点:克服先来先服务不利于短作业的缺点,使短作业也能得到运行。
- (3)缺点:应当使用户输入通常在一个时间片内能处理完,否则响应时间、平均周转时间、 平均带权周转时间都会延长。
5、多级反馈队列(RRWMF)
- (1)设置多个就绪队列,分别赋予不同优先级,如逐级降低,队列 1 的优先级最高,每个 队列执行时间片的长度也不同,规定优先级越低则时间片越长,如逐级加倍。
- (2)新进程进入内存后,先投入队列 1 的末尾,按先来先服务算法调度;若按队列 1 的时 间片未能执行完,则投入到队列 2 的末尾。当较高优先级队列为空,才调度较低优先级队列。
- (3)如果进程执行时有新进程进入优先级较高队列,则抢先执行新进程,并把被强先的进程投入原队列的末尾。、
- (4)优点:为提高系统吞吐量和缩短平均周转时间而进一步照顾短进程;为获得较好的 I/O 设备利用率和缩短响应时间而照顾 I/O 型进程;不必估计进程的执行时间,可以满足各种类 型进程的需要,被公认为是一种较好的进程调度算法。
- (5)缺点:需要维护多个队列以及频繁调度,系统开销较大
6、最高优先权优先(FPF)
- (1)当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入 内存中;当用于进程调度时,把 CPU 分配给就绪队列中优先权最高的进程,这时又可分 为非抢占式优先权算法、抢占式优先权算法。
- (2)抢占式优先权算法容易出现优先级反转现象:一个低优先级任务持有一个高优先级任 务所需的共享资源,高优先级由于资源缺乏而处于受阻状态,而低优先级获得的 CPU 时 间少,如果此时有优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级 的任务反而超过这两个任务而获得 CPU 时间,造成高优先级任务无法获得资源而继续推进。
- (3)优先级反转解决方案:
- ①设置优先级上限并给临界区一个高优先级,进入临界区的进程都将获得这个高优先级,如果有其他试图进入临界区的优先级都低于这个高优先级,那么优先级反转就不会发生。
- ②优先级继承:当一个高优先级进程等待一个低优先级进程持有的资源时,低优先级进程将 暂时获得高优先级进程的优先级,在释放共享资源后,低优先级进程回到原来的优先级。 嵌入式系统 VxWorks 就是采用这个策略。
- ③临界区禁止中断:通过禁止中断来保护临界区,采用此种策略的系统只有两种优先级:可抢占优先级和中断禁止优先级。前者为一般进程运行时的优先级,后者为运行于临界区的 优先级。
7、三个概念
- (1)周转时间 = 完成时间 – 到达时间。
- (2)平均周转时间 = 周转时间 / 进程个数
- (3)平均带权周转时间 = (周转时间 / 服务时间)/ 进程个数。
二、Linux内核的三种调度策略
1、SCHED_OTHER 分时调度策略(默认)
- (1)创建任务指定分时调度策略,并指定 nice 值(-20~19)
- (2)调度程序将根据每个任务的 nice 值确定在 CPU 上的执行时间 counter。
- (3)如果没有等待,则将该任务加入就绪队列。
- (4)调度程序遍历就绪队列中的任务,对每个任务的动态优先级进行计算(counter + 20 - nice),选择计算结果最大的一个去运行,当这个时间片用完后(counter 减至 0)或主动 放弃 CPU 时,该任务将被放在就绪队列末尾或等待队列。
- (5)跳转到第(4)。
- (6)当调度程序发现所有就绪任务计算所得的权值都不大于 0 时,跳转到第(2)。
2、SCHED_FIFO 实时调度策略,先到先服务
- (1)创建进程时指定采用 FIFO,并设置实时优先级 rt_priority(1~99)。
- (2)如果没有等待资源,则将该任务加入就绪队列。
- (3)调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用 CPU, 该 FIFO 任务将一直占用 CPU 直到有优先级更高的任务就绪获得主动放弃(等待资源)。
3、SCHED_RR 实时调度策略,时间片轮转
- (1)创建任务时指定调度参数为 RR,并设置任务的实时优先级和 nice 值(将会替换为该任务的时间片长度)。
- (2)如果没有等待资源,则将该任务加入就绪队列。
- (3)调度程序遍历就绪队列,根据实时优先级计算调度权值,选择权值最高的任务使用 CPU。
- (4)如果就绪队列中的 RR 任务时间片为 0,则会根据 nice 值设置该任务的时间片,同时将 该任务放入就绪队列的末尾。重复(3)。
4、系统中既有分时调度,又有先到先服务调度和时间片轮转调度
- (1)选择分时调度的进程是非实时进程,选择先到先服务调度和时间片轮转调度的进程是 实时进程。
- (2)实时进程会抢占非实时进程。
- (3)时间片轮准调度和先到先服务调度都实时优先级作为调度权值标准,时间片轮转是先 到先服务的延伸。