RTthread内存管理

RTthread内存管理

小内存管理算法:

  是一个简单的内存分配算法,它一开始是一个大的内存。需要分配内存就从这块大内存上分割出来相对应的内存。且每个内存块都包含一个管理用的数据头。通过这个头把使用块与空闲块用双向链表方式连接起来。

在这里插入图片描述
magic:变数,被初始化为heap,标记是内存管理用的内存块。同时他也是个内存保护字。不可被改写。
used:指出当前内存块是否已经被分配。
申请内存时遍历链表,找到第一个符合malloc大小的内存来申请,如果这块内存块较大,就分割出需要申请的内存。释放时则是相反的过程,但分配器会查看前后相邻的内存块是否空闲,如果空闲则合并成一个大的空闲内存块。

slab管理算法:

slab管理算法可大体看做一种内存池管理算法,slab分配器会根据对象的大小分成多个区(zone),一个zone的大小在32k到128k之间,分配器会在堆初始化时根据堆的大小自动调整。系统中的zone最多包括七十二种对象,一次最大能够分配16k的内存空间,如果超出了16k那么直接从页分配器中分配。每个zone中分配大小固定的内存块,能够分配相同大小内存块的zone会连接在一个链表中,72种对象的链表则放在一个数组中统一管理。

在这里插入图片描述

slab内存分配

 假设分配一个 32 字节的内存,slab 内存分配器会先按照 32 字节的值,从 zone array 链表表头数组中找到相应的 zone 链表。如果这个链表不存在,则向页分配器分配一个新的 zone,然后从 zone 中返回第一个空闲内存块。如果链表存在,则这个 zone 链表中的第一个 zone 节点必然有空闲块存在(否则它就不应该放在这个链表中),那么就取相应的空闲块。如果分配完成后,zone 中所有空闲内存块都使用完毕,那么分配器需要把这个 zone 节点从链表中删除。

slab内存释放

分配器需要找到内存块所在的 zone 节点,然后把内存块链接到 zone 的空闲内存块链表中。如果此时 zone 的空闲链表指示出 zone 的所有内存块都已经释放,即 zone 是完全空闲的,那么当 zone 链表中全空闲 zone 达到一定数目后,系统就会把这个全空闲的 zone 释放到页面分配器中去。

memheap管理算法

该算法适用于系统含有多个地址可不连续的内存堆。使用memheap内存管理算法可以简化系统存在多个内存堆时的使用:当系统存在多个内存堆时,用户只需要在系统初始化的时候将多个所需的memheap初始化,并开启memheap功能就可以很方便的把多个memheap(地址可不连续)粘合起来用于系统的heqp分配。

memheap工作机制
先将多块内存加入memheap_item链表进行粘合。当分配内存块时,会先从默认内存堆去分配内存,分配不到时就查找memheap_item链表。尝试从其他内存堆分配内存块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值