📜  操作系统中的 CPU 调度

📅  最后修改于: 2022-05-13 01:56:11.750000             🧑  作者: Mango

操作系统中的 CPU 调度

完成流程/工作的调度以按时完成工作。

下面是关于一个过程的不同时间。



为什么我们需要调度?
一个典型的过程涉及 I/O 时间和 CPU 时间。在像 MS-DOS 这样的 uni 编程系统中,等待 I/O 的时间被浪费了,而 CPU 在这段时间内是空闲的。在多编程系统中,一个进程可以使用 CPU,而另一个进程正在等待 I/O。这只有通过进程调度才有可能。

进程调度算法的目标

不同的调度算法

先来先服务(FCFS):最简单的调度算法,根据进程的到达时间进行调度。先来先服务调度算法指出,先请求 CPU 的进程首先分配 CPU。它是通过使用 FIFO 队列实现的。当一个进程进入就绪队列时,它的 PCB 被链接到队列的尾部。当 CPU 空闲时,它被分配给位于队列头部的进程。然后从队列中删除正在运行的进程。 FCFS 是一种非抢占式调度算法。

注意:先到先得会受到车队效应的影响。

最短作业优先(SJF):最先调度突发时间最短的进程。如果两个进程的突发时间相同,则使用 FCFS 来打破平局。它是一种非抢占式调度算法。



Longest Job First (LJF):类似于 SJF 调度算法。但是,在这种调度算法中,我们优先考虑突发时间最长的进程。这本质上是非抢占式的,即当任何进程开始执行时,在完成执行之前不能被中断。

Shortest Remaining Time First (SRTF): SJF算法的抢占方式,按照最短剩余时间调度作业。

Longest Remaining Time First (LRTF): LJF算法的抢占模式,优先处理剩余突发时间最大的进程。

Round Robin Scheduling:每个进程循环分配一个固定的时间(Time Quantum/Time Slice),专为分时系统设计。就绪队列被视为循环队列。 CPU 调度程序绕过就绪队列,将 CPU 分配给每个进程,时间间隔最多为 1 时间量程。为了实现循环调度,我们将就绪队列保留为进程的 FIFO 队列。新进程被添加到就绪队列的尾部。 CPU 调度程序从就绪队列中选择第一个进程,设置一个定时器在 1 次时间间隔后中断,并调度该进程。然后会发生两件事之一。该进程可能具有小于 1 次量子的 CPU 突发。在这种情况下,进程本身会主动释放 CPU。然后调度程序将继续到就绪队列中的下一个进程。否则,如果当前正在运行的进程的 CPU 突发大于 1 时间量程,则计时器将关闭并导致操作系统中断。将执行上下文切换,并将进程置于就绪队列的尾部。然后 CPU 调度程序将选择就绪队列中的下一个进程。

基于优先级的调度(Non-Preemptive):在这种调度中,进程根据其优先级进行调度,即优先级最高的进程首先被调度。如果两个进程的优先级匹配,则根据到达时间进行调度。这里可能会导致过程饥饿。

Highest Response Ratio Next (HRRN):在这个调度中,调度响应率最高的进程。该算法避免饥饿。

Response Ratio = (Waiting Time + Burst time) / Burst time

多级队列调度:根据进程的优先级,将进程放在不同的队列中。通常高优先级进程被放置在顶级队列中。只有在顶级队列中的进程完成后,才会调度低级队列进程。它可能会饿死。

多级反馈队列调度:它允许进程在队列之间移动。这个想法是根据进程的 CPU 突发特性来分离进程。如果进程使用过多 CPU 时间,则会将其移至优先级较低的队列。

关于调度算法的一些有用的事实:



  1. FCFS 会导致等待时间过长,尤其是当第一个作业占用太多 CPU 时间时。

  2. SJF 和最短剩余时间优先算法都可能导致饥饿。考虑这样一种情况:就绪队列中存在长进程,而较短的进程不断出现。

  3. 如果 Round Robin 调度的时间量很大,那么它的行为与 FCFS 调度相同。

  4. SJF 就给定的一组进程的平均等待时间而言是最佳的,即这种调度的平均等待时间最短,但问题是如何知道/预测下一个作业的时间。

锻炼:

考虑一个需要 40 个时间单位的突发时间的系统。采用多级反馈队列调度,顶层队列的时间片为2个单位,每级增加5个单位,那么进程将在哪个队列中终止执行?


  • 下列关于 SJF 的说法错误的是?
    S1:它导致最小平均等待时间
    S2:它会导致饥饿
    (A) 只有 S1
    (B) 只有 S2
    (C) S1 和 S2
    (D) 既不是 S1 也不是 S2
    答案 (D)
    S1 是真的 SJF 总是会给出最短的平均等待时间。
    S2 是真的 SJF 会导致饥饿。


  • 考虑以下三个进程 P0、P1 和 P2 的到达时间和突发时间表。 (GATE-CS-2011)
    Process   Arrival time   Burst Time
    P0            0 ms          9 ms
    P1            1 ms          4 ms
    P2            2 ms          9 ms

    使用抢占式最短作业优先调度算法。调度仅在流程到达或完成时进行。三个进程的平均等待时间是多少?
    (A) 5.0 毫秒
    (B) 4.33 毫秒
    (三) 6.33
    (四) 7.33
    解决方案 :
    答案: – (A)
    由于就绪队列中没有其他进程,因此进程 P0 在 0 毫秒时被分配处理器。 P0 在 1 ms 后被抢占,因为 P1 在 1 ms 到达并且 P1 的突发时间小于 P0 的剩余时间。 P1 运行 4ms。 P2 到达 2 ms 但 P1 继续,因为 P2 的突发时间比 P1 长。 P1 完成后,P0 再次被调度,因为 P0 的剩余时间小于 P2 的突发时间。
    P0 等待 4 ms,P1 等待 0 ms,P2 等待 11 ms。所以平均等待时间是 (0+4+11)/3 = 5。




  • 考虑以下一组进程,到达时间和 CPU 突发时间以毫秒为单位 (GATE-CS-2004)
    Process   Arrival Time    Burst Time
        P1          0              5
        P2          1              3
        P3          2              3
        P4          4              1

    使用抢占式最短剩余处理时间优先 (SRPT) 算法的这些进程的平均周转时间是多少?
    (一) 5.50
    (乙) 5.75
    (C) 6.00
    (四) 6.25
    答案 (A)
    解决方案:
    以下是执行甘特图

    P1P2P4P3P1
    145812

    周转时间 = 完成时间 - 到达时间
    平均周转时间 = (12 + 3 + 6+ 1)/4 = 5.50


  • 操作系统使用最短剩余时间优先 (SRTF) 进程调度算法。考虑以下流程的到达时间和执行时间:
    Process  Execution time  Arrival time
    P1             20            0
    P2             25            15
    P3             10            30
    P4             15            45

    进程 P2 的总等待时间是多少?
    (一) 5
    (乙) 15
    (C) 40
    (四) 55
    答案 (B)
    在时间 0,P1 是唯一的进程,P1 运行了 15 个时间单位。
    在时间 15,P2 到达,但 P1 的剩余时间最短。所以 P1 再继续 5 个时间单位。
    在时间 20,P2 是唯一的进程。所以它运行了 10 个时间单位
    在时间 30,P3 是最短的剩余时间过程。所以它运行了 10 个时间单位
    在时间 40,P2 运行,因为它是唯一的进程。 P2 运行 5 个时间单位。
    在时间 45,P3 到达,但 P2 的剩余时间最短。所以 P2 继续了 10 个以上的时间单位。
    P2 在时间 55 完成执行

    Total waiting time for P2 = Completion time - (Arrival time + Execution time)
                              = 55 - (15 + 25)
                              = 15

    更多问题请参考 CPU 调度测验。

    参考:
    http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/5_CPU_Scheduling.html

    http://codex.cs.yale.edu/avi/os-book/OS8/os8c/slide-dir/PDF-dir/ch5.pdf