操作系统Round-Robin Scheduling时间片轮转调度算法

1.定义概念

是进程和网络调度程序常用的算法之一。[1] 这一方法将相等长度的时间片按照不变的顺序依次分配给每个进程[2],且在处理所有进程时不考虑任何优先级。这一算法简单并易于实现,并且不会产生饥饿问题。时间片轮转调度可以应用于其他调度问题,例如计算机网络中的数据包调度。它是一个操作系统概念。[3]

[]: 1:Arpaci-Dusseau, Remzi H.; Arpaci-Dusseau, Andrea C., Operating Systems: Three Easy Pieces Chapter: Scheduling Introduction(http://pages.cs.wisc.edu/~re "2Stallings, William. Operating Systems: Internals and Design Principles. Pearson. 2015: 409. ISBN 978-0-13-380591-8."

2通俗讲解

时间片轮转调度算法

最古老、最简单、最公平且使用最广的算法就是时间片轮转(Round Robin, RR)调度算法

每个进程被分配一个时间段,称为时间片(Quantum),即允许该进程在该时间段中运行。

  • 如果时间片用完,进程还在运行,那么将会把此进程从 CPU 释放出来,并把 CPU 分配另外一个进程;

  • 如果该进程在时间片结束前阻塞或结束,则 CPU 立即进行切换;

另外,时间片的长度就是一个很关键的点:

  • 如果时间片设得太短会导致过多的进程上下文切换,降低了 CPU 效率;

  • 如果设得太长又可能引起对短作业进程的响应时间变长。将

通常时间片设为 20ms~50ms 通常是一个比较合理的折中值。

周转时间=完成时间-到达时间 带权周转时间=周转时间/服务时间

引自:6.1 进程调度/页面置换/磁盘调度算法 | 小林coding (xiaolincoding.com)

辅助理解:【操作系统】什么是时间片?时间片轮转调度算法 - 知乎 (zhihu.com)

3.我的解释

主要有三个原则:

1.现在来的先当老大,没有就后者居上(当有新的进程进入时,那这个进程成为等待队列的队头,没有就队尾的进程成为队头)长江后浪推前浪

2谁是头谁倒霉(每个时间片开始前,处于队头的线程,cpu选择执行它)擒贼先擒王

3.先前的到后面(当前时间片结束时,在这个时间片内执行的进程从对头移动到队尾)曾经挚爱变路人

画图理解:(假设当前时间片为1)

01第一个时间片:假设在0ms时A进程进入队列,而它需要3ms

看三个原则:1.A进入队列后没有后续进程进入,所以A在队头。2.第一个时间片执行A。3.在第一个时间片执行后A进入队尾,所以第一时间片执行A

第一个时间片结束了,A去队尾,因为队列没有新的进程进入,而且A需要3ms才执行完,现在A还需要2个时间片(2ms),所以A还就再成为队头,

第二个时间片执行A,

在第二时间片结束后,B(需要1ms执行完)来了,所以B在队头,A在B后面,第三个时间片执行B

第三个时间片结束,B进程结束了,没有新的进程进入,所以A成队头,第四个时间片执行A

 第四个时间片结束,好的,这就是这个我的理解

4源码

感兴趣的可以看看这位博主的
原文链接:https://blog.csdn.net/Blank_Tt/article/details/89463238

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中没有内置的时间片轮转调度算法,因为时间片轮转调度算法通常是在操作系统层面实现的。但是你可以使用Python编写模拟时间片轮转调度算法的代码。 时间片轮转调度算法是一种常见的调度算法,它将CPU的使用时间划分为固定长度的时间片,每个进程在一个时间片内运行,然后切换到下一个进程。如果一个进程在一个时间片内没有完成,它将被放到就绪队列的末尾,等待下一次调度。 以下是一个简单的Python代码示例,模拟时间片轮转调度算法: ```python class Process: def __init__(self, name, burst_time): self.name = name self.burst_time = burst_time def run(self, time_slice): if self.burst_time > time_slice: print(f"Running process {self.name} for {time_slice} units") self.burst_time -= time_slice return True else: print(f"Running process {self.name} for {self.burst_time} units") self.burst_time = 0 return False def round_robin_scheduling(processes, time_slice): queue = processes.copy() while queue: process = queue.pop(0) if process.run(time_slice): queue.append(process) # 示例用法 p1 = Process("P1", 10) p2 = Process("P2", 5) p3 = Process("P3", 8) processes = [p1, p2, p3] time_slice = 3 round_robin_scheduling(processes, time_slice) ``` 这段代码定义了一个`Process`类,表示一个进程,包含进程名称和执行时间。`round_robin_scheduling`函数模拟了时间片轮转调度算法,接受进程列表和时间片长度作为参数。在示例中,我们创建了三个进程,并将它们传递给`round_robin_scheduling`函数进行调度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值