📜  OS中不同CPU调度算法的比较(1)

📅  最后修改于: 2023-12-03 15:33:21.104000             🧑  作者: Mango

OS中不同CPU调度算法的比较

操作系统中的CPU调度算法决定了进程在何时被调入CPU运行、以何种优先级运行以及被调度到CPU的时间长度等。不同的调度算法会带来不同的性能和效率。本文将会介绍几种常见的CPU调度算法,并进行比较。

先来先服务(FCFS)

先来先服务,也叫FIFO(先进先出),是最简单、最容易实现的一种调度算法。按进入队列的顺序处理,即先到达的进程先执行,直到该进程执行完毕或阻塞后,才会执行下一个进程。FCFS算法的主要优点是容易实现,但是它会带来长的等待时间(特别是当CPU繁忙的时候),这可能会造成其他服务质量下降。

示例代码:

1. P1 -> (0, 5)  // 进程P1在0时刻到达,需要执行5个时间单位
2. P2 -> (3, 2)  // 进程P2在3时刻到达,需要执行2个时间单位
3. P3 -> (6, 4)  // 进程P3在6时刻到达,需要执行4个时间单位

按照FCFS算法执行这三个进程,先执行P1,再执行P2,最后执行P3。总的运行时间是11个单位时间。
最短作业优先(SJF)

在SJF算法中,操作系统按照处理时间最短的进程先执行,以此来减少平均等待时间,提高CPU利用率。当一个进程即将被调度时,操作系统需要预先估计这个进程的处理时间,如果预估不准,执行时间可能比其他算法更长。另外,SJF算法还存在着潜在的饥饿问题(即,某些进程长时间无法得到执行),特别是在短作业的面前。

示例代码:

1. P1 -> (0, 5)   // 进程P1在0时刻到达,需要执行5个时间单位
2. P2 -> (0, 2)   // 进程P2在0时刻到达,需要执行2个时间单位
3. P3 -> (3, 4)   // 进程P3在3时刻到达,需要执行4个时间单位
4. P4 -> (6, 3)   // 进程P4在6时刻到达,需要执行3个时间单位

按照SJF算法执行这四个进程,先执行P2,再执行P1,然后执行P4,最后执行P3。总的运行时间是14个单位时间。
优先级调度(Priority Scheduling)

在优先级调度算法中,每个进程都被赋予一个优先级,CPU优先执行优先级较高的进程。优先级可以是个数值,也可以被分类为多个等级。在该算法中,存在高优先级进程饥饿的问题(即,高优先级进程会比低优先级进程拥有更多的执行时间),为了避免这个问题,通常使用了动态调整优先级的技术,如Aging。

示例代码:

1. P1 -> (0, 5, 3)   // 进程P1在0时刻到达,需要执行5个时间单位,优先级为3
2. P2 -> (1, 3, 1)   // 进程P2在1时刻到达,需要执行3个时间单位,优先级为1
3. P3 -> (2, 8, 2)   // 进程P3在2时刻到达,需要执行8个时间单位,优先级为2
4. P4 -> (3, 6, 4)   // 进程P4在3时刻到达,需要执行6个时间单位,优先级为4

按照优先级调度算法执行这四个进程,先执行P4,再执行P1,然后执行P3,最后执行P2。总的运行时间是22个单位时间。
时间片轮转(Round Robin)

时间片轮转是一种基于时间片的调度算法。在该算法中,所有进程都被分配一个时间片,当CPU使用完一个时间片后,会强制将其规定的时间片分配给下一个进程。如果进程在分配的时间片内没有被执行完,操作系统会将该进程切换到队列的尾部并分配下一个进程。时间片的大小是根据具体情况而定,通常为10ms到100ms这个范围。

示例代码:

1. P1 -> (0, 6)  // 进程P1在0时刻到达,需要执行6个时间单位
2. P2 -> (2, 4)  // 进程P2在2时刻到达,需要执行4个时间单位
3. P3 -> (4, 2)  // 进程P3在4时刻到达,需要执行2个时间单位
4. P4 -> (6, 8)  // 进程P4在6时刻到达,需要执行8个时间单位
5. P5 -> (8, 8)  // 进程P5在8时刻到达,需要执行8个时间单位

假设时间片大小为2,按照时间片轮转算法执行这五个进程:
第一个时间片 (0-2) -> 执行P1;
第二个时间片 (2-4) -> 执行P2;
第三个时间片 (4-6) -> 执行P3;
第四个时间片 (6-8) -> 执行P4;
第五个时间片 (8-10) -> 执行P5;
第六个时间片 (10-12) -> 执行P1;
第七个时间片 (12-14) -> 执行P4;
......
最后执行完成所有进程。

总的运行时间依赖于时间片的长度,通常来说,时间片越小,进程调度次数越多,而且平均等待时间与响应时间都会下降。但是,如果时间片太小,进程调度的开销将会变得很大。所以,选择合适的时间片对于时间片轮转算法非常重要。
比较
  • 计算复杂度:时间片轮转算法 >= 优先级调度算法 >= 最短作业优先算法 > 先来先服务算法
  • 平均等待时间:最短作业优先算法 > 优先级调度算法 > 时间片轮转算法 > 先来先服务算法
  • 响应时间:最短作业优先算法 >= 优先级调度算法 > 时间片轮转算法 > 先来先服务算法
  • 执行效率:先来先服务算法 > 最短作业优先算法 > 时间片轮转算法 > 优先级调度算法

综合考虑各种算法的特征和性能,一些系统采用了Multilevel Feedback Queue(多层反馈队列)算法。该算法使用多个队列,将进程分为多个不同的类别,然后对不同类别的进程分配不同的优先级,并针对不同场景选择不同的调度算法。例如,如果有许多短作业,则使用SJF算法;如果CPU繁忙,则使用时间片轮转算法等。