[rCore学习笔记 025 extend] 带优先级的抢占式调度

引言

因为rcore并非设计为一个rtos,而是在我们需要的时候我们需要在设计的时候考虑到线程切换的时候的延时问题.

回顾上一部分的使用环形队列进行调度的方式,我们会发现我们寻找下一个Ready的任务的时间是不均匀的.

并且我们的任务是没有优先级的,可以认为是平权的,因此,为了:

  1. 快速且时间均匀地找到下一个应该被调度的线程.
  2. 为不同任务之间实现优先级.

我添加了这个extend部分,实现了一些rtos的特性.

仅有32位优先级的抢占式调度

有点类似于哈希表的拉链法里的拉链数据结构了

在结构体里存一个带有优先级的变量u32,每个位对应一个链表.用一个u32来管理,为1,说明当前存在待调度的线程.

每次在线程ready的时候把线程插入对应的队列里,并且把线程优先级|到这个u32.同理,删除这个线程的时候,也需要&~线程优先级.

为什么要选择优先级数值越小优先级越高?
为了快速找出目前需要调度的队列,这种算法是存在的.
找目前优先级最高的需要调度的线程,其实就是找u32最低位为1的数字.

使用位图寻找

空间换时间

首先我们先看上图中被虚线划开的第一部分,也就是前8位.

前八位可以有两种观点看待:

  1. 看作是数值.
  2. 看作是一个flag&mask的每个位代表一个状态的结构.

上述两个信息第一个可以从直接读取来获取,第二个则可以通过位操作来获取,都是很快的.

但是为1的第一位这个信息我们是不知道的,因此我们需要为0~255(0x00~0xff)所有的值都匹配一个对应的首个1的位置.

最终得到这样的一个位图(但是保存为一位数组,相当于逐行储存):

0是单独处理的.
8位的情况下,每个对应的是对应数值的一个为1bit的位置(但是是从0开始计算的).原因是前8位就使之+1,那么9~16位就可以+17,以此类推.

为什么以前8位为例?

  1. 8位是最小的可操作的变量单位
  2. 更大的位数的都可以转变为一个前八位的问题.通过&0xff检查前8位是否为空.

优先级拓展

这里反过来想,每次使用位图处理优先级的时候,都是1Byte为单位处理的.

那么如果需要拓展优先级,则很容易得出结论:原方法是使用一个u32作为4Byte的容器,如果需要拓展优先级,则使用u8的数组就可以很容易类比实现.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907845.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五周第三章3.6-3.8,思考与练习3.19-3.21

3.6 import time a = "strating" print("{:^}".format(a),end=) for i in range(11): s = . * i print("{:<}".format(s),end=) time.sleep(1) print("Done!") 思考与练习3.19 import time current_time = time.time() time_tuple …

【Java - demo】Redis开发入门

Redis 是一个高性能的键值存储数据库,常用于缓存、消息队列等场景。 本文将以简单易懂的方式介绍 Redis 的基本概念和使用方法,并附上 Java 示例代码,帮助你快速上手。 一、Redis 是什么? Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统。它支持多…

【流量预警】装了UU远程/GameViewer的小心了

前言 月末了,没流量了,不过我今天怎么跑了4个G的流量? 我倒要看看是谁干的好事。热点跑的?但是我一整天都挂着手机连电脑没动啊,最多也就偶尔用了一下。 别让我找到是谁偷跑我流量跑这么多 好啊好,UU远程,得,你清高,你偷偷上传我电脑数据是吧。虽说没抓到现行也只能怀…

注释、关键字、标识符

1、Java的注释有几种? 单行注释 使用双斜杠//,仅注释该行//后的内容。 多行注释(块注释) 使用/*开始,*/结束,中间所有内容均为注释,可跨越多行。 文档注释 使用/**开始,*/结束,通常用于生成API文档(通过Javadoc工具)。支持特定标签(如@param、@return等)。 关键区…

Mysql全量安装配置教程(超详细window版本无需配置环境变量)尊享篇

官网下载注册 注册 官网地址:https://www.oracle.com/mysql/technologies/mysql-enterprise-edition-downloads.html#windows 下载需要注册登录 注册可以用临时邮箱地址:https://www.suiyongsuiqi.com/zh/mail/ 如果显示400badrequest 打开无痕浏览窗口重新访问即可 解压所需…

Linux基本命令-1

Linux路径的描述方式Windows中,以\表示层级关系.有C盘,D盘等多个根目录.Linux中,以/表示层级关系./为根目录.eg:/usr/local/hello.txtLinux基础命令 命令的通用格式:命令+[选项]+[参数],其中用[ ]选中的选项,参数表示可省略. eg: ls -l /home/hu ==> 以列表形…

[Vue] Vue 模板编译原理解析 part 2

转换器 主要的目的是将模板的 AST 转换为 JS 的 AST,整个模板的编译过程如下: // Vue 的模板编译器 function compile(template) {// 1. 得到模板的 ASTconst ast = parse(template);// 2. 将模板 AST 转为 JS ASTtransform(ast); }整个转换实际上可以分为两个大的部分:模板…

Flasher V5 JLink Pro V6

原帖链接:https://nicemcu.github.io/2025/03/29/PSoC4/FlasherV5/ 2025年3月29日,神变月最后一天,我们参加了放生~ 在这个特殊的日子里,我完成了Flasher V5和JLink Pro V6的crack,难掩内心的喜悦与激动,记录下这一时刻。 前不久小黄鱼上收了一枚Flasher ARM,硬件版本V5…

[Vue] Vue模板编译原理解析 part 1

模板编译整体流程 首先我们看一下什么是编译? 所谓编译(Compile),指的是将语言 A 翻译成语言 B,语言 A 就被称之为源码(source code),语言 B 就被称之为目标代码(target code),这个事情谁来做?编译器来做。编译器你也不用想得那么神秘,就是一段程序而已。 完整的编…

[P] 结对项目:影蛇舞

项目 内容这个作业属于哪个课程 2025年春季软件工程(罗杰、任健) 这个作业的要求在哪里 [P] 结对项目:影蛇舞 我在这个课程的目标是 学习软件工程知识,通过团队协作开发一个具备实际应用价值的软件,从需求分析、设计、开发到测试和部署,完整经历软件开发生命周期,提高工…

0329-Never Give Up

前言 用LCD1602 去打印一段话吧。 就当作激励和安慰,毕竟,我今天被坏情绪传染了一下,有点点失落和悲伤。 参考 5-2 LCD1602调试器 效果 Never Give UpAttitude Is Everything代码 LCD1602.h #ifndef __LCD1602_H__ #define __LCD1602_H__//用户调用函数: void LCD_Init(); …