RT-Thread基于优先级的全抢占式调度算法的实现

rt-thread的调度算法为基于优先级调度和基于时间片轮转调度共存的策略。rt-thread内核中存在多个线程优先级,并且支持多个线程具有同样的线程优先级。线程级别数目在rtconfig.h中以宏定义的方式配置,当系统存在多个线程时,可能的情况是,某些线程具有不同的线程优先级,但是还有一些线程具有相同的优先级。rt-thread采用的调度策略是:

不同优先级的线程,采用可抢占的方式:就绪的高优先级的线程会“立刻”抢占低优先级的线程;
同线程优先级别的多个线程则采用时间片轮转,同级线程依次获得CPU时间

在上面的情形中,摆在rt-thread面前的问题是,如何从多个线程优先级别中找出当前优先级最高的那个线程,并调度执行。

rt-thread的内核调度算法采用位图(bitmap)实现,算法时间复杂度为O(1)(注,O(1)定义,请参考数据结构相关书籍,即每次调度的时间恒定:无论当前的系统中存在多少个线程,多少个优先级,rt-thread的调度函数总可以在恒定的时间内选择出最高优先级的线程执行。

线程结构存储

寻找当前线程优先级最高的线程并调度执行,首先需要解决线程数据结构的存储问题。下面先来分析rt-thread中如何存储多个线程的数据结构。

先做几点说明:

每个线程的信息用线程控制块(Thread Control-Block,缩写为TCB)表示,它是定义在rtdef.h中的struct结构体,用来描述一个线程所有必要信息;

线程的优先级别用非负整数(即无符号整数)表示。数值越小,优先级越高;

系统的线程优先级的数目固定,最多支持256级;

系统中的线程数目不做任何限制,线程的数目仅受限于系统RAM的大小。

读者不妨思考最后两点,当系统存在多个的线程时,如何存储线程控制块才能满足要求?

线程的优先级别数目固定。使用数组存储TCB,数组的长度即为线程优先级的数目,数组的每个元素为一个指向TCB数据结构的指针。

线程数目不受限制。那当某个线程优先级上存在多个线程时,这些TCB显然没办法存储在上面定义的数组对应的优先级位置上,那么使用链表,链表是一种数据结构,每个元素彼此链接,TCB中有一个链接下一个TCB的“链表数据结构”,如同一个钩子一样。

这样就可以达到上面提及的两点设计要求,不同线程优先级的线程的TCB分别存在线程TCB数组对应优先级的位置上。对于相同优先级别的多个线程,我们只需要将该优先级的第一个就绪线程的TCB存储在线程TCB数组中相关位置,后续同级线程通过链表依次连接。
scheduler.c
假定RT_THREAD_PRIORITY_MAX这个宏为256
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值