Operating system 循环调度算法
我在和我的教授的幻灯片上学习操作系统。我已经到了“进程调度算法”一章。谈到RoundRobin(RR)算法,我发现了一些不一致之处。我知道这是FCFS算法的抢先版本,带有时间片(quatum)。 从现在起,我将使用以下符号: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:已结束其量程的进程的队列 调度器从
#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交换李>
#2
(这本书没有提到多个队列,所以我假设它只使用一个队列)
#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