Linux内存管理算法Buddy与Slab

发布时间 2023-08-16 07:14:18作者: rabot

Buddy算法

什么是Buddy算法

  • Buddy(伙伴系统算法)是一种动态存储器管理算法,它通过不断地平分或合并空闲内存块来满足内存分配或回收的需求。它的特点是每个空闲内存块的大小都是2的次幂个物理页,比如1,2,4,8,16,32,64,128等
  • 内存分配时:从空闲内存块列表中找到最小的满足条件的内存块,如果没有找到,就从更大的内存块中分裂出一半,直到找到合适的内存块为止。
  • 内存回收时:先检查它的相邻内存块是否也是空闲的,如果是,就把它们合并成一个更大的内存块,直到没有相邻的空闲内存块为止。

Buddy算法的优点

  • 它可以快速地分配和回收内存,因为它只需要进行简单的位运算和链表操作。
  • 它可以减少内存碎片,因为它总是尽量保持空闲内存块的大小一致。

Buddy算法的缺点

  • 它可能会造成内部碎片,因为它总是分配2的次幂个物理页,而实际需要的内存可能小于这个值。
  • 它可能会造成外部碎片,因为它总是合并相邻的空闲内存块,而实际需要的连续内存可能大于这个值。

Slab分配器

什么是Slab分配器

  • Slab分配器的基本思想是,先利用页面分配器(伙伴系统)分配出单个或者一组连续的物理页面,然后在此基础上将整块页面分割成多个相等的小内存单元,以满足小内存空间分配的需要。

Slab分配器的优点

  • 它可以提高内存利用率,因为它可以避免内部碎片和外部碎片。
  • 它可以提高内存分配和回收的效率,因为它可以减少对页面分配器的调用次数。
  • 它可以提高缓存命中率,因为它可以保持相同类型的对象在物理上的连续性。

Slab分配器的缺点

  • 它增加了内核的复杂度,因为它需要维护多个slab列表和缓存。
  • 它可能会造成内存浪费,因为它可能会占用过多的空闲页面。