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.mfbz.cn/a/386278.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

漫漫数学之旅019

文章目录 经典格言数学习题古今评注名人小传 - 大卫希尔伯特 经典格言 没有人能够把我们从康托为我们创造的乐园中驱逐出去。——大卫希尔伯特(David Hilbert) 大卫希尔伯特,这位数学界的“顽皮大亨”,曾经用一种近乎宣誓的方式来…

更新至2022年,各省人口高质量城镇化指标体系构建原始数据(13个指标)

更新至2022年,各省人口高质量城镇化指标体系构建原始数据 1、时间:更新至2022年,具体每个指标时间见下文 2、来源:整理自国家统计局、统计年鉴 3、范围:31省市 4、指标: 2008-2022年每十万人口高等学校…

【QT+QGIS跨平台编译】之三十六:【RasterLite2+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、RasterLite2介绍二、文件下载三、文件分析四、pro文件五、编译实践一、RasterLite2介绍 RasterLite2是一个开源的轻量级栅格数据库,可以用于存储和管理各种类型的栅格数据,包括卫星遥感图像、数字高程模型等。 与传统的GIS数据存储方式不同,RasterLite2采用基…

Swift Combine 有序的异步操作 从入门到精通十二

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二Swift Combine 管道 从入门到精通三Swift Combine 发布者publisher的生命周期 从入门到精通四Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五Swift Com…

零基础学编程怎么入手,中文编程工具构件箱之星空构件用法教程,系统化的编程视频教程上线

零基础学编程怎么入手,中文编程工具构件箱之星空构件用法教程,系统化的编程视频教程上线 一、前言 今天给大家分享的中文编程开发语言工具资料如下: 编程入门视频教程链接 http://​ https://edu.csdn.net/course/detail/39036 ​ 编程…

C++笔记:类与对象的语法

文章目录 1 简单认识面向过程与面向对象1.1 面向过程1.2 面向对象 2 类的引入:struct -> class3 类的定义3.1 class 定义类的语法3.2 成员变量的命名建议 4 类的访问限定符4.1 class 和 struct 的区别4.2 C更喜欢用class定义类的原因 5 类的作用域5.1 声明定义合…

openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O

文章目录 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O218.1 查看I/O状况218.2 性能参数分析 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&#xf…

HTML世界之第二重天

目录 一、HTML 格式化 1.HTML 文本格式化标签 2.HTML "计算机输出" 标签 3.HTML 引文, 引用, 及标签定义 二、HTML 链接 1.HTML 链接 2.HTML 超链接 3.HTML 链接语法 4.文本链接 5.图像链接 6.锚点链接 7.下载链接 8.Target 属性 9.Id 属性 三、HTML …

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor OIDC 单点登录授权实例2-登录信息组件wasmBlazor OIDC 单点登录授权实例3-服务端管理组件Blazor OIDC 单点登录授权实例4 …

虚拟人专题报告:虚拟人深度产业分析报告

今天分享的是虚拟人系列深度研究报告:《虚拟人专题报告:虚拟人深度产业分析报告》。 (报告出品方:Q量子位) 报告共计:18页 技术背景 虚拟数字人指存在于非物理世界中,由计算机图形学、图形渲…

Waymo数据集下载与使用

在撰写论文时,接触到一个自动驾驶数据集Waymo Dataset 论文链接为:https://arxiv.org/abs/1912.04838v7 项目链接为:https://github.com/waymo-research/waymo-open-dataset 数据集链接为:https://waymo.com/open waymo提供了两种…

WordPress每天发布60s插件

源码名称:WordPress每天发布60s插件 适用平台:WordPress Wordpress还是比较适合个人博客网站,这个60秒插件适合一些喜欢自动发新闻早报晚报人员。 wordpress一直以来都是建立个人博客网站比较适合的脚手架,非常合适个人使用。 小程序源码就找 源码软件…

【小赛1】蓝桥杯双周赛第5场(小白)思路回顾

我的成绩:小白(5/6) 完稿时间:2024-2-13 比赛地址:https://www.lanqiao.cn/oj-contest/newbie-5/ 相关资料: 1、出题人题解:“蓝桥杯双周赛第5次强者挑战赛/小白入门赛”出题人题解 - 知乎 (zhihu.com) 2、矩阵快速幂&…

综合例题及补充

目录 查询员工的编号、姓名、雇佣日期,以及计算出每一位员工到今天为止被雇佣的年数、月数、天数 计算出年 计算月 计算天数 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 查询员工的编号、姓名、雇佣日期&#xff0c…

【lesson52】 线程概念

文章目录 线程学习前的了解知识理解线程 线程学习前的了解知识 线程在进程内部执行,是OS调度的基本单位 OS可以做到让进程对进程地址空间进行资源的细粒度划分 比如malloc一块内存空间,我们拿到的一般都是起始位置,但是最终位置我们一般都不…

揭秘产品迭代计划制定:从0到1打造完美迭代策略

产品迭代计划是产品团队确保他们能够交付满足客户需求的产品以及实现其业务目标的重要工具。开发一个成功的产品迭代计划需要仔细考虑产品的目标、客户需求、市场趋势和可用资源。以下是帮助您创建产品迭代计划的一些步骤:建立产品目标、收集客户反馈、分析市场趋势…

【项目】高并发内存池

高并发内存池 【项目】高并发内存池项目介绍这个项目做的是什么? 内存池相关知识池化技术内存池malloc 定长内存池的实现高并发内存池整体框架设计ThreadCache对齐规则封装FreeList类封装thread cache类TLS无锁访问 CenctralCache整体设计页号规定span结构SpanList结…

Decian 12.x基于LNMP安装phpIPAM(IP管理系统)

phpipam是一个开源Web IP地址管理应用程序(IPAM)。其目标是提供轻便,且有用的IP地址管理系统。它是基于PHP的应用程序,具有MySQL数据库后端,使用jQuery库,ajax和HTML5 / CSS3功能。 在Debian 12中&…

Nginx实战:安装搭建

目录 前言 一、yum安装 二、编译安装 1.下载安装包 2.解压 3.生成makefile文件 4.编译 5.安装执行 6.执行命令软连接 7.Nginx命令 前言 nginx的安装有两种方式: 1、yum安装:安装快速,但是无法在安装的时候带上想要的第三方包 2、…

机械革命混合模式和独显直连互相切换

原文:https://blog.iyatt.com/?p13773 默认状态是混合输出,在任务管理器中可以看到两个 GPU,分别是核显和独显 从混合模式切换到独显直连可以通过机械革命电竞控制台(重装过系统的需要去官网下载安装驱动) 打开后…
最新文章