内存管理

XWOS的内存管理

XWOS提供四种内存管理的算法。

简单内存分配器

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

  • 优点:
    • 简单,代码量非常小;
    • 运行时间稳定。
  • 缺点:内存一旦分配出去不再回收,释放函数只是一个 Dummy 函数;
  • 适用性:简单的RTOS应用场合或不需要回收内存的场合
  • 上下文的安全性:在任何上下文(中断、中断底半部、线程)都是安全的。
  • CAPI参考: 头文件 <xwos/mm/sma.h>

内存切片分配器

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

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

伙伴算法分配器

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

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

内存池

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

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