RTOS-多优先级的线程切换机制粗解

本文深入探讨RT-Thread实时操作系统中多任务调度机制,解释了线程优先级、线程就绪优先级组及线程优先级表的概念,展示了线程如何根据优先级插入到相应的链表中,以及系统如何通过线程就绪优先级组进行调度。同时,文章还介绍了线程延时函数的作用和线程切换的原理,以及时间片在相同优先级任务间切换的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文以rtthread为例进行讲解.
Rtthread是一个实时多任务嵌入式系统,支持多优先级多任务,从而最大限度的压榨cpu的性能。理解多优先级线程切换之前先理解两个名词:线程就绪优先级组rt_thread_ready_pr iority_group , 另一个是线程优先级表 rt_thread_priority_table[RT_THREAD_PRIORITY_M AX]。线程优先级表的索引对应的就是线程的优先级。
现在假设有3个线程j1,j2,j3,先不考虑空闲线程,对应的优先级分别为0,1,1。优先级的数字越小则优先级越高。当我们创建3个线程后,需要按照对应的优先级找到线程优先级表中索引,将对应的线程插入到优先级表中对应索引的链表中,如下图。在这里插入图片描述
例如线程j1的优先级为0,也就是最高优先级,查找到优先级表中索引为0的链表,即rt_thread_priority_table[0]。线程j2、j3同样的方法插入到rt_thread_priority_table[0]中。
优先级的表示方法,我们以优先级最大值为32为例,用以这32位的整型数来表示,每一个位对应一个优先级,位 0 对应优先级 0,位 1 对应优 先级 1,以此类推。比如,当优先级为 10 的线程已经准备好,那么就将线程就绪优先级组 的位 10 置 1,表示线程已经就绪,然后根据 10 这个索引值,在线程优先级表 10 (rt_thread_priority_table[10])的这个位置插入线程。
假设目前系统中,创建了 优先级分别为 1、2 和 3 的线程 1、线程 2 和线程 3,再加上系统默认创建的空闲线程,那 么此时线程就绪优先级组的位设置情况和线程优先级表的链表挂载情况就如下图。
在这里插入图片描述
该4个优先级的任务在表中的挂载情况如图所示。
在这里插入图片描述
如果同1优先级的任务数量2个或更多,则表中的挂载情况如下图所示:
在这里插入图片描述
只需要在对应索引中的表中链表直接添加一个节点即可。
以上就完成了创建多个线程,并将多个线程按照优先级插入到对应的优先级就绪列表中,等待系统的任务调度。
系统调度开始后,会先从线程就绪优先级组中获取到就绪的最高优先级(也就是前面说的32位整形数,从右往左找到置1的位)。获取就绪的最高优先级对应的线程控制块,判断是不是当前线程,则要进行线程切换,否则则开启中 断退出继续执行当前线程。
那现在问题来了,优先级最高的位一直是1,则不会切换到其他的线程?这里就要说一个延时函数,自带阻塞属性。最高优先级的程序中使用阻塞延时函数(程序块中自带的定时器,会添加到系统的定时器链表中,由系统统一调度)时,将线程的状态改为挂起,接下来将进入延时,暂时放弃 CPU 的使 用权。 根据优先级将线程就绪优先级组中对应的位清零。严格来说,还需要将线程从线程优先级表中移除,到时候延时 的时候除了根据优先级将线程就绪优先级组中对应的位清零外,还需要线程从线程优先级表中移除。
在这里说一下线程里的定时器和线程的切换之间的联系。当我们使用延时函数时,如下图,获取到当前的线程块后挂起当前线程(将线程从就绪列表删除),设置超时时间,启动定时器。这样的情况下,就绪列表中就没有了最高优先级的任务。定时时间到后就再恢复到就序列表中。在这里插入图片描述
在这里插入图片描述
讲到这已经可以实现不同优先级任务之间的切换,如果同一个优先级有2个任务,如何实现2个任务的切换,切换的依据是什么?这就涉及到了时间片,在 RT-Thread 中,当同一个优先级下有两个或两个以上线程的时候,线程支持时间片 功能,即我们可以指定线程持续运行一次的时间,单位为 tick。假如有两个线程分别为线 程 2 和线程 3,他们的优先级都为 3,线程 2 的时间片为 2,线程 3 的时间片为 3。当执行 到优先级为 3 的线程时,会先执行线程 2,直到线程 2 的时间片耗完,然后再执行线程 3。某个优先级下只有一个任务时,设置时间片没有任何意义。仿真现象如下:在这里插入图片描述
从上图中可以看出线程 1 运行一个周期的时间为 6 个 tick,与线程 1 初始化时设置 的 4 个时间片不符,说明同一个优先级下只有一个线程时时间片不起作用。线程 2 和线程 3 运行一个周期的时间分别为 2 个 tick 和 3 个 tick,且线程 2 运行的时候线程 3 是不运行的, 从而说明我们的时间片功能起作用了,搞定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值