[019] [RT-Thread学习笔记] 线程位图调度算法

本文详细介绍了RT-Thread操作系统中线程优先级链表和位图算法的原理及应用,通过逐步优化调度算法,最终实现了高效的时间复杂度O(1)的实时调度。
RT-Thread
学习笔记
线程优先级链表
位图算法

RT-Thread版本:4.0.5
MCU型号:STM32F103RCT6(ARM Cortex-M3 内核)

1 线程优先级链表

每个线程控制块都带有一个链表成员,根据优先级将thread->slist插入对相应优先级链表中,对于相同优先级采取时间片轮转调度方式,若线程当前时间片已用完,且其所在的优先级队列为当前系统最高优先级,则调用rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),&(thread->tlist))将此线程插入到末尾,切换到表头线程运行。
image-20220326005605388

对于不同优先级,采取抢占式调度,每次会从优先级链表找出当前最高优先级链表(即非空),然后在其中取出第一个线程运行。
image-20220326005734598

2 位图算法

查找最高优先级的线程,首先得先找到当前最高的就绪优先级,最容易想到的调度算法(调度算法1):

    for(i = 0; i < 256; i++)
    {
   
   
        if(rt_thread_priority_table[i] != NULL)
            break;
    }
    highest_ready_priority = i;    

此算法可以找到当前最高的就绪优先级,但当最高优先级为255时,每次都要遍历完优先级表才能找到,时间复杂度O(n)

每个优先级链表是否存在线程,可以用一个bit位来表示,对于256级的线程,则共需要256个bit位,即32字节,因此引入:

rt_uint8_t rt_thread_ready_table[32];

数组的第一个字节的bit0表示优先级0,bit7表示优先级7,第而个字节的bit0表示优先级8,以此类推:

bit:    7   6   5   4   3   2   1   0
byte0 |007|006|005|
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柯西的彷徨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值