Operating system 循环调度算法

Operating system 循环调度算法,operating-system,scheduling,round-robin,Operating System,Scheduling,Round Robin,我在和我的教授的幻灯片上学习操作系统。我已经到了“进程调度算法”一章。谈到RoundRobin(RR)算法,我发现了一些不一致之处。我知道这是FCFS算法的抢先版本,带有时间片(quatum)。 从现在起,我将使用以下符号: #1 = prof's version #2 = book's version #3 = other version 以下是不一致性(假设量子为100ms): #1RR使用两个队列(Q1、Q2): Q1:未结束其量程的进程的队列 Q2:已结束其量程的进程的队列 调度器从

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

#1 = prof's version
#2 = book's version
#3 = other version
以下是不一致性(假设量子为100ms):

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

  • Q1:未结束其量程的进程的队列
  • Q2:已结束其量程的进程的队列

  • 调度器从Q1的头部获取进程
  • 如果进程在量程到期之前结束,则进程会故意释放CPU,调度器从Q1开始执行下一个进程
  • 如果进程未在量子到期前结束,则被抢占并置于第2季度末
  • 当一个过程准备就绪时,它被放置在第一季度末
  • 当Q1为空时,Q1和Q2交换
因此,当一个进程因I/O请求而被阻止时(例如,30毫秒后),其数量尚未到期,将被放置在第一季度末(我猜),当它将再次被调度时,它将在剩余时间内使用CPU(本例中为70毫秒)

#2
(这本书没有提到多个队列,所以我假设它只使用一个队列)

  • 调度器从就绪队列的头部获取进程
  • 如果进程在量程到期之前结束,进程会故意释放CPU,调度器会从就绪队列中获取下一个进程
  • 如果进程没有在量子过期之前结束,则被抢占并放置在就绪队列的末尾
    #3

  • 调度器接受就绪队列中的第一个进程
  • 如果进程在量程到期之前结束,进程会故意释放CPU,调度器会从就绪队列中获取下一个进程
  • 如果进程没有在量子过期之前结束,则被抢占并放置在就绪队列的末尾
  • 如果进程被I/O请求阻塞,它将被放置在等待队列中,当它准备就绪时,它将再次被放置在就绪队列中 对我来说,这是RR调度算法的3种不同实现。我认为最有价值的是
    #3
    ,因为
    #1
    可能会导致饥饿(如果进程放在第2季度,而新进程不断出现在第1季度,那么进程将永远不会被再次调度),
    #2
    将在进程因I/O请求而被阻塞时浪费CPU时间。所以,我的问题是:哪一个是正确的?

    理论上是循环赛 当考虑模拟时钟时,循环调度可以很好地可视化:指针以恒定速度旋转,因此它在一个位数的区间内,占一次完整运行所需时间的1/12

    因此,一个位数在总可用资源量中占有一定比例。而且,最重要的是,这些数字有一个固定的顺序:在手刚刚经过一些数字之后,只有在手经过所有其他数字之后,它才会再次被访问

    看看你介绍的变体,书中的版本正好符合这一点:在一项任务完成后,它被放在(通常称为)准备队列的末尾,因此只有在所有其他任务完成一次后,才会再次得到服务

    循环调度作为一种理论调度算法,只考虑将多个用户(任务)调度到单个资源(CPU)

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

    实际上 当您在调度任务时,您必须将它们作为单个资源调度到多个CPU,还需要管理其他资源,如IO设备

    非常简单的调度器忽略了这一事实,将当前正在任务队列中等待其他资源的任务留给CPU

    因此,当这样一个任务得到它的时间片时,它所要做的就是发现它仍然需要等待其他资源并将CPU交还给调度程序,以便调度程序将其放回到任务队列中。启动任务,检查任务是否仍需要等待其他资源,停止任务需要花费一些时间,这些时间最好花在实际可以使用CPU的任务上

    为了解决这个问题,通常为每个管理的资源都有一个任务队列,即一个用于CPU,一个用于每个IO设备,等等。当一个任务正在执行阻塞IO调用时,它会从CPU的队列中删除,并放入它正在访问的设备的队列中。这样,等待CPU以外的资源的任务就不会出现在CPU任务队列中(这样就不会浪费时间启动和立即停止)

    这就是
    #3
    所说的(当你再看一遍时,你会发现他们说的是“等待队列”)

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

    你的教授是关于什么的 版本
    #1
    可能是
                                       OR