两级allocator

两级allocator:
当请求内存较大(大于128bytes)时,采用第一级allocator
小于128bytes时,采用第二级allocator,采用内存池的方法管理小内存.

内存申请大于128bytes时,第一级allocator直接调用malloc和free函数,并模拟C++的set_new_handler函数处理内存不足的情况。

第二级allocator则复杂很多,具体实现包括:
维护16个自由链表(free_list),负责16种不同大小的内存空间分配。0:8;1:16…;15:120 bytes
自由链表的内存由内存池分配,而内存池则由malloc函数分配内存
如果内存不足或请求内存大于128bytes则转调第一级allocator

第二级allocator用内存池管理已分配但未使用的内存,当客户端请求内存时,首先查询free-list中是否有适当大小的内存块,如果有直接分配该内存块并将该内存块从freelist中移除。如果freelist没有匹配大小的可用内存块,则调用chunk_alloc()函数向内存池申请内存。chunk_alloc函数根据情况,处理申请请求:

1.默认分配20个用户索取区块大小的内存块,将其中一个返回给客户,剩余19个加入合适的free-list中
2.如果内存池中内存不足以分配20个区块(根据end_free和start_free可以查看内存池“水位”),那么就分配内存池剩余内存可以分配的最大区块数,比如剩余100bytes,请求内存块大小为32bytes,则分配3个区块
3.如果内存池中剩余内存连一个区块都不能分配了,那么就向heap申请内存,但是需要把残余的内存分配到相应的freelist中,比如客户申请32bytes内存,但是内存池只剩下20bytes,那么就将这20bytes加入free-list管理16bytes的list中,这样只会产生4bytes的内存碎片

roundup上调到8的倍数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值