嵌入式动态内存管理组件

本文最后更新于:17 天前

嵌入式动态内存管理组件

一、组件描述

动态内存管理指的是在程序需要内存时申请,在使用完成后释放,保证以比较少的内存实现更多的软件需求。与之相对的是静态内存,典型的静态内存就是全局变量:在程序启动时到整个生命空间内都占用空间。动态内存的特点就是实现内存的“按需使用”,在嵌入式开发环境中,节省ram实现更多更灵活的内存使用需求。

c库中的malloc、free接口就是动态内存申请、释放的实现。在《深入理解计算机系统》书中针对c库中malloc的实现算法有一章的篇幅进行说明。

二、需求分析

动态内存的管理对外应该只需要提供两个接口:申请、释放。申请需要指定需要申请的内存大小,申请时存在剩余内存不足导致申请失败的场景所以需要在返回值中指定失败时的返回地址为NULL;内存的释放只需要将内存地址作为参数进行释放。遵守依赖倒置原则,接口的实现依赖于抽象的需求。

1
2
3
4
5
6
7
8
9
10
11
/**
* @brief 内存申请
* @param size 需要申请的内存大小
* @return 申请的内存地址,NULL表示为申请失败
*/
void *malloc(size_t size);
/**
* @brief 内存的释放
* @param p 待释放的内存首地址
*/
void free(void *p);

三、设计实现

3.1 设计目标

  • 非功能性目标
  1. 易用性
  2. 健壮性
  3. 正确性
  • 功能性目标
  1. 实现内存使用需求
  2. 实现内存的高效管理需求

3.2 设计原理

  • 未使用的内存块节点采用空间从小到大排列的双向链表进行管理。这样在申请时能快速按照需求找到合适大小的内存块
    内存管理链表
  • 内存释放时需要按照内存地址与最近的块进行合并,合并后重新插入到链表中的合适位置去
  • 内存模块初始化时整个空间都是空闲链表的一个节点
  • 空闲内存块节点包含链表头信息,在释放之前不可以被修改。
  • 链表头的内容包含
    • 魔鬼数字:表示内存头信息,也可以用于检测内存是否被踩踏
    • 可使用内存起始地址信息
    • 可使用内存大小信息
    • 指向下一个节点的指针
    • 指向前一个节点的指针
      空闲内存块节点组成

3.3 关键流程

  • 内存申请实现流程

内存申请流程

  • 内存释放实现流程

内存释放流程

四、落地实践


嵌入式动态内存管理组件
https://hudaxia.top/2021/11/17/组件-动态内存管理实现/
作者
胡大侠
发布于
2021年11月17日
更新于
2023年3月10日
许可协议