循环调度算法

我正在学习本书的操作系统和我的教授的幻灯片。 我到达了“进程调度算法”一章。 谈到RoundRobin(RR)算法,我发现了一些不一致之处。 我知道这是带有时间片(quatum)的FCFS算法的抢先版本。 从现在开始,我将使用下列符号:

#1 = prof's version
#2 = book's version
#3 = other version

这里是不一致的(假设一个100ms的量子):

#1 RR使用两个队列(Q1,Q2):

  • Q1:排队不会结束量子的过程;
  • Q2:排队等待结束量子的过程;

  • 调度程序从Q1的头部开始处理;
  • 如果过程在量程到期之前结束,则进程释放CPU,调度器从Q1开始下一个进程
  • 如果过程在量程失效之前没有结束,则被抢占并放置在Q2的末尾;
  • 当一个流程准备就绪时,它将放置在Q1的末尾;
  • 当Q1为空时,Q1和Q2交换;
  • 所以当一个进程被阻塞了一个I / O请求(例如30ms之后)并且它的量子没有过期时,它被放置在Q1的末尾(我猜),当它再次被调度时,它将使用CPU剩余时间(在这种情况下为70ms)。

    #2 (本书没有提到多个队列,所以我认为它只用一个队列)

  • 调度程序从就绪队列的头部获取进程;
  • 如果进程在量程失效之前结束,则进程释放CPU,调度器从就绪队列中获取下一个进程
  • 如果该过程在量程失效之前未结束,则被抢占并放置在就绪队列的末尾;
  • #3来源

  • 调度程序将第一个进程置于就绪队列中;
  • 如果进程在量程失效之前结束,则进程释放CPU,调度器从就绪队列中获取下一个进程
  • 如果该过程在量程失效之前未结束,则被抢占并放置在就绪队列的末尾;
  • 如果进程被一个I / O请求阻塞,它将被放入一个等待队列中,当它准备就绪时,将再次放入就绪队列中;
  • 对我来说,这些是RR调度算法的3种不同实现。 我认为最有价值的是#3因为#1会导致饥饿(如果进程放置在第二季度并且新进程继续在第一季度进行,那么该进程将永远不会再安排), #2会浪费CPU时间当进程被I / O请求阻塞时。 所以,我的问题是:哪一个是正确的?


    理论上的循环法

    在思考模拟时钟时,循环调度可以非常好地形象化:手部以恒定速度旋转,所以在一次完整运行所需的时间的1/12时间内,它就处于一位数的切片中。

    因此,单个数字占总可用资源量的一部分。 而且,最重要的是,有一个固定的数字得到服务的顺序:手刚刚通过一些数字后,只有在手通过所有其他数字后才会再次访问。

    看看你提出的变种,编号为#2的书中的版本恰好符合这一点:在一个任务被服务后,它被放在一个(通常所谓的)就绪队列的末尾,因此只有在所有其他任务已经完成一次。

    作为理论上的调度算法,循环法仅考虑将多个消费者(任务)调度到单个资源(CPU)。

    变种

    基本循环调度的一些常见变化是为不同的任务使用不同的切片大小,或者根据某个度量标准动态调整任务切片,甚至为某些任务提供多个切片。

    在实践中

    当您计划任务时,您必须将它们安排为比单个资源更多的CPU,还会有其他资源需要管理,例如IO设备。

    非常简单的调度程序只是忽略了这一事实,并保留当前正在等待CPU的任务队列中某些其他资源的任务。

    所以当这样一个任务获得时间片时,它所要做的就是发现它仍然需要等待另一个资源并交还CPU,以便通过调度器返回到任务队列中。 启动任务,检查该任务是否仍需要等待其他资源,并且停止该任务需要花费一些时间,以便能够更好地花费在实际可以使用CPU的任务上。

    为了解决这个问题,每个管理的资源通常都有一个任务队列,例如一个用于CPU,一个用于每个IO设备等。当任务正在执行阻塞IO调用时,它会从队列中移除CPU并将其放入正在访问的设备的队列中。 这样,等待CPU以外的资源的任务不会位于CPU任务队列中(因此不会浪费时间开始并立即停止)。

    这是#3在谈论(当你再看看你看到他们在谈论“等待队列S”)

    另一种“等候队列”

    在讨论多级调度程序时,通常还有一个“等待队列”:在这种情况下,就绪队列就是准备就绪并由主调度程序调度的任务的队列(例如,使用循环调度)。 如果任务由于IO操作而阻塞,则如上所述 - 将其放入相应资源的队列中。 当该资源再次可用时,首先将任务放入等待队列,从该队列中,辅助调度程序(仅作为主调度程序的任务)最终将其取出并将其放入主调度程序的就绪队列中。

    你的教授是什么

    如果您将队列重命名为“此时尚未运行的任务的队列”以及“本轮已经运行的任务排队”之类的版本,那么版本#1可能更好理解。 如果你不想有循环列表,这基本上只是一个“解决方法”。 所以它也是循环赛,但有点模糊。

    [...]可能导致饥饿(如果流程放置在第二季度,并且新流程持续到第一季度,那么流程将永远不会再安排)[..]

    这是一个非常好的观察。 如果在Q2的末尾插入新的,准备好的任务,而不是Q1,则可以解决这个问题。 如果合适,当你的教授提出问题时,这是一个非常好的讨论开始。


    第一个实现不仅会导致饥饿,还会导致死锁。 如果我们只修改第一个实现的第5步,这个方法就可以做得很好。

    第二种方法是以最纯粹的形式循环。

    第三种方法不是循环法,但实际上是一个更智能的版本,它理解I / O约束过程不应该过早给出另一个机会,因为它可能还没有准备好。

    如果您将继续阅读该书,您将阅读下一个称为多级队列的调度算法。 这实际上是Round-robin不同变体的所有实现中最好的。 在多级队列中,我们将所有传入的进程放在一个队列中,然后根据他们是否在第一时间片完成,将它们放入另一个队列中。 这个新的队列具有更高的时间片并最终保持CPU绑定进程。

    使用多级队列(比如它们的4-5),CPU将所有进入的进程梳理成不同的类,然后从每个队列中选择最佳的进程数量,以便它既没有过度订阅也没有不足。


    到达系统的任何进程都是就绪队列末尾的队列。 处于就绪队列头部的进程被选择并允许在CPU上执行时间段q.在q到期时,进程在就绪队列的尾部排队。下一个计划的进程是一个在就绪队列的头部。这是知道的循环调度。

                                       OR
    

    在循环调度中,进程被调度为FIFO,但被赋予有限的CPU时间量,称为时间片或量子。如果进程在其CPU时间到期之前未完成,则CPU将被抢占并被提供给下一个等待进程,被抢占的进程将被放置在就绪队列的后面。

    链接地址: http://www.djcxy.com/p/84833.html

    上一篇: robin scheduling algorithm

    下一篇: Paper & Pencil example