跳转至

内存管理算法

1. 伙伴算法以页(4k)为单位管理内存,解决的是外部内存碎片问题。
2. slab算法是为了解决小块内存申请的问题,是对伙伴算法的一种补充。

1 伙伴(Buddy)算法

  • 参考
  • 浅析Buddy算法
  • 解析:在Buddy算法中,以页为单位管理内存,把内存按照2的幂次方分组,每一组内内存以链表方式连接,每一个链节点由2的幂次方个连续页组成。比如,第0组,由1个页作为链表节点;第1组,由2个页作为链表节点;第2组,由4个页作为链表节点;第10组,由1024个页作为链表节点。
  • 功能:提高内存利用率的同时减少外部内存碎片
  • 伙伴定义:
  • 两个块具有相同大小
  • 物理地址是连续的;
  • 伙伴算法原理:
  • 申请内存过程:当请求一个一个页(4k)大小的内存时,先向组0请求;如果满足,直接分配;如果组0无法分配,就向上一层组1请求;如果组1满足,返回分配的内存给调用者,且将剩下的一半放入组0的链表中。
  • 释放内存过程:释放时先检查所在链表中该位置是否有他的伙伴;如果不存在,则直接释放直接将释放的块插入链表头。如果他所在链表中有伙伴存在,则将其从链表摘下,合并成一个大块,然后继续向后查找合并后的块在更大一级链表中是否有伙伴的存在,直至不能合并或者已经合并至最大块2^10为止

伙伴算法分组图

2 slab