一、背景

OpenAtom OpenHarmony(以下简称“OpenHarmony”)轻量系统面向MCU类处理器例如ARM Cortex-M、RISC-V 32位的设备,硬件资源极其有限,支持的设备最小内存为128KiB,可以提供多种轻量级网络协议,轻量级的图形框架,以及丰富的IOT总线读写部件等。可支撑的产品如智能家居领域的连接类模组、传感器设备、穿戴类设备等。

在轻量系统内核中,由于可用内存资源少,一般的数据资源都是小批量的,所以其资源管理方式都比较简单且相似,本文重点讲解在轻量系统内核中,典型的资源的存储和访问方式。这些典型的资源包括互斥锁,信号量、消息队列、事件、定时器等。

本文以互斥锁为例来探究其内核资源的主要管理方式。

互斥锁软件模块相关的代码在如下位置

https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/src/los_mux.c

https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_mux.h

二、模块使能和容量

互斥锁软件模块是编译可裁剪模块,可以通过编译配置宏来打开或者关闭具体的编译配置宏定义在https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_config.h文件中

通过这个文件可知,liteos_m内核默认是使能互斥锁功能的,但我们根据具体产品可以对其进行设置,如某产品对应的配置文件https://gitee.com/openharmony/device_qemu/blob/master/arm_mps2_an386/liteos_m/board/target_config.h

这里明确看到此产品使用了互斥锁功能,如果需要将其关闭,直接修改成0值即可。

互斥锁支持的最大数目不同产品可以不同,当前这个产品为24,如果产品没有定义容量限制,那么使用默认容量限制(见los_config.h中)。

1.数据保存方式

由于容量较小,采用数组这种简单和原始的数据保存方式,在系统初始化的时候申请数组内存。如下(los_mux.c中)

三、数据访问方式

由于轻量系统的计算资源相对受限,因此需要在算法上斤斤计较。目前提供了ID方式(数组下标访问)和链表访问2种方式,如下进行详细说明。

1. 通过ID访问

在los_mux.h中,定义了通过id访问互斥锁的方法,其实质就是数组下标访问,获取具体互斥锁资源的地址

2.通过空闲链表访问

随着互斥锁的申请和释放,系统中当前正在使用的互斥锁数目是动态变化的。由于采用了数组存储以及内存预留的策略,所以数组中的互斥锁有些是空闲的,有些是正在使用的,并且其状态随着系统的运行过程而无规律地变化。

若仅依赖于数组方式访问互斥锁,则查询空闲互斥锁是一个稍耗时的算法,因为要遍历数组。

为了加快空闲互斥锁的查询,本系统采用了将所有空闲互斥锁组织成链表的方法。这样每次取出链表第一个节点即可,可以极大提升性能。

在los_mux.h中,通过增加muxList字段将所有空闲的互斥锁组织成链表

在los_mux.c中,系统初始化时,所有互斥锁都为空闲状态,放入空闲链表

在los_mux.c中,创建互斥锁时,从空闲链表取下空闲状态的互斥锁

在los_mux.c中,释放互斥锁时,将互斥锁放入空闲链表

四、健壮性考虑

1.空闲状态双保险

除了通过判断是否在空闲链表上来判断描述符是否空闲以外,在结构体中也保存了是否空闲的状态,这样可以增加空闲状态判断的健壮性;另外,通过直接判断状态也比判断是否在链表中性能更高。如下(los_mux.c中):

2.中断上下文保护

由于在中断上下文中不允许有睡眠操作,而互斥锁获取逻辑就是典型的具有睡眠操作的逻辑,所以,互斥锁的获取和释放不能在中断上下文中,如下(los_mux.c中)。

3.任务切换保护

IPC操作有时会需要任务切换,如果当前任务切换功能被临时关闭,则不允许进行IPC操作,互斥锁获取操作也是IPC操作的一种。

代码如下(los_mux.c):

4.关键任务不允许切换

一些系统关键任务运行后,不允许执行IPC逻辑,比如软件定时器任务:其监控多个定时器的超时。假定其执行IPC逻辑导致任务等待某资源比较长的时间,会导致后续部分定时器定时功能失效(不准确)。代码如下(los_mux.c):

五、总结

轻量系统中内核资源多采用数组与空闲链表相结合的方式。除了OpenHarmony轻量系统,其他嵌入式系统中这类的数据存储方式也比较常见。这种方式有如下几个突出的优点

● 简单易懂

● 读写效率高

● 代码紧凑

OpenHarmony轻量系统中内核资源主要管理方式的更多相关文章

  1. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  2. 07. struts2中对Action的管理方式

    web.xml配置文件的常用代码 <filter> <filter-name>struts2</filter-name> <filter-class>o ...

  3. Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)

    1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...

  4. 实例讲解Linux系统中硬链接与软链接的创建

    导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说 ...

  5. 如何发挥ERP系统中的财务监控职能?

    ERP系统的管理理念与特点 ERP,是整合了企业管理理念.业务流程.基础数据.人力物力.计算机硬件和软件于一体的企业资源管理系统.ERP系统运用信息技术将企业的资金流.物资流.信息流进行有效的集成,使 ...

  6. 通过源码浅析Java中的资源加载

    前提 最近在做一个基础组件项目刚好需要用到JDK中的资源加载,这里说到的资源包括类文件和其他静态资源,刚好需要重新补充一下类加载器和资源加载的相关知识,整理成一篇文章. 理解类的工作原理 这一节主要分 ...

  7. Android中的资源访问

    Android中的资源是指非代码部分,指外部文件. assets中保存的一般是原生的文件,例如MP3文件,Android程序不能直接访问,必须通过AssetManager类以二进制流的形式来读取. r ...

  8. 【Docker】在Linux系统中安装Docker虚拟机、启动停止重启查看Docker命令

    安装Docker 文章目录 安装Docker Docker虚拟机架构 在Linux系统中安装Docker虚拟机 管理Docker虚拟机 参考资料 Docker虚拟机架构 Docker创建的所有虚拟实例 ...

  9. 『学了就忘』Linux服务管理 — 75、Linux系统中的服务

    目录 1.服务的介绍 2.Windows系统中的服务 3.Linux系统中服务的分类 4.独立的服务和基于xinetd服务的区别 5.如何查看一个服务是独立的服务还是基于xinetd的服务 (1)查看 ...

  10. 在 Linux 系统中安装Load Generator ,并在windows 调用方法

    在 Linux 系统中安装Load Generator ,并在windows 调用 由于公司需要测试系统的最大用户承受能力,所以需要学习使用loadrunner.在安装的时候碰到了不少问题,所以写下此 ...

随机推荐

  1. 【LeetCode回溯算法#04】组合总和I与组合总和II(单层处理位置去重)

    组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target ...

  2. 一文搞懂I/O模型

    目录 基础知识 内核 内核空间&用户空间 缓存IO 文件和流 文件描述符 I/O模型 同步阻塞 I/O(blocking IO) 同步非阻塞 I/O(blocking IO) I/O 多路复用 ...

  3. 【转载】大数据OLAP系统--开源组件方案对比

    开源大数据OLAP组件,可以分为MOLAP和ROLAP两类.ROLAP中又可细分为MPP数据库和SQL引擎两类.对于SQL引擎又可以再细分为基于MPP架构的SQL引擎和基于通用计算框架的SQL引擎: ...

  4. curator-framework 使用采坑记之org.apache.zookeeper.ClientCnxn - Opening socket connection to server..........Will not attempt to authenticate using SASL (unknown error)报错解决

    一.curator-framework  简介 curator-framework 是对zookeeper做的分二次分布式封装处理,目前代码也是apache 开源社区维护,如下所示. github地址 ...

  5. Advanced .Net Debugging 3:基本调试任务(上)

    一.简介 这是我的<Advanced .Net Debugging>这个系列的第三篇文章.这个系列的每篇文章写的周期都要很长,因为每篇文章都是原书的一章内容(太长的就会分开写).再者说,原 ...

  6. Java中使用JSON传递字符串的注意事项

    一.问题由来 项目开发中,由于实际需要将某一个功能模块抽取成了一个单独的服务,其他地方需要调用的时候,通过Spring提供的RestTemplate类发送请求进行调用. 经过测试这种方法完全可行,我和 ...

  7. vxe table columns 要用data里的值,用computed的值会导致排序部分不好用。

    vxe table columns 要用data里的值,用computed的值会导致排序部分不好用.

  8. gcc编译stm32 f103出现错误init.c:(.text.__libc_init_array+0x20): undefined reference to `_init'

    解决方法: 方法一:去掉makefile中的编译选项:-nostartfiles 方法二:方法一不凑效的情况下,添加编译选型:--specs=nano.specs

  9. B站Aimls的JavaFx教程目录合集

    B站里有时候不太好去找资源,用JS爬了下,整出标题和链接,方便后续查询某个知识点的使用! JavaFX视频教程第1课,hello world JavaFX视频教程第2课,application的启动方 ...

  10. Android 开发day1

    下载了安卓开发软件 Android studio 下载过程中遇到了,C盘默认安装路径不匹配问题,因为我的系统文件是中文的,软件是国外的软件,导致了他不让我安装,我还是最后在C盘创建了一个文件后,直接安 ...