在我看来,他们非常相似。那么slab和buddy系统之间的关系是什么?
答案 0 :(得分:10)
slab是相同大小的对象的集合。它通过分配相当大的内存块并将其分成相等大小的块来避免碎片。件数通常远大于两个,比如128个左右。
有两种方法可以使用平板。首先,你可以只为你经常分配的一个尺寸制作一个平板。例如,内核可能有一个inode slab。但是你也可以有一些渐进尺寸的平板,比如一个128字节的平板,一个192字节的平板,一个256字节的平板,依此类推。然后,您可以从下一个板尺寸中分配任意大小的对象。
请注意,在任何情况下,slab都不会为不同大小的对象重用内存,除非整个slab被释放回全局“大块”分配器。
伙伴系统是一种不相关的方法,其中每个对象都有一个“伙伴”对象,当它被释放时它与其结合。当需要较小的块时,块被分成两半。请注意,在伙伴系统中,块被分割并合并为更大的块,作为主要的分配方式并返回以供重用。这与板坯的工作原理有很大不同。
或者更简单地说:
伙伴系统:分配时会分割各种大小的块,并在释放时进行合并,以便根据需要将大块有效地划分为各种大小的块。
平板:分配非常大的块并将其划分为相等大小的块。不会发生其他分割或合并,并且释放的块仅保存在列表中以分配给后续分配。
Linux内核的核心分配器是一个灵活的伙伴系统分配器。这个分配器为各种板坯涂层机提供了板坯。
答案 1 :(得分:2)
一般来说,slab allocator是一个固定大小的平板列表,适合放置预定义的大小元素。由于池中的所有对象都具有相同的大小,因此没有碎片。
Buddy分配器将内存划分为大小为double的块。例如,如果min chunk是1k,则下一个将是2K,然后是4K等。因此,如果我们将请求分配100b,则将选择大小为1k的块。什么导致碎片,但允许分配任意大小的对象(因此它非常适合用户内存分配,其中确切的对象大小可以是任何大小)。
另见:
还要查看此演示文稿:http://events.linuxfoundation.org/images/stories/pdf/klf2012_kim.pdf 第22页的幻灯片显示差异的摘要。