内存管理

简单内存分配器

描述

简单内存分配器只分配大小最适应内存块,不对内存进行回收。

  • 优点:
    • 简单,代码量非常小;
    • 运行时间稳定。
  • 缺点:内存一旦分配出去不再回收,free()只是一个dummy函数;
  • 适用性:简单的RTOS应用场合或不需要回收内存的场合,此内存管理算法只是为了 满足玄武OS的API而提供的默认配置;
  • 上下文的安全性:在任何上下文(中断、中断底半部、线程)都是安全的。

API参考

  • 头文件:xwos/mm/sma.h
  • 注释:见头文件

内存切片分配器

描述

内存切片分配器将内存切割成等量的块,就像卡片一样,然后将它们连接在一起形成队列, 每次分配时取一块内存,回收时再把内存切片放回到队列中。

  • 优点:
    • 简单,代码量较小;
    • 支持释放操作;
    • 申请与释放操作的运行时间是稳定的;
    • 反复申请与释放不会造成内存碎片。
  • 缺点:
    • 内存块大小固定,如果要求的内存过小,会造成内存浪费;如果要求的内存 超过“切片”的大小,无法满足需求;
    • 连续申请的两块“切片”不能保证是连续的。
  • 适用性:对时间稳定性要求高的RTOS应用场合。
  • 上下文的安全性:在任何上下文(中断、中断底半部、线程)都是安全的。

配置

/* <cfg/xwos.h> */

#define XWMMCFG_MEMSLICE              1 // 是否启用内存切片分配器,取值:1|0

API参考

  • 头文件:xwos/mm/memslice.h
  • 注释:见头文件

伙伴算法分配器

描述

伙伴算法分配器在分配时,会将内存不断地二等分,直到切割到能满足要求的最小内存大小为止。 释放时会检查与之相邻并等长的内存块(称为伙伴)是否也空闲, 如果是,就和伙伴合并成两倍大小的内存块, 然后继续检测合并后的内存块是否也存在可以合并的伙伴,一直向上合并到不能合并为止。

  • 优点:
    • 支持释放操作;
    • 支持大小不固定的内存申请操作;
    • 反复申请与释放不会造成内存碎片。
  • 缺点:
    • 代码有些复杂;
    • 因为存在合并与切割的循环,申请与释放操作的所需要的时间不是特别稳定;
    • 内存大小固定为2的指数,如果申请的内存过小,会造成内存浪费。
  • 适用性:对内存复用性要求高的应用场合。
  • 上下文的安全性:在任何上下文(中断、中断底半部、线程)都是安全的。

配置

/* <cfg/xwos.h> */

#define XWMMCFG_BMA                   1 // 是否启用伙伴算法分配器,取值:1|0

API参考

  • 头文件:xwos/mm/bma.h
  • 注释:见头文件

内存池

描述

内存池是结合了内存切片分配器与伙伴算法分配器的算法。先规定内存的基本单位为页, 一页内存为4096字节,页内存使用伙伴算法分配器管理。 内存池还使用内存切片分配器建立各种小尺寸的块:8字节、16字节、32字节、 64字节、96字节、128字节、192字节、256字节、384字节、512字节、768字节、 1024字节、2048字节。当申请内存大于2048字节,直接分配页内存; 当申请的内存小于等于2048字节,就从尺寸最合适的内存切片分配器中分配一块内存。

  • 优点:
    • 支持释放操作;
    • 支持大小不固定的内存申请操作;
    • 反复申请与释放不会造成内存碎片;
    • 小内存块不会浪费过多的内存。
  • 缺点:
    • 代码比较复杂;
    • 申请与释放操作的所需要的时间不稳定。
  • 适用性:外接尺寸较大的SRAM或SDRAM的内存管理,C++和Lua虚拟机的对象池。
  • 上下文的安全性:在任何上下文(中断、中断底半部、线程)都是安全的。

配置

/* <cfg/xwos.h> */

#define XWMMCFG_MEMPOOL               1 // 是否启用内存池分配器,取值:1|0

API参考

  • 头文件:xwos/mm/mempool.h
  • 注释:见头文件