OS-实现一个RR调度算法

原理

RR调度相比于FCFS要公平一点,RR为每一个任务分配了一段固定的时间片(timeslice),当这个任务消耗完分配的时间片后,就会切换到下一个任务进行调度,这样相同优先级的任务都能够得倒相对公平的调度机会。在RR调度中就是timeslice的大小的划分,太大就退化成了FCFS,太小会引起过多的上下文切换,无味的消耗CPU是很浪费的。

什么是timeslice?
OS会使用一个timer来定时发生中断,timer的定时周期就是timeslice,比如说我们设定timer interval为1ms,也就是1ms会发生一次中断,发生中断后,调度器会切换到下一个任务去运行,那每个任务的timeslice就是1ms,也就是这个任务在一次调度循环中,最多只能运行1ms,就必须切换出去,当然你的任务也可能运行不到1ms就切换到下一个任务,这时候触发切换就是可能是(放弃CPU资源/被更高优先级抢占)。

什么时候会发生调度?

  • 主动放弃cpu资源(sleep/suspend)
  • 被动放弃cpu资源(mutex/semaphore)
  • 被更高优先级任务抢占
  • 时间片耗尽

扩展数据结构

相比于FIFO我们增加了timeslice来作为任务切换的一个发起点

typedef struct tcb
{struct list_head link_head;time64_t readytime;uint32_t timeslice;
} tcb_t;

schedule流程

调度流程图

相比于FIFO,我们只是增加了一个schedule的调用时机

线性查找法

伪代码

void schedule(void)
{tcb_t *cur_task = current();tcb_t *task = NULL;tcb_t *task_tmp = NULL;sched_queue_t *ready_queue = NULL;for (int i = 0; i < CONFIG_MAX_TASK_PRIORITY; i++){/* 按照优先级由高到低依次查找就绪队列 */if (!list_empty(&g_readytorun[i].tasks_head)){/** 找到不为空的对应优先级队列* 找到的第一个就是优先级最高的队列(默认优先级数值越低优先级越高)*/ready_queue = &g_readytorun[i];int64_t remain = clock_systime_ticks() - task->readytime;/* 判断任务是否到达了调度时间 */if (remain >= 0){list_for_each_entry_safe(task, task_tmp, &ready_queue->tasks_head, link_head){if (cur_task != task){list_del_init(&task->link_head);list_add_tail(&task->link_head, &ready_queue->tasks_head);task_switch(task);goto out;}}}}}
out:
}

时间复杂度

RR的时间复杂度和FIFO一样,因为采用的都是线性查找算法,下一章我们将采用位图查找来优化我们时间复杂度,使得最后可以达到O(1)

OS-实现一个RR调度算法相关推荐

  1. 短作业优先算法c语言实现,OS短作业优先调度算法C语言

    OS短作业优先调度算法C语言 采用短作业优先调度算法调度程序 学 号: 姓 名: 专 业: 指导老师: 日 期: 目录 一.实验题目3 二.课程设计的目的3 三.设计内容3 四.设计要求3 五.主要数 ...

  2. 操作系统面试题(十九):什么是RR调度算法

    RR调度算法 RR(Round Robin) RR调度算法主要针对分时系统,将时间片以相同部分并循环的分配给每个进程 RR调度算法没有优先级的概念 RR算法的特点: 算法实现简单 每个进程都会占有时间 ...

  3. hutool的定时任务不支持依赖注入怎么办_设计一个任务调度算法,时间轮算法,比优先队列更高效...

    当年我还是个学生的时候,有一次去参加欢聚时代的一个面试,有一道面试题记忆尤新,让你来实现一个定时任务,你会怎么做?为了简化问题,我们只用考虑内存方案,不用考虑数据持久化. 数组法 最简单的,我们可以把 ...

  4. 多线程+链表模拟RR调度算法

    程序还有点小bug mian.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #incl ...

  5. 车载OS - GENIVI (不是OS,只是一个车载软件相关的组织)

    目录 综述 AUTOSAR and GENIVI: Embedded Design Workflow  (by andrew petterson) AUTOSAR vs GENIVI Automoti ...

  6. c++时间片轮转rr进程调度算法_「学习笔记」时间片轮转(RR)调度算法(详解版)...

    关键词:时间, 进程, 调度, 队列, 切换 时间片轮转(RR)时间片轮转(RR)调度算法是专门为分时系统设计的.它类似于 FCFS调度,但是增加了抢占以切换进程. 该算法中,将一个较小时间单... ...

  7. 【操作系统 - 2】时间片轮转RR进程调度算法

    操作系统系列 2017.03.17:整理第一版. 2018.01.08:添加使用 DEV C++ 的说明. ======== 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的 ...

  8. 操作系统:时间片轮转RR进程调度算法

    目的:陆续整理近一年的学习收获 时间片轮转RR进程调度算法 一:概念 时间片轮转RR进程调度算法:用于分时系统中的进程调度.每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好 ...

  9. 操作系统——时间片轮转调度算法(RR)

    RR算法总体思路流程图 主要数据结构及参数 typedef struct PCB {char name;//进程名int arrive_time;//到达时间float cpu_burst;//服务时 ...

最新文章

  1. 06开始完整制作网站
  2. 要启用实时(jit)调试 该应用计算机,解决%_启用实时(JIT)调试+编译应用程序时还必须启用方法歩骤?谁有最终解决方案?...
  3. Protobuf序列化的原理-存储格式
  4. AtomicReference 原子引用
  5. python twisted教程 三–开始twisted
  6. 我看到东边的阳光就这样照进车窗
  7. NLP︱句子级、词语级以及句子-词语之间相似性(相关名称:文档特征、词特征、词权重)
  8. 2012年最新75款免费的专业英文字体下载【下篇】
  9. linux内存分段管理,Linux內存管理之分段機制
  10. linux运维必学python吗_Python学习资源整理
  11. CruiseControl
  12. html5酷狗音乐网页代码,酷狗音乐
  13. echarts散列图示例
  14. 《我是一只IT小小鸟》读书杂记
  15. ISBN编号的国家地区语言代码,出版社代码规则,中国出版社ISBN代码
  16. java中验证码发送_实现短信验证码的发送[JAVA]
  17. 中国最快的云计算机,中国最快的超级计算机 第一名是神威太湖之光
  18. 如何隐藏微信内置底部前进后退的按钮?
  19. FPGA疑难解决:Can‘t place multiple pins assigned to pin location Pin_101
  20. 基于国产 ARM + FPGA+Codesys运动控制平台的智能人机交互系统设计

热门文章

  1. android spinner,自定义字体大小颜色背景位置
  2. java计算机毕业设计小学教师课程管理系统源程序+mysql+系统+lw文档+远程调试
  3. 视频会议及流媒体十大开源项目
  4. 如何证明服从卡方分布_卡方分布的重要定理x拔与s∧2相互独立
  5. 计算机音乐小二郎,小二郎_儿童歌曲_单曲在线试听_酷我音乐
  6. 最简单的uefi和legacy介绍和举例(可能吧?)
  7. 蓝桥杯培训试题新解——计算两个日期之间的天数间隔
  8. 数据通信网络基本定义
  9. 4、IOC 之Bean的依赖关系
  10. 如何解决selenium被检测,实现淘宝登陆