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

news2024/11/30 2:27:28

在这里插入图片描述

目录

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

一、动态内存运行机制

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

二、动态内存开发流程

  • 初始化 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.coloradmin.cn/o/1447735.html

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

相关文章

单个摄像头(单目RGB)实时3D手的跟踪

概述: 通过单个普通RGB摄像头就可以实现3D手的实时跟踪。 来自论文: GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 官网地址如下链接: GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 应用…

Linux_环境变量_命令行参数

一.环境变量 在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。当你想要运行一个程序时: 如果带有路径的话,则直接将对应路径的程序加载进内存&#xff0…

Linux入门(1)Linux介绍

目录 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的&am…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中,安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时,保护用户信息的安全性是非常重要…

vue-组件组成和组件通信(四)

组件的三大组成部分 (结构/样式/逻辑) scoped样式冲突 默认情况:写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式: 默认组件中的样式会作用到全局 2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组…

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection 1 实现尺度不变性 不管多近多远,多大多小都能检测出来 找到一个函数,实现尺度的选择特性 2 高斯偏导模版求边缘 做卷积 3 高斯二阶导拉普拉斯 看哪个信号能产生最大响应 高斯…

TinUI v5预发布记录

TinUI v5预发布记录 前言新控件滚动选择框菜单按钮 新样式pre1pre2pre3 新功能导入字体文件 前言 TinUI是一个从2021年正式开始并一直维护到现在的小项目,中间经过了四代版本的更新。因为一些原因,2023年,TinUI-4后更新较少。 TinUI发展历程…

【MATLAB】小波神经网络回归预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波神经网络回归预测算法是一种利用小波变换和人工神经网络相结合的方法,用于解决回归预测问题。下面将详细介绍该算法的原理与方法: 小波变换: 小波变…

网络渗透测试:Wireshark抓取qq图片

Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…

内网穿透 | 推荐两个免费的内网穿透工具

目录 1、简介 2、Ngrok 2.1、下载安装 2.2、运行 2.3、固定域名 2.4、配置多服务 3、cpolar 3.1、下载安装 3.2、运行 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后,人工智能将掌握在谁的手中? 简述 根据 OpenAI 最近的一份报告,到 2030 年,训练大型 AI 模型的成…

matplotlib从起点出发(13)_Tutorial_13_Autoscaling

0 自动放缩 轴上的限制可以手动设置(例如ax.set_xlim(xmin, xmax)),或者Matplotlib可以根据Axes上已有的数据自动设置它们。此种放缩行为有许多选项,如下所述。 我们将从一个简单的折线图开始,显示自动缩放将轴限制扩展到数据的…

11-OpenFeign-实现负载均衡策略

2021.0.1版本使用 spring-cloud-loadbalancer 1、默认开启负载均衡策略 使用default RoundRobinLoadBalancer策略 无需yaml文件配置,openfeignclient配置 RandomLoadBalancer :基于随机访问的负载均衡策略NacosLoadBalancer:基于Nacos权重…

软件项目—项目管理计划

《项目管理计划》 1.项目总体组织架构 2.项目进度管理办法 3.项目沟通管理 4.项目风险管理

c++关于this指针

this指针是隐藏在每一个成员函数中的特殊指针,它指向的是所在成员对象的本身。this顾名思义,就是“这个” this:指针,指向当前的对象 ,"我" ,只能出现在类的成员函数中,一般不使用 class A { private:int i; public:int get()//获取成员变量…

微信小程序开发学习笔记《17》uni-app框架-tabBar

微信小程序开发学习笔记《17》uni-app框架-tabBar 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、创建tabBar分支 运行如下的命令,基于master分支在本地创建tabBar子分支&#x…

2.13学习总结

1.出差(Bleeman—ford)(spfa) (dijkstra) 2.最小生成树(prim)(Kruskal) 最短路问题: 出差https://www.luogu.com.cn/problem/P8802 题目描述 AA …

专利申请与论文发表有什么区别

一、背景 专利申请和发表期刊论文是科研成果两种不同的保护与传播方式,它们的主要区别在于: 1. 目的与性质: - **专利申请**:主要目的是获得对发明创造的法律保护,确保发明人在一定时期内(如发明专利通…

数据工程工程师学习路线图

数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…

复旦大学最新研究:如何让大模型敢回答“我不知道”?

引言:AI助手的真实性挑战 在人工智能(AI)的发展进程中,基于大型语言模型(LLMs)的AI助手已经在多个任务中展现出惊人的性能,例如对话、解决数学问题、编写代码以及使用工具。这些模型拥有丰富的…