OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】下

news2024/9/21 4:14:21

往期知识点记录:

  • 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
  • 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
  • 子系统开发内核
  • 轻量系统内核(LiteOS-M)
  • 轻量系统内核(LiteOS-M)【中断管理】
  • 轻量系统内核(LiteOS-M)【任务管理】
  • 轻量系统内核(LiteOS-M)【内存管理】
  • 轻量系统内核(LiteOS-M)【内核通信机制】
  • 轻量系统内核(LiteOS-M)【时间管理】
  • 轻量系统内核(LiteOS-M)【扩展组件】
  • 轻量系统内核(LiteOS-M)【内存调测】
  • 轻量系统内核(LiteOS-M)【异常调测】
  • 轻量系统内核(LiteOS-M)【Trace调测】
  • 轻量系统内核(LiteOS-M)【LMS调测】
  • 轻量系统内核(LiteOS-M)【SHELL】
  • 小型系统内核(LiteOS-A)【概述】
  • 小型系统内核(LiteOS-A)【内核启动】
  • 小型系统内核(LiteOS-A)【中断及异常处理】
  • 标准系统内核(Linux)【New IP内核协议栈】
  • 标准系统内核(Linux)【内核增强特性 > 任务调度】
  • 持续更新中……

读写锁

基本概念

读写锁与互斥锁类似,可用来同步同一进程中的各个任务,但与互斥锁不同的是,其允许多个读操作并发重入,而写操作互斥。

相对于互斥锁的开锁或闭锁状态,读写锁有三种状态:读模式下的锁,写模式下的锁,无锁。

读写锁的使用规则:

  • 保护区无写模式下的锁,任何任务均可以为其增加读模式下的锁。

  • 保护区处于无锁状态下,才可增加写模式下的锁。

多任务环境下往往存在多个任务访问同一共享资源的应用场景,读模式下的锁以共享状态对保护区访问,而写模式下的锁可被用于对共享资源的保护从而实现独占式访问。

这种共享-独占的方式非常适合多任务中读数据频率远大于写数据频率的应用中,提高应用多任务并发度。

运行机制

相较于互斥锁,读写锁如何实现读模式下的锁及写模式下的锁来控制多任务的读写访问呢?

  • 若A任务首次获取了写模式下的锁,有其他任务来获取或尝试获取读模式下的锁,均无法再上锁。

  • 若A任务获取了读模式下的锁,当有任务来获取或尝试获取读模式下的锁时,读写锁计数均加一。

开发指导

接口说明

表1 读写锁模块接口

功能分类接口描述
读写锁的创建和删除- LOS_RwlockInit:创建读写锁
- LOS_RwlockDestroy:删除指定的读写锁
读模式下的锁的申请- LOS_RwlockRdLock:申请指定的读模式下的锁
- LOS_RwlockTryRdLock:尝试申请指定的读模式下的锁
写模式下的锁的申请- LOS_RwlockWrLock:申请指定的写模式下的锁
- LOS_RwlockTryWrLock:尝试申请指定的写模式下的锁
读写锁的释放LOS_RwlockUnLock:释放指定读写锁
读写锁有效性判断LOS_RwlockIsValid:判断读写锁有效性

开发流程

读写锁典型场景的开发流程:

  1. 创建读写锁LOS_RwlockInit。

  2. 申请读模式下的锁LOS_RwlockRdLock或写模式下的锁LOS_RwlockWrLock。

申请读模式下的锁:

*   若无人持有锁,读任务可获得锁。
*   若有人持有锁,读任务可获得锁,读取顺序按照任务优先级。
*   若有人(非自己)持有写模式下的锁,则当前任务无法获得锁,直到写模式下的锁释放。

申请写模式下的锁:

*   若该锁当前没有任务持有,或者持有该读模式下的锁的任务和申请该锁的任务为同一个任务,则申请成功,可立即获得写模式下的锁。
*   若该锁当前已经存在读模式下的锁,且读取任务优先级较高,则当前任务挂起,直到读模式下的锁释放。

3.申请读模式下的锁和写模式下的锁均有三种:无阻塞模式、永久阻塞模式、定时阻塞模式,区别在于挂起任务的时间。

4.释放读写锁LOS_RwlockUnLock。

  • 如果有任务阻塞于指定读写锁,则唤醒被阻塞任务中优先级高的,该任务进入就绪态,并进行任务调度;

  • 如果没有任务阻塞于指定读写锁,则读写锁释放成功。

  1. 删除读写锁LOS_RwlockDestroy。

说明:

  • 读写锁不能在中断服务程序中使用。

  • LiteOS-A内核作为实时操作系统需要保证任务调度的实时性,尽量避免任务的长时间阻塞,因此在获得读写锁之后,应该尽快释放该锁。

  • 持有读写锁的过程中,不得再调用LOS_TaskPriSet等接口更改持有读写锁任务的优先级

用户态快速互斥锁

基本概念

Futex(Fast userspace mutex,用户态快速互斥锁)是内核提供的一种系统调用能力,通常作为基础组件与用户态的相关锁逻辑结合组成用户态锁,是一种用户态与内核态共同作用的锁,例如用户态mutex锁、barrier与cond同步锁、读写锁。其用户态部分负责锁逻辑,内核态部分负责锁调度。

当用户态线程请求锁时,先在用户态进行锁状态的判断维护,若此时不产生锁的竞争,则直接在用户态进行上锁返回;反之,则需要进行线程的挂起操作,通过Futex系统调用请求内核介入来挂起线程,并维护阻塞队列。

当用户态线程释放锁时,先在用户态进行锁状态的判断维护,若此时没有其他线程被该锁阻塞,则直接在用户态进行解锁返回;反之,则需要进行阻塞线程的唤醒操作,通过Futex系统调用请求内核介入来唤醒阻塞队列中的线程。

运行机制

当用户态产生锁的竞争或释放需要进行相关线程的调度操作时,会触发Futex系统调用进入内核,此时会将用户态锁的地址传入内核,并在内核的Futex中以锁地址来区分用户态的每一把锁,因为用户态可用虚拟地址空间为1GiB,为了便于查找、管理,内核Futex采用哈希桶来存放用户态传入的锁。

当前哈希桶共有80个,0-63号桶用于存放私有锁(以虚拟地址进行哈希),64-79号桶用于存放共享锁(以物理地址进行哈希),私有/共享属性通过用户态锁的初始化以及Futex系统调用入参确定。

如下图所示,每个futex哈希桶中存放被futex_list串联起来的哈希值相同的futex node,每个futex node对应一个被挂起的task,node中key值唯一标识一把用户态锁,具有相同key值的node被queue_list串联起来表示被同一把锁阻塞的task队列。

图1 Futex设计图

Futex操作

Futex模块接口

Futex模块支持以下三种操作:

功能分类接口名称描述
设置线程等待OsFutexWait向Futex表中插入代表被阻塞的线程的node
唤醒被阻塞线程OsFutexWake唤醒一个被指定锁阻塞的线程
调整锁的地址OsFutexRequeue调整指定锁在Futex表中的位置

说明: Futex系统调用通常与用户态逻辑共同组成用户态锁,故推荐使用用户态POSIX接口的锁。

信号

基本概念

信号(signal)是一种常用的进程间异步通信机制,用软件的方式模拟中断信号,当一个进程需要传递信息给另一个进程时,则会发送一个信号给内核,再由内核将信号传递至指定进程,而指定进程不必进行等待信号的动作。

运行机制

信号的运作流程分为三个部分,如表1:

表1 信号的运作流程及相关接口(用户态接口)

功能分类接口名称描述
注册信号回调函数signal注册信号总入口及注册和去注册某信号的回调函数。
注册信号回调函数sigaction功能同signal,但增加了信号发送相关的配置选项,目前仅支持SIGINFO结构体中的部分参数。
发送信号kill
pthread_kill
raise
alarm
abort
发送信号给某个进程或进程内发送消息给某线程,为某进程下的线程设置信号标志位。
触发回调由系统调用与中断触发,内核态与用户态切换前会先进入用户态指定函数并处理完相应回调函数,再回到原用户态程序继续运行。

说明: 信号机制为提供给用户态程序进程间通信的能力,故推荐使用上表1列出的用户态POSIX相关接口。

注册回调函数:

void *signal(int sig, void (*func)(int))(int);
  • 31 号信号,该信号用来注册该进程的回调函数处理入口,不可重复注册。

  • 0-30 号信号,该信号段用来注册与去注册回调函数。

注册回调函数:

int sigaction(int, const struct sigaction *__restrict, struct sigaction *__restrict); 

支持信号注册的配置修改和配置获取,目前仅支持SIGINFO的选项,SIGINFO内容见sigtimedwait接口内描述。

发送信号:

  • 进程接收信号存在默认行为,单不支持POSIX标准所给出的STOP及CONTINUE、COREDUMP功能。

  • 进程无法屏蔽SIGSTOP、SIGKILL、SIGCONT信号。

  • 某进程后被杀死后,若其父进程不回收该进程,其转为僵尸进程。

  • 进程接收到某信号后,直到该进程被调度后才会执行信号回调。

  • 进程结束后会发送SIGCHLD信号给父进程,该发送动作无法取消。

  • 无法通过信号唤醒处于DELAY状态的进程。

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

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

相关文章

前端自动化测试框架:如何选择最适合你的方案

前端自动化测试是指使用代码或工具来模拟用户在浏览器上的操作,以检验网页或应用程序的功能和性能是否符合预期。前端自动化测试可以提高开发效率,减少人工错误,保证软件质量和用户体验。 但是,在众多的前端自动化测试框架中&…

鸿蒙应用开发:视频播放

AVPlayer API同样适用于视频播放,与音频播放的区别仅在于是否提供surfaceId(相当于给视频播放选择一个容器)。鸿蒙官网描述,surfaceId指视频窗口ID,只允许在initialized状态下设置,在视频播放时要指定窗口进…

破损shp文件修复

大家中秋节快乐! 介绍 半年前写过破损shp文件修复的内容,当时写了一个简陋的小工具。 现在重新讲讲这方面的内容,这篇文章也主要围绕以下两个方面进行展开: 1、当时是怎么实现破损shp文件修复 2、现在怎么把这个功能集成到rs…

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制(ACK) 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号,之后会介…

如何使用ssm实现毕业生学历证明系统+vue

TOC ssm651毕业生学历证明系统vue 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上不可跨域的鸿沟&#xff0…

Linux C# DAY3

作业 1、 #!/bin/bash mkdir -p ~/dir/dir1 mkdir ~/dir/dir2 cp ./* ~/dir/dir1 cp ./*.sh ~/dir/dir2 cd ~/dir/ tar -cvJf dir2.tar.xz ./dir2 mv dir2.tar.xz ~/dir/dir1/ cd ~/dir/dir1/ tar -xvf dir2.tar.xz 2、 #!/bin/bash head -5 /etc/group | tail -1 sudo mkdi…

Docker安装mysql并配置主从,超详细

简介: 本文使用docker安装mysql,并创建master节点,slave节点用于实现主从。废话不多说,直接开始。 1.docker下载镜像,这里我以5.7版本为例。 docker pull mysql:5.7 2.在宿主机上新建如下目录,进行文件挂…

Lichee NanoKVM基本使用环境

Lichee NanoKVM基本使用环境 本文章主要记录一些自己在初期的使用,以及自己的一些经验 ,非常感谢sipeed NanoKVM官方使用教程 外观(博主自己的是lite版本,非常感谢sipeed) Lichee NanoKVM 是基于 LicheeRV Nano 的 I…

专为GOA TFT-LCD面板设计的16ch水平移位器-iML7272A

GOA是Gate on Array的简写,简单可以理解为gate IC集成在玻璃上了,面板就可以不用gate ic了,窄边框面板大多数都用了GOA技术。随着窄边框设计的日益流行,面板设计的周边空间被逐渐压缩,在传统的GOA电路设计中&#xff0…

Python学习——【3.1】函数

文章目录 【3.1】函数一、函数的定义二、函数的参数三、函数的返回值(一)函数返回值的定义(二)None类型 四、函数的说明文档五、函数的嵌套调用六、函数中变量的作用域(一)局部变量(二&#xff…

(数组) LeetCode 1184. 公交站间的距离

原题链接 一. 题目描述 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i 1) % n 的车站之间的距离。 环线上的公交车都可以按顺时针和逆时针的方向行驶。 …

解决:The play() request was interrupted by a call to pause().报错

前言: 最近在公司中实现进入页面之后点击单词直接播放音频的时候,发现音频并不会播放声音,并且控制台报错: 研究之后找到了解决方案,与小伙伴们进行分享 原因: 首先看这句话的意思: 在调用 …

【C++】C++ STL探索:Priority Queue与仿函数的深入解析

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与Queue 这篇文…

中国数据中心服务器CPU行业发展概述

2024中国服务器CPU行业概览:信创带动服务器CPU国产化 AA体系是一种基于ARM指令系统和Android操作系统的体系结构,主要用于移动设备。与Wintel体系不同,AA体系中CPU厂商对芯片或系统厂商进行指令系统或IP核授权,操作系统厂商提供基…

Ansbile-变量

文章目录 一、Ansible的常量(内置的变量)有哪些???????????????&#xff1…

八、explicit关键字在C++中的用法

使用方法:修饰单参构造函数 作用:explicit修饰构造函数,禁止类型转换 使用Date d2 19; 这样的方式来进行d2对象的实例化。 在程序上是可以进行下去的,但不符合语法、也不合逻辑。 class Date { public:Date(int day)…

sqlite数据库设计工具

下载 开发环境 VS2022 + Qt5.14.2 CMake修改 add_subdirectory(sqlite3-cmake) include_directories(${CMAKE_SOURCE_DIR}/sqlite3-cmake/src) target_link_libraries(${PROJECT_NAME} sqlite3) 效果 参考 https://github.com/sqlitebrowser/sqlitebrowser

Java之封装

文章目录 1.封装1.1 什么是封装1.2 访问限定符1.3 包1.3.1 什么是包1.3.2 导包1.3.3 自定义包 2. static2.1 static 修饰成员变量2.2 static 修饰成员方法2.3 static成员变量初始化 3. 代码快3.1 普通代码块3.2 实例代码块3.3 静态代码块 4. 对象的打印 1.封装 1.1 什么是封装…

【JPCS出版】第四届电气工程与计算机技术国际学术会议(ICEECT 2024,9月27-29)

会议信息 会议官网:www.iceect.com 2024 4th International Conference on Electrical Engineering and Computer Technologywww.iceect.com 时间地点:2024年9月27日-29日 | 线上(ZOOM) 最终截稿时间:9月23日 主办…

【GVINS】

【GVINS】 1. GVINS的系统特点2. GVINS的融合导航存在问题3. GVINS的信号的组成4. GVINS的信号的组成 原理推导知乎 1. GVINS的系统特点 概述了一种名为GVINS的系统,它旨在解决视觉-惯性里程计(VIO)在长时间运行时出现的漂移问题。GVINS通过…