OpenHarmony 实战开发——内核IPC机制数据结构解析

一、前言

OpenAtom OpenHarmony(以下简称“OpenHarmony”)是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代,基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。

作为面向全场景、全连接、全智能的分布式泛终端操作系统,OpenHarmony通过将各类不同终端设备的能力进行整合,实现硬件互助、资源共享,为用户提供流畅的全场景体验。为了能适应各种硬件,OpenHarmony提供了LiteOS、Linux内核,并基于这些内核形成了不同的系统类型,同时又在这些系统中构建了一套统一的系统能力。

OpenHarmony LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,LiteOS-M核为任务间通信提供了多种机制,包括队列、事件、互斥锁和信号量。各机制涉及到哪些关键数据结构?这些数据结构又是如何工作的?接下来我将从队列、事件、互斥锁、信号量几个内核对象出发,为大家讲解内核IPC机制的数据结构。

二、数据结构–队列

队列又称消息队列,是一种常用于任务间通信的数据结构,可以在任务间传递消息内容或消息的地址。内核用队列控制块来管理消息队列,同时又使用双向环形链表来管理控制块。

队列控制块:管理具体消息队列的数据块,内核初始化时调用OsQueueInit()创建,并依次挂载到双向环形链表g_freeQueueList中,此时控制块状态为OS_QUEUE_UNUSED,队列控制块用来保存队列的状态,队列长度、消息长度、队列ID、队列头尾位置和等待读写的任务列表,内核就是根据这些信息来管理消息队列和任务完成对消息读写等操作。

typedef struct {UINT8 *queue;UINT16 queueState;UINT16 queueLen;UINT16 queueSize;UINT16 queueID;UINT16 queueHead;UINT16 queueTail;UINT16 readWriteableCnt[OS_READWRITE_LEN];LOS_DL_LIST readWriteList[OS_READWRITE_LEN];LOS_DL_LIST memList;}LosQueueCB;  

初始化后队列控制块的组织方式如下:

创建队列:队列用于存放具体的消息内容,任务可以调用LOS_QueueCreate()来创建队列,此时内核会根据入参指定的队列长度和消息大小申请内存创建队列,并从g_freeQueueList中分配一个控制块来管理队列,被分配的队列控制块状态为OS_QUEUE_INUSED。分配队列控制块时总是从头节点开始,如下图控制块0首先被分配用于管理新创建的队列。

写队列:内核支持两种写队列方式:从尾部写入LOS_QueueWrite()和 从头部写入LOS_QueueWriteHead():

读队列:读队列只有一种方式,从队列头部读LOS_QueueRead(),读取之后head指向下个节点。

删除队列:当不再使用队列时可以使用LOS_QueueDelete()来删除队列,此时会归还队列控制块到g_freeQueueList中,并释放消息队列:

三、数据结构–事件

事件用于实现任务间的同步,但事件通信只能是事件类型的通信,无数据传输,事件控制块由任务申请,内核负责维护。

事件控制块:事件控制块用来记录事件和管理等待读取事件的任务。uwEventID总共32bit代表31个事件(bit25保留),stEventList事件控制块的双向环形链表,当有任务读取事件但事件还没发生时任务会被挂载链表中,当事件发生时系统唤醒等待事件的任务,此时任务就会被摘出链表。

typedef struct tagEvent {UINT32 uwEventID;      LOS_DL_LIST stEventList; } EVENT_CB_S, *PEVENT_CB_S;

事件初始化:事件控制块由任务创建,然后调用LOS_EventInit()进行初始化,初始化后的状态如下:

事件读:当事件没有发生时,读事件操作会引发系统调度,把当前任务挂起并加入到stEventList链表,下图中事件1发生,任务Task1读取事件2,但是事件2没有发生导致Task1被挂起。

事件写:当事件2发生时,任务Task2把事件2写入uwEventID,此时任务Task1被调度读取事件成功,事件2对应bit位被清0(也可以不清0),Task1从链表stEventList中被摘出。

事件删除:事件控制块是由任务创建的,内核不负责控制块的删除,但是任务可以调用LOS_EventClear来清除事件。

四、数据结构–互斥锁

互斥锁又称互斥型信号量,是一种特殊的二值性信号量,用于实现对共享资源的独占式处理。任意时刻互斥锁的状态只有开锁或闭锁,当有任务持有时,互斥锁处于闭锁状态,任务获得该互斥锁的所有权;当该任务释放它时,互斥锁被开锁,任务失去该互斥锁的所有权;当一个任务持有互斥锁时,其他任务将不能再对该互斥锁进行开锁或持有。

互斥锁控制块:互斥锁控制块资源由内核创建和维护,内核初始化时会调用函数OsMuxInit()对锁资源进行初始化。等待互斥锁的任务会被挂载到muxList中。

typedef struct {UINT8 muxStat;       /**< State OS_MUX_UNUSED,OS_MUX_USED  */UINT16 muxCount;     /**< Times of locking a mutex */UINT32 muxID;        /**< Handle ID */LOS_DL_LIST muxList; /**< Mutex linked list */LosTaskCB *owner;    /**< The current thread that is locking a mutex */UINT16 priority;     /**< Priority of the thread that is locking a mutex */
} LosMuxCB;

初始化时内核会申请LOSCFG_BASE_IPC_MUX_LIMIT个锁资源,并把各资源块挂载到双向环形链表g_unusedMuxList中,全局变量g_allMux指向锁资源内存首地址,后续根据首地址加ID方式快速查找对应的控制块:

互斥锁创建:任务调用LOS_MuxCreate()创建互斥锁,内核会从g_unusedMuxList的头部分配一个锁资源给任务。

互斥锁申请:任务调用LOS_MuxPend()申请互斥锁,如果锁被其它任务持有,则任务在muxList上排队。

互斥锁释放:任务调用LOS_MuxPost()释放互斥锁,如果有其它任务排队,则触发调度释放锁给排队任务。

互斥锁删除:任务调用LOS_MuxDelete()删除互斥锁,如果删除成功锁资源被归还到g_unusedMuxList中。

五、数据结构–信号量

信号量实现任务之间同步或临界资源的互斥访问的一种同步机制,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的保护,信号量功能可以为用户提供这方面的支持。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。

信号量控制块:信号量控制块资源由内核创建和维护,内核初始化时会调用函数OsSemInit()对信号量资源进行初始化。初始化时申请LOSCFG_BASE_IPC_SEM_LIMIT个信号量控制块,g_allSem指向信号量控制块的首地址,创建好的信号量控制块会挂载到空闲链表g_unusedSemList中。申请信号量的任务会在控制块的链表semList上排队,semCount指示可以被访问的资源数。

typedef struct {UINT16 semStat;      /**< Semaphore state */UINT16 semCount;     /**< Number of available semaphores */UINT16 maxSemCount;  /**< Max number of available semaphores */UINT16 semID;        /**< Semaphore control structure ID */LOS_DL_LIST semList; /**< Queue of tasks that are waiting on a semaphore */} LosSemCB;

信号量创建:任务调用LOS_SemCreate()创建信号量,并指定同一时刻访问此资源的最大任务数目。内核从g_unusedSemList的头部分配一个信号量控制块并初始化。

信号量申请:任务调用LOS_MuxPend()申请信号量,如果有资源可以访问则申请成功,否则在semList上排队等候。

信号量释放:任务调用LOS_SemPost()释放信号量,如果有其它任务排队,则触发调度使排队任务访问资源。

信号量删除:任务调用LOS_SemDelete()删除信号量,如果删除成功,锁资源被归还到g_unusedSemList的头部。

六、总结

本篇文章通过数据结构的队列、事件、互斥锁、信号量四大方面对内核IPC机制数据结构进行解析,希望以上的讲解能给大家建立一个IPC机制的整体认识。

为了帮助到大家能够更有效的学习OpenHarmony 开发的内容,下面特别准备了一些相关的参考学习资料:

OpenHarmony 开发环境搭建:https://qr18.cn/CgxrRy

《OpenHarmony源码解析》:https://qr18.cn/CgxrRy

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……

系统架构分析:https://qr18.cn/CgxrRy

  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

OpenHarmony 设备开发学习手册:https://qr18.cn/CgxrRy

在这里插入图片描述

OpenHarmony面试题(内含参考答案):https://qr18.cn/CgxrRy

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

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

相关文章

【教学类-58-06】黑白三角拼图06(1页3张彩色黑点卡片,一种宫格36张,适合一个班级一次操作)

作品展示 背景需求 【教学类-58-05】黑白三角拼图05&#xff08;2-10宫格&#xff0c;每个宫格随机1张-6张&#xff0c;带空格纸&#xff0c;1页3张黑白3张白卡&#xff09;-CSDN博客文章浏览阅读343次&#xff0c;点赞10次&#xff0c;收藏6次。【教学类-58-05】黑白三角拼图…

玄机平台应急响应—webshell查杀

1、前言 这篇文章说一下应急响应的内容&#xff0c;webshell查杀呢是应急响应的一部分。那么什么是应急响应呢&#xff0c;所谓的应急响应指的是&#xff0c;当网站突然出现异常情况或者漏洞时&#xff0c;能够马上根据实际问题进行分析&#xff0c;然后及时解决问题。 2、应…

新增长100人研讨会:台州制造业企业共探数字驱动下的业绩增长策略

2024年5月17日&#xff0c;纷享销客联合鑫磊压缩机&#xff0c;在台州举办了一场主题为“数字化驱动下的业绩增长策略”的研讨会。本次会议汇聚台州多家制造行业的10余位数字化管理者&#xff0c;共同探讨在数字化转型浪潮中&#xff0c;制造业如何实现业绩的持续增长。 鑫磊压…

计算机二级Access操作题总结——基本操作

基础操作题 设置主键 例&#xff1a;将“线路”表中的“线路ID”字段设置为主键 ①右键单击“线路”表&#xff1b; ②单击【设计视图】&#xff1b; ③鼠标指到表的第一行→“线路ID”处&#xff0c;右键单击&#xff1b; ④单击【主键】 设置有效性规则 例&#xff1a;设…

【Linux】Linux基本指令1

1.软件&#xff0c;OS&#xff0c;驱动 我们看看计算机的结构层次 1.1.操作系统 操作系统是一款做 软硬件管理 的软件 操作系统&#xff08;计算机管理控制程序&#xff09;_百度百科 (baidu.com) 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&a…

【全开源】景区手绘地图导览系统源码(ThinkPHP+FastAdmin)

一款基于ThinkPHPFastAdmin开发多地图手绘地图导览系统(仅支持H5)&#xff0c;景区升4A5A必备系统&#xff0c;高级版支持全景。 ​打造个性化游览新体验 一、引言&#xff1a;景区导览系统的革新 在旅游业蓬勃发展的今天&#xff0c;景区导览系统成为了提升游客体验的关键。…

java方法负载问题

先介绍一下方法的重载 下面是例子 方法名都为sum而形参是不同的 记住&#xff01; 是否为重载关系 1在同一个类里面 2形参不同&#xff08;与返回值无关&#xff09; 3方法名一样 第一个图为什么错&#xff1f; 答案&#xff1a;虽然在同一个类里面&#xff0c;并且方法名…

B2121 最长最短单词

最长最短单词 题目描述 输入 1 1 1 行句子&#xff08;不多于 200 200 200 个单词&#xff0c;每个单词长度不超过 100 ) 100) 100)&#xff0c;只包含字母、空格、逗号和句号。单词由至少一个连续的字母构成&#xff0c;空格、逗号和句号都是单词间的间隔。 输出第 1 1…

深度学习设计模式之组合模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构&#xff0c;可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式&#xff0c;将…

Kali : 安装Google Chrome 浏览器和ChromeDriver

目录 一、安装Google Chrome 浏览器 1、下载Google Chrome 2、安装Chrome 3、安装依赖包 二、安装ChromeDriver 1、查看Chrome版本 ​2、下载ChromeDriver 3、解压下载包 4、设置全局访问 5、赋予可执行权限 6、验证chromedriver 7、程序测试 一、安装Google Chrom…

Qt | QTabWidget 类(选项卡部件)

01、上节回顾 Qt | QTabBar 类(选项卡栏)02、简介 1、QTabWidget 类直接继承自 QWidget。该类提供了一个选项卡栏(QTabBar)和一个相应的页面区域,用于显示与每个选项卡相对应的页面。与 QStackedLayout 布局原理相同,只有当前页面(即可见页面)是可见的,所有其他页面都不可见…

【全开源】场馆预定系统源码(ThinkPHP+FastAdmin+UniApp)

一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆。 场馆预定系统源码&#xff1a;打造高效便捷的预定体验 一、引言&#xff1a;数字化预定时代的来临 …

【多态】(超级详细!)

【多态】&#xff08;超级详细&#xff01;&#xff09; 前言一、 多态的概念二、重写1. 方法重写的规则2. 重写和重载的区别 三、多态实现的条件四、 向上转型五、动态绑定 前言 面向对象的三大特征&#xff1a;封装性、继承性、多态性。 extends继承或者implements实现&…

【优选算法】(1)移动零

题目&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0…

【sass数字运算简介以及使用方法】

Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一种CSS预处理器&#xff0c;它允许你使用变量、嵌套规则、混合&#xff08;mixin&#xff09;、函数等特性来编写CSS&#xff0c;然后将其编译成普通的CSS代码。Sass中的数字运算是一个强大的功能&#xff0c…

Lambada表示式

Lambada Lambda表达式是Java中的一个重要特性&#xff0c;用于简化函数式编程。它提供了一种更简洁的方式来编写匿名函数&#xff0c;可以被赋值给一个变量&#xff0c;或者作为参数传递给其他方法。 Lambda表达式的基本语法如下&#xff1a; (parameter1, parameter2, .…

基于物联网技术的智能家居实训教学解决方案

引言 随着信息技术的飞速发展&#xff0c;&#xff0c;物联网&#xff08;IoT&#xff09;已深入至我们生活的每一个角落&#xff0c;从智能家居、智能健康、智能交通到智慧城市&#xff0c;无所不在。物联网技术已成为推动社会进步和产业升级的重要力量。智能家居作为物联网技…

生成式对抗算法

生成式对抗算法,通常被称为GAN(Generative Adversarial Networks,生成式对抗网络),是深度学习在图像生成方面的重要应用。生成式对抗算法是一种强大的深度学习技术,它能够在无监督学习的环境下生成高质量的数据,为多个领域的应用提供了可能性。然而,由于其训练过程相对…

5位机械工程师如何共享一台服务器算力

在数字化浪潮的推动下&#xff0c;算力共享技术正逐渐成为机械工程师们提升工作效率、优化资源配置的重要工具。那么五位机械工程师如何共享一台服务器算力呢&#xff1f; 首先&#xff0c;我们需要了解算力共享的基本概念。算力共享是指通过特定的技术手段&#xff0c;将分散…

探索Web前端三大主流框架:Angular、React和Vue.js

在现代Web开发中&#xff0c;前端框架的选择对于项目的成功至关重要。Angular、React和Vue.js作为三大主流前端框架&#xff0c;各自拥有独特的特点和优势&#xff0c;本文将对它们进行详细的探索和比较。 1. Angular Angular是由Google开发和维护的一款开源前端框架&#xf…