HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

在这里插入图片描述

目录

  • 一、动态内存运行机制
  • 二、动态内存开发流程
  • 三、动态内存使用说明
  • 四、动态内存核心算法
  • 五、动态内存接口
  • 六、代码分析(待续...)
  • 坚持就有收获

一、动态内存运行机制

动态内存管理,即在内存资源充足的情况下,根据用户需求,从系统配置的一块比较大的连续内存(内存池,也是堆内存)中分配任意大小的内存块。当用户不需要该内存块时,又可以释放回系统供下一次使用。

二、动态内存开发流程

  • 初始化 LOS_MemInit。初始一个内存池后生成一个内存池控制头、尾节点 EndNode,剩余的内存被标记为 FreeNode 内存节点。注:EndNode 作为内存池末尾的节点,size 为0。
  • 申请任意大小的动态内存 LOS_MemAlloc。判断动态内存池中是否存在大于申请量大小的空闲内存块空间,若存在,则划出一块内存块,以指针形式返回,若不存在,返回NULL。如果空闲内存块大于申请量,需要对内存块进行分割,剩余的部分作为空闲内存
    块挂载到空闲内存链表上。
  • 释放动态内存 LOS_MemFree。回收内存块,供下一次使用。调用 LOS_MemFree 释放内存块,则会回收内存块,并且将其标记为 FreeNode。在回收内存块时,相邻的FreeNode 会自动合并。

三、动态内存使用说明

  • 由于动态内存管理需要管理控制块数据结构来管理内存,这些数据结构会额外消耗内存,故实际用户可使用内存总量小于配置项 OS_SYS_MEM_SIZE 的大小。
  • 对齐分配内存接口 LOS_MemAllocAlign/LOS_MemMallocAlign 因为要进行地址对齐,可能会额外消耗部分内存,故存在一些遗失内存,当系统释放该对齐内存时,同时回收由于对齐导致的遗失内存。
  • 非连续性内存区域接口 LOS_MemRegionsAdd 的 LosMemRegion 数组参数传入的非连续性内存区域需要按各个内存区域的内存开始地址升序,且内存区域不能重叠。

四、动态内存核心算法

TLSF:Two-Level Segregated Fit 两级分割策略算法.

OpenHarmony LiteOS-M动态内存在TLSF算法的基础上,对区间的划分进行了优化,获得更优的性能,降低了碎片率。动态内存核心算法框图如下:
请添加图片描述

根据空闲内存块的大小,使用多个空闲链表来管理。根据内存空闲块大小分为两个部分:[4, 127]和[27, 231],如上图size class所示:

  • 对[4,127]区间的内存进行等分,如上图绿色部分所示,分为31个小区间,每个小区间对应内存块大小为4字节的倍数。每个小区间对应一个空闲内存链表和用于标记对应空闲内存链表是否为空的一个比特位,值为1时,空闲链表非空。[4,127]区间的内存使用1个32位无符号整数位图标记。

  • 大于127字节的空闲内存块,按照2的次幂区间大小进行空闲链表管理。总共分为24个小区间,每个小区间又等分为8个二级小区间,见上图蓝色的Size Class和Size SubClass部分。每个二级小区间对应一个空闲链表和用于标记对应空闲内存链表是否为空的一个比特位。总共24*8=192个二级小区间,对应192个空闲链表和192/32=6个32位无符号整数位图标记。

例如,当有40字节的空闲内存需要插入空闲链表时,对应小区间[40,43],第10个空闲链表,位图标记的第10比特位。把40字节的空闲内存挂载第10个空闲链表上,并判断是否需要更新位图标记。当需要申请40字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。

当有580字节的空闲内存需要插入空闲链表时,对应二级小区间[29,29+2^6],第31+2*8=47个空闲链表,第2个位图标记的第17比特位。把580字节的空闲内存挂载第47个空闲链表上,并判断是否需要更新位图标记。当需要申请580字节的内存时,根据位图标记获取存在满足申请大小的内存块的空闲链表,从空闲链表上获取空闲内存节点。如果分配的节点大于需要申请的内存大小,进行分割节点操作,剩余的节点重新挂载到相应的空闲链表上。如果对应的空闲链表为空,则向更大的内存区间去查询是否有满足条件的空闲链表,实际计算时,会一次性查找到满足申请大小的空闲链表。

五、动态内存接口

功能类别接口函数描述
初始化和删除内存池LOS_MemInit初始化一块指定的动态内存池,大小为size
LOS_MemDeInit删除指定内存池,仅打开LOSCFG_MEM_MUL_POOL时有效
申请、释放动态内存LOS_MemAlloc从指定动态内存池中申请size长度的内存
LOS_MemFree释放已申请的内存
LOS_MemRealloc按size大小重新分配内存块,并将原内存块内容拷贝到新内存块。如果新内存块申请成功,则释放原内存块
LOS_MemAllocAlign从指定动态内存池中申请长度为size且地址按boundary字节对齐的内存
获取内存池信息LOS_MemPoolSizeGet获取指定动态内存池的总大小
LOS_MemTotalUsedGet获取指定动态内存池的总使用量大小
LOS_MemInfoGet获取指定内存池的内存结构信息,包括空闲内存大小、已使用内存大小、空闲内存块数量、已使用的内存块数量、最大的空闲内存块大小
LOS_MemPoolList打印系统中已初始化的所有内存池,包括内存池的起始地址、内存池大小、空闲内存总大小、已使用内存总大小、最大的空闲内存块大小、空闲内存块数量、已使用的内存块数量。仅打开LOSCFG_MEM_MUL_POOL时有效
获取内存块信息LOS_MemFreeBlksGet获取指定内存池的空闲内存块数量
LOS_MemUsedBlksGet获取指定内存池已使用的内存块数量
LOS_MemTaskIdGet获取申请了指定内存块的任务ID
LOS_MemLastUsedGet获取内存池最后一个已使用内存块的结束地址
LOS_MemNodeSizeCheck获取指定内存块的总大小和可用大小,仅打开LOSCFG_BASE_MEM_NODE_SIZE_CHECK时有效
LOS_MemFreeNodeShow打印指定内存池的空闲内存块的大小及数量
检查指定内存池的完整性LOS_MemIntegrityCheck对指定内存池做完整性检查,仅打开LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK时有效
设置、获取内存检查级别,仅打开LOSCFG_BASE_MEM_NODE_SIZE_CHECK时有效LOS_MemCheckLevelSet设置内存检查级别
LOS_MemCheckLevelGet获取内存检查级别
为指定模块申请、释放动态内存,仅打开LOSCFG_MEM_MUL_MODULE时有效LOS_MemMalloc从指定动态内存池分配size长度的内存给指定模块,并纳入模块统计
LOS_MemMfree释放已经申请的内存块,并纳入模块统计
LOS_MemMallocAlign从指定动态内存池中申请长度为size且地址按boundary字节对齐的内存给指定模块,并纳入模块统计
LOS_MemMrealloc按size大小重新分配内存块给指定模块,并将原内存块内容拷贝到新内存块,同时纳入模块统计。如果新内存块申请成功,则释放原内存块
获取指定模块的内存使用量LOS_MemMusedGet获取指定模块的内存使用量,仅打开LOSCFG_MEM_MUL_MODULE时有效

六、代码分析(待续…)

坚持就有收获

在这里插入图片描述

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

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

相关文章

算法--数论二

这里写目录标题 高斯消元高斯消元求线性方程组用途高斯消元的数学思想例题代码 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 高斯消元 高斯消元求线性方程组 用途 这个…

Vite 5.0 正式发布

11 月 16 日,Vite 5.0 正式发布,这是 Vite 道路上的又一个重要里程碑!Vite 现在使用 Rollup 4,这已经代表了构建性能的大幅提升。此外,还有一些新的选项可以改善开发服务器性能。 Vite 4 发布于近一年前,它…

黄金交易策略(Nerve Nnife.mql4):做单手数设计

完整EA:Nerve Knife.ex4黄金交易策略_黄金趋势ea-CSDN博客 NK的做单量是由参数设定的,以下分别是参数项: 考虑到复利的情况,若10000本金,在以上三个参数的设计下,第1单的购买量是0.01*10,第2单是0.01*10*2…

Tuxera NTFS 2024永久免费版Mac系统NTFS磁盘读写软件

Tuxera NTFS 2024是一款Mac系统NTFS磁盘读写软件,由Tuxera公司开发。该软件可以在Mac上打开、编辑、复制、移动或删除存储在Windows NTFS格式USB驱动器上的文件。对于需要在Mac和Windows之间频繁传输文件的用户来说,Tuxera NTFS 2024无疑是一个方便且高效…

00x集——查询CAD (DWG格式)文件扩展属性(vba代码实现)

cass文件中图元经常有扩展属性,查询扩展属性代码及方法如下: 打开dwg文件 —> altF11打开ide窗口,粘贴如下代码,并运行: Sub 查看扩展属性()提取块的扩展属性只针对带有属性的图元On Error Resume NextDim sst As …

拿捏c语言指针(上)

目录 前言 ​编辑 指针 内存与地址 计算机常见单位 理解编址 取地址,指针变量,解引用 取地址 指针变量 解引用 指针变量大小 指针类型的作用 char*解引用后 指针-整数 应用 void*指针 const修饰指针变量 const修饰普通变量 const修饰指…

数据库实验三

目录 1 建立表并插入数据 1.1 SQL语句 1.2 截图 2 单表查询 2.1 选择表中若干列 2.1.1 SQL语句 2.1.2 截图 2.2 选择表中若干元组 2.2.1 SQL语句 2.2.2 截图 2.3 order by子句 2.3.1 SQL语句 2.3.2 截图 ​​​​​​​2.4 聚集函数 2.4.1 SQL语句 2.4.2 截图 …

Java 和 JavaScript 的奇妙协同:语法结构的对比与探索(中)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试

2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。 虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研…

Ollama 可以在 Windows 上运行了

Ollama 可以在 Windows 上运行了 0. 引言1. 下载 Ollma 安装文件2. 安装 Ollama3. 使用 Ollama4. (可选)环境变量5. (可选)修改默认模型 0. 引言 Ollama 终于可以在 Windows 上运行了,一直以来都是 “Coming soon”。 运行 Mixtral 8*7B 试了一下,推理…

OpenCV中的边缘检测技术及实现

介绍: 边缘检测是计算机视觉中非常重要的技术之一。它用于有效地识别图像中的边缘和轮廓,对于图像分析和目标检测任务至关重要。OpenCV提供了多种边缘检测技术的实现,本博客将介绍其中的两种常用方法:Canny边缘检测和Sobel边缘检测。 理论介…

解决vscode报错,在赋值前使用了变量“XXX“

问题:如图所示 解决方法: 法一: 补全函数使其完整 法二: 使用断言