前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rt-thread的线程调度与管理

rt-thread的线程调度与管理

作者头像
bigmagic
发布于 2020-07-08 08:02:09
发布于 2020-07-08 08:02:09
1.3K00
代码可运行
举报
文章被收录于专栏:嵌入式iot嵌入式iot
运行总次数:0
代码可运行

rt-thread的线程调度与管理

  • ?1.调度是什么?
  • ?2.调度怎么实现?
  • ?3.什么时候系统做调度?
    • ?3.1 任务主动block
    • ?3.2 被更高优先级的任务唤醒
    • ?3.3 yield放弃cpu使用
    • ?3.4 中断中执行调度
  • ?4.调度做了哪些事情?
  • ?5.总结

要想使用好rtos,做出更加稳定可靠的产品,必须非常清楚底层的调度原理。由于RTOS的可控性,所以只有了解了其核心部分的设计思路,才能用起来得心应手,游刃有余。本文主要是听完熊大对rt-thread调度讲解之后,自己做了一些反思总结,打算分享一下rt-thread线程的调度与管理相关的比较核心和重要的部分的笔记。

1.调度是什么?

调度一般就是合理的安排,协调资源,统一指挥去完成一件事,而在操作系统中,线程调度就是有多个就绪优先级的任务,找到最高优先级任务,交给CPU去运行。

rt-thread调度器就是起到判决线程当前的优先级,然后去执行当前最高优先级的就绪的线程。

调度又可以细分为两种。可打断调度:关键防止优先级倒置 ;不可打断调度:先来先服务,不可中断。

2.调度怎么实现?

在创建任务的时候,指定了任务的优先级,一般来说,每个任务都有自己特定的优先级。所以内核线程对象中有不同的优先级的任务列表。

如果最大指定为32个优先级,那么可以用u32,每一个bit表示一个优先级就绪的状态。使用位图的优点就是速度快,而且内存占用小。

一般来说,调度去找到最高优先级的任务时,就需要去做判断。如何去找到最高优先级的任务。一般来说,有两种办法:

  • 软件计算
  • 硬件计算

这两种的差别仅仅在于计算效率的问题,本质目的并无差别。

而寻找最高优先级的事情也是有两种实现的策略:

1.遍历就绪的队列,找到最小的就绪的队列,寻找的时间不确定,时间复杂度O(n)。

2.采用空间换时间的办法,事先做好一个bitmap

例如系统中最大有8个优先级,那么bitmap如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const rt_uint8_t __lowest_bit_bitmap[] =
{
    /* 00 */ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 10 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 20 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 30 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 40 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 50 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 60 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 70 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 80 */ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* 90 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* A0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* B0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* C0 */ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* D0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* E0 */ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
    /* F0 */ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};

一般每一位代表一个就绪的状态,所以__rt_ffs程序的设计如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int __rt_ffs(int value)
{
    if (value == 0) return 0;

    if (value & 0xff)
        return __lowest_bit_bitmap[value & 0xff] + 1;

    if (value & 0xff00)
        return __lowest_bit_bitmap[(value & 0xff00) >> 8] + 9;

    if (value & 0xff0000)
        return __lowest_bit_bitmap[(value & 0xff0000) >> 16] + 17;

    return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25;
}

如果当前系统的线程状态为0b0110 0000,那么转换成十六进制就是0x60,根据表中的状态此时的最高优先级是5+1=6。所以可以得出系统的优先级,此时计算的复杂度为O(1)。

虽然rtt是支持同等优先级的,但是在具体的业务逻辑的设计中,在使用RTOS常用的设计方法中,一般都是要求程序的运行逻辑是可预测的,就是在程序执行的过程中,可以预测到程序下一步的动作。所以rtos中同等优先级,按照时间片轮训的这种方式设计业务逻辑的情况并不多。使用相同优先级会增加系统的业务逻辑的复杂性。

3.什么时候系统做调度?

RTT是抢占式的系统调用,所以系统什么时候去做的调度非常的关键。系统调度分为主动调度和被动两种。

3.1 任务主动block

当A线程在正常运行时,主动放弃CPU的使用权,比如去执行rt_thread_delay或者去等待一个IPC的事件到来时,都会释放CPU进行调度,此时去系统中寻找已经就绪的最高优先级的线程进行调度。

这种方式应用的场景比较丰富,比如当前线程没有获取到资源时,需让出CPU的使用权,或者事情做完了,主动让出CPU的使用权,这就是系统做调度的时机。

A线程的优先级要高于B线程的优先级,所以在A放弃CPU使用权后,已经就绪的最高优先级线程B就开始执行了。

3.2 被更高优先级的任务唤醒

这种方式就是当比当前运行线程的优先级高的线程处于就绪态时,会调度到比当前线程更高的优先级线程中去。

按照理解A线程是正在运行的线程,此时更高任务优先级的线程C就绪处于就绪状态了,所以系统的tick函数中判断已经有比线程A更高优先级的线程处于就绪状态,于是执行了rt_schedule()函数执行了系统调度。当前A线程运行状态压栈,更高优先级的C线程的状态出栈,开始运行C线程。

3.3 yield放弃cpu使用

首先理解一下什么是yield,解释成让出,放弃比较合理。该出让只针对于同等优先级的线程。

这种情况只适用于A线程的优先级等于B线程的优先级的情况。因为RTT支持同等优先级的方式创建线程,相同的优先级的切换是靠时间片轮询来进行的。所以,当A线程正常运行的时候,如果执行了yield函数,那么只相当于将A线程的时间片消耗完,此时同等优先级的D线程开始运行。

由于在RTOS中,需要的是完成任务的确定性与可靠性,同等优先级的情况比较有限,所以这一块应用的不多。

3.4 中断中执行调度

以上的三种属于主动进行调度的过程,其系统的执行流程都是可以预测的,但是中断去执行调度却是比较特殊。是被动调度。

这种方式是在中断中执行调度的,当A线程正常运行时,此时来了一个中断,由于中断的优先级是高于线程的。所以,中断处理事情,如果在中断中执行了调度函数,那么在中断退出后,将直接切换到当前系统中更高优先级的线程去运行。如果如果当前系统的最高优先级还是A,那么中断退出后,执行的最高优先级线程依然是A。若存在线程E线程优先级高于A并且处于就绪状态,此时,中断退出后,切换到E线程去执行。

4.调度做了哪些事情?

系统进行调度的时候做了哪些事情?

第一步:查找当前系统中当前以及就绪的最高优先级的线程,若有高于当前运行系统运行的线程栈则执行线程切换

第二步:关闭中断,将系统当前运行的寄存器压入栈空间

第三步: 找到需要运行的线程的PC指针,并找到栈起始处弹出栈中的寄存器状态

第四部:打开中断,执行异常ret,让系统恢复执行

此时,就切换到已经就绪的更高优先级的线程去运行了。

5.总结

rt-thread线程的调度原理和过程上述文章已经写的比较详细了,主要需要注意的是调度器的原理以及调度的时机的问题。往往在利用rt-thread做具体的项目的时候,需要非常清楚的理解调度过程,通过阅读代码,就能预测程序下一步的执行动作。真正的做到手中有粮,心中不慌。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式IoT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
综述 | 分布式GNN训练算法和系统,35页pdf
图神经网络(GNNs)是一种基于图的深度学习模型,已成功应用于许多领域。尽管GNN具有一定的有效性,但GNN要有效地扩展到大型图仍然是一个挑战。作为一种补救措施,分布式计算能够提供丰富的计算资源,成为训练大规模GNN的一种很有前途的解决方案。然而,图结构的依赖性增加了实现高效分布式GNN训练的难度,这将受到海量通信和工作量不平衡的影响。近年来,人们在分布式GNN训练方面做了很多工作,提出了一系列的训练算法和系统。然而,从图处理到分布式执行的优化技术还缺乏系统的综述。本文分析了分布式GNN训练中的三个主要挑战,即大量特征通信、模型精度损失和工作负载不平衡。然后,我们介绍了分布式GNN训练优化技术的一种新的分类法,以解决上述挑战。新的分类法将现有技术分为四类:GNN数据分区、GNN批处理生成、GNN执行模型和GNN通信协议。我们仔细讨论了每个类别中的技术。最后,我们分别总结了现有的多GPU、GPU集群和CPU集群分布式GNN系统,并对可扩展GNN的未来发展方向进行了讨论。
Houye
2023/02/26
7090
综述 |  分布式GNN训练算法和系统,35页pdf
【阅读】2021 OSDI——P3: Distributed Deep Graph Learning at Scale 论文翻译
2.3 Challenges in Distributed GNN Training
小锋学长生活大爆炸
2022/11/02
6390
【阅读】2021 OSDI——P3: Distributed Deep Graph Learning at Scale 论文翻译
【阅读】A Comprehensive Survey on Distributed Training of Graph Neural Networks——翻译
        Graph neural networks (GNNs) have been demonstrated to be a powerful algorithmic model in broad application fields for their effectiveness in learning over graphs. To scale GNN training up for large-scale and ever-growing graphs, the most promising solution is distributed training which distributes the workload of training across multiple computing nodes. However, the workflows, computational patterns, communication patterns, and optimization techniques of distributed GNN training remain preliminarily understood. In this paper, we provide a comprehensive survey of distributed GNN training by investigating various optimization techniques used in distributed GNN training. First, distributed GNN training is classified into several categories according to their workflows. In addition, their computational patterns and communication patterns, as well as the optimization techniques proposed by recent work are introduced. Second, the software frameworks and hardware platforms of distributed GNN training are also introduced for a deeper understanding. Third, distributed GNN training is compared with distributed training of deep neural networks, emphasizing the uniqueness of distributed GNN training. Finally, interesting issues and opportunities in this field are discussed.
小锋学长生活大爆炸
2023/02/02
5030
【阅读】A Comprehensive Survey on Distributed Training of Graph Neural Networks——翻译
无惧大规模GNN,用子图也一样!中科大提出首个可证明收敛的子图采样方法 | ICLR 2023 Spotlight
---- 新智元报道   编辑:好困 【新智元导读】中科大王杰教授团队提出局部消息补偿技术,解决采样子图边缘节点邻居缺失问题,弥补图神经网络(GNNs)子图采样方法缺少收敛性证明的空白,推动 GNNs 的可靠落地。 图神经网络(Graph Neural Networks,简称 GNNs)是处理图结构数据的最有效的机器学习模型之一,也是顶会论文的香饽饽。 然而,GNNs 的计算效率一直是个硬伤,在大规模图数据上训练 GNNs 常常会遇上邻居爆炸(neighbor explosion)问题——节点表示和随
新智元
2023/03/29
9400
无惧大规模GNN,用子图也一样!中科大提出首个可证明收敛的子图采样方法 | ICLR 2023 Spotlight
图神经网络加速综述: 算法、系统和硬件
GNN在许多任务上实现了最先进的性能,但在处理具有大量数据和严格延迟要求的实际应用程序时,面临可扩展性挑战。为了应对这些挑战,已经进行了许多关于如何加速GNN的研究。这些加速技术涉及GNN的各个方面,从智能训练和推理算法到高效系统和定制硬件。本综述提供了GNN加速的分类,回顾了现有的方法,并提出了未来的研究方向。
算法进阶
2024/02/17
1.3K0
图神经网络加速综述: 算法、系统和硬件
GNN系列 综述 GNN GCN GraphSAGE GAT 简单理解 及调优Trick
图(graph)是一种数据结构,图神经网络(Graph Neural Network)应该是深度学习在图结构数据上的一些模型、方法和应用。常见的图结构由节点(node)和边(edge)构成,节点包含了实体(entity)信息,边包含实体间的关系(relation)信息。
大鹅
2022/09/04
3.4K0
图神经网络入门实战-GraphSAGE
GCN的训练方式是基于全图的形式,然而对于许多实际的业务场景,图的规模是非常巨大的,单张显卡的容量难以满足一张整图训练所需要的空间,所以小批量的训练方法对于大规模图数据的训练是十分必要的。
YoungTimes
2022/04/28
1.3K0
图神经网络入门实战-GraphSAGE
【GNN】PinSAGE:GCN 在工业级推荐系统中的应用
今天学习的是 Pinterest 和斯坦福大学 2018 年合作的论文《Graph Convolutional Neural Networks for Web-Scale Recommender Systems》,目前有 200 多次引用。
阿泽 Crz
2020/07/21
2.3K0
【GNN】PinSAGE:GCN 在工业级推荐系统中的应用
腾讯Angel Graph团队刷新GNN最强榜单OGB世界纪录!
导读 / Introduction 近日,在国际顶级图学习标准OGB(Open Graph Benchmark)挑战赛中,腾讯大数据Angel Graph团队联合北京大学-腾讯协同创新实验室,以较大优势在三个最大的OGB分类数据集:ogbn-papers100M、ogbn-products和ogbn-mag三项任务榜单第一! OGB是目前公认最权威的图学习通用性能评价基准数据集,由斯坦福大学Jure Leskovec教授团队建立并开源,并吸引了斯坦福大学、康奈尔大学、Facebook、NVIDIA
腾讯大数据
2021/09/03
1.1K0
图神经网络系统介绍与总结分析
图神经网络算法将深度神经网络的运算(如卷积、梯度计算)与迭代图传播结合在一起:每个顶点的特征都是由其邻居顶点的特征结合一组深度神经网络来计算。
一点人工一点智能
2022/12/27
1K0
图神经网络系统介绍与总结分析
ICML'20 通过图稀疏化来提升GNN的鲁棒性
在真实场景下,图经常含有复杂的邻居信息,特征和邻居个数都很多。尽管图网络通过邻居聚合来高效的捕获图结构,但仍然一些任务无关的节点被加入,使得模型处于次优状态。因此,作者提出了NeuralSparse的方法。这是一种有监督的图稀疏技术,通过去除图中多余与任务无关边,提高模型泛化能力。
Houye
2021/07/08
9110
ICML'20 通过图稀疏化来提升GNN的鲁棒性
图神经网络研究综述(GNN)
图神经网络由于其在处理非欧空间数据和复杂特征方面的优势,受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。
算法进阶
2023/10/31
1.5K0
图神经网络研究综述(GNN)
比DGL快14倍:PyTorch图神经网络库PyG上线了
项目链接:https://github.com/rusty1s/pytorch_geometric
昱良
2019/07/04
9660
GNN落地不再难,一文总结高效GNN和可扩展图表示学习最新进展
选自Github 作者:Chaitanya K. Joshi 机器之心编译 机器之心编辑部 图神经网络在应用到现实世界时会面临很多挑战,比如内存限制、硬件限制、可靠性限制等。在这篇文章中,剑桥大学在读博士生 Chaitanya K. Joshi 从数据准备、高效架构和学习范式三个方向综述了研究者们在克服这些问题时取得的进展。 用于高效和可扩展的图形表示学习的工具箱。 本文旨在概述关于高效图神经网络和可扩展图表示学习的关键思想,并将介绍数据准备、GNN 架构和学习范式方面的关键进展,这些最新进展让图神经网
机器之心
2022/04/06
6700
GNN落地不再难,一文总结高效GNN和可扩展图表示学习最新进展
GNN教程:DGL框架中的采样模型!
本文为GNN教程的系列干货。之前介绍了DGL这个框架,以及如何使用DGL编写一个GCN模型,用在学术数据集上,这样的模型是workable的。然而,现实生活中我们还会遇到非常庞大的图数据,庞大到邻接矩阵和特征矩阵不能同时塞进内存中,这时如何解决这样的问题呢?
Datawhale
2021/01/20
2K0
GNN教程:DGL框架中的采样模型!
比DGL快14倍:PyTorch图神经网络库PyG上线了
项目链接:https://github.com/rusty1s/pytorch_geometric
机器之心
2019/03/19
1.4K0
比DGL快14倍:PyTorch图神经网络库PyG上线了
GNN教程:GraghSAGE算法细节详解!
本文为GNN教程的第三篇文章 【GraghSAGE算法】,在GCN的博文中我们重点讨论了图神经网络的逐层传播公式是如何推导的,然而,GCN的训练方式需要将邻接矩阵和特征矩阵一起放到内存或者显存里,在大规模图数据上是不可取的。
Datawhale
2020/11/23
1.8K1
GNN教程:GraghSAGE算法细节详解!
「紫禁之巅」四大图神经网络架构
近年来,人们对深度学习方法在图数据上的扩展越来越感兴趣。在深度学习的成功推动下,研究人员借鉴了卷积网络、循环网络和深度自动编码器的思想,定义和设计了用于处理图数据的神经网络结构。图神经网络的火热使得各大公司纷纷推出其针对图形结构数据的神经网络框架。下面分别介绍四大图神经网络框架。
石晓文
2020/03/25
1.6K0
「紫禁之巅」四大图神经网络架构
中文综述 | 图预处理怎么做?
图相关应用在学术界和工业界都有着显著的增长,这主要是因为图具有强大的表示能力。然而,高效地执行这些应用面临多种挑战,如负载不平衡、随机内存访问等。为解决这些挑战,研究人员提出了各种加速系统,包括软件框架和硬件加速器,所有这些系统都包含图预处理(GPP)的步骤。GPP作为应用正式执行之前的准备步骤,涉及到诸如采样、重新排序等技术。然而,GPP的执行常常被忽视,因为主要的关注点通常是增强图应用本身。这种疏忽令人担忧,特别是考虑到实际图数据的爆炸性增长,其中GPP变得至关重要,甚至占据了系统运行开销的主导地位。
Houye
2023/09/22
2890
中文综述 | 图预处理怎么做?
4.图学习初探Paddle Graph Learning 构建属于自己的图【系列三】
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5000517?contributionType=1 如遇到问题查看原项目解决 图学习温故
汀丶人工智能
2022/11/20
5070
推荐阅读
相关推荐
综述 | 分布式GNN训练算法和系统,35页pdf
更多 >
LV.4
华南理工大学博士研究生
目录
  • rt-thread的线程调度与管理
    • 1.调度是什么?
    • 2.调度怎么实现?
    • 3.什么时候系统做调度?
      • 3.1 任务主动block
      • 3.2 被更高优先级的任务唤醒
      • 3.3 yield放弃cpu使用
      • 3.4 中断中执行调度
    • 4.调度做了哪些事情?
    • 5.总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档