操作系统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

进程调度队列是如何组织的: 在 Linux 内核中,进程调度队列是由多个就绪队列(runqueue)组成的。每个 CPU 都有一个就绪队列,用于保存可以被调度的进程。就绪队列是一个双向链表,每个链表节点对应一个进程。就绪队列使用了一些优化技巧,例如旋转数组(rotating bitmap)和红黑树(red-black tree),以提高调度效率。 三种调度类型(SCHED_FIFO, SCHED_RR, SCHED_OTHER)的实现过程: Linux 内核中支持三种调度类型: - SCHED_FIFO:先进先出调度策略,进程一旦被调度,将一直占用 CPU 直到自愿放弃或者被其他进程抢占。 - SCHED_RR:时间片轮转调度策略,进程被分配固定的时间片,当时间片用完或者进程主动放弃 CPU 时,进程就会被放回到就绪队列中,等待下一次调度- SCHED_OTHER:CFS(Completely Fair Scheduler)调度策略,基于进程的虚拟运行时间(vruntime)来决定进程的优先级。优先级较高的进程被调度的机会更高。 在 Linux 内核中,这三种调度类型的实现都是基于调度类(sched_class)的概念。每个调度类都包含了一组函数指针,用于实现进程调度相关的操作。不同的调度类实现不同的调度策略。 优先级是如何定义和动态变化的: 在 Linux 内核中,进程的优先级是一个动态变化的值,取值范围为 -20 到 19。优先级较高的进程会更容易被调度。进程的优先级由调度类的实现决定,不同的调度类可以有不同的优先级计算方式时间片的赋值?它与优先级的关系? 在 Linux 内核中,时间片的赋值与优先级有关。时间片的大小由进程的优先级决定,优先级越高的进程分配的时间片越长。具体来说,时间片的大小可以通过以下公式计算: time_slice = 100 * 2 ^ (MAX_PRIO - prio) 其中,MAX_PRIO 是进程优先级的最大值,prio 是进程的优先级。时间片的单位是 jiffies(时钟滴答数),具体的大小可以通过 kernel/sched/core.c 中的 time_slice() 函数计算。 重点分析内核数据结构 task_struct(在 include/linux/sched.h 中)和调度函数 schedule()(在 kernel/sched.c 中): task_struct 结构体是 Linux 内核中描述进程的主要数据结构,其中包含了进程的各种信息,包括进程 ID、优先级、状态等等。task_struct 结构体比较庞大,其中包含了多个子结构体,例如 thread_info、mm_struct、fs_struct 等等。 schedule() 函数是 Linux 内核中实现进程调度的核心函数,它由内核定时器触发,用于从就绪队列中选择下一个需要运行的进程。schedule() 函数首先会检查当前 CPU 上是否有正在运行的进程,如果有,则不进行调度;否则,它会从就绪队列中选择下一个进程,并将其调度到 CPU 上运行。如果就绪队列为空,则 schedule() 函数会将当前 CPU 切换到 idle 进程上,以节省 CPU 资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值