slab和buddy系统有什么区别?

byd*_*sky 6 memory linux-kernel

在我看来,他们非常相似.那么slab和buddy系统之间的关系是什么?

Dav*_*rtz 11

平板是相同大小的对象的集合.它通过分配相当大的内存块并将其分成相等大小的块来避免碎片.件数通常远大于两个,比如128个左右.

有两种方法可以使用平板.首先,你可以只为你经常分配的一个尺寸制作一个平板.例如,内核可能有一个inode slab.但是你也可以有一些渐进尺寸的平板,比如一个128字节的平板,一个192字节的平板,一个256字节的平板,依此类推.然后,您可以从下一个板尺寸中分配任意大小的对象.

请注意,在任何情况下,slab都不会为不同大小的对象重用内存,除非将整个slab释放回全局"大块"分配器.

伙伴系统是一种不相关的方法,其中每个对象都有一个"伙伴"对象,当它被释放时它与它结合.当需要较小的块时,块被分成两半.请注意,在伙伴系统中,块被分割并合并为更大的块,作为主要的分配方式并返回以供重用.这与板坯的工作原理有很大不同.

或者更简单地说:

伙伴系统:各种大小的块在分配时被分割,并且在释放时被合并以根据需要有效地将大块分成各种大小的块.

平板:分配非常大的块并将其划分为相等大小的块.不会发生其他分割或合并,并且释放块仅保存在列表中以分配给后续分配.

Linux内核的核心分配器是一个灵活的伙伴系统分配器.该分配器为各种板坯涂层机提供板坯.

  • 如果您可以在答案中解释伙伴分配器和平板分配器之间的联系,那就太好了(类似于[this](http://image.slidesharecdn.com/mm-121212232739-phpapp02/95/linux-memory-management -11-638.jpg?cb=1355354903),但可能有更多细节)。谢谢。 (2认同)