【发布时间】:2016-05-24 05:03:52
【问题描述】:
在我看来,它们非常相似。那么slab和buddy系统是什么关系呢?
【问题讨论】:
标签: memory linux-kernel
在我看来,它们非常相似。那么slab和buddy系统是什么关系呢?
【问题讨论】:
标签: memory linux-kernel
slab 是相同大小的对象的集合。它通过分配相当大的内存块并将其分成大小相等的块来避免碎片。件数通常远大于两件,例如 128 件左右。
有两种方法可以使用平板。首先,您可以拥有一个仅适用于您经常分配的一种尺寸的平板。例如,一个内核可能有一个 inode 平板。但是你也可以有一些渐进大小的slab,比如一个128字节的slab、一个192字节的slab、一个256字节的slab等等。然后,您可以从下一个slab 大小开始分配任意大小的对象。
请注意,在这两种情况下,除非整个slab被释放回全局“大块”分配器,否则slab不会为不同大小的对象重新使用内存。
伙伴系统是一种不相关的方法,其中每个对象都有一个“伙伴”对象,当它被释放时它会合并。当需要更小的块时,块被分成两半。请注意,在伙伴系统中,块被划分并合并为更大的块,作为分配和返回以供重用的主要方式。这与平板的工作方式非常不同。
或者更简单地说:
好友系统:各种大小的块在分配时被分割,在释放时合并以根据需要有效地将大块分成各种大小的小块。
Slab:非常大的块被分配一次并被分成相等大小的块。不会发生其他划分或合并,释放的块只是保存在一个列表中以分配给后续分配。
Linux 内核的核心分配器是一个灵活的伙伴系统分配器。这个分配器为各种slab allcoators提供slab。
【讨论】:
一般来说,slab分配器是一个固定大小的slab列表,适合放置预定义大小的元素。由于池中的所有对象大小相同,因此没有碎片。
好友分配器将内存分成大小为两倍的块。例如,如果 min chunk 是 1k,下一个是 2K,然后是 4K 等等。所以如果我们请求分配 100b,那么会选择大小为 1k 的 chunk。导致碎片但允许分配任意大小的对象的原因(因此它非常适合精确对象大小可以是任意大小的用户内存分配)。
另见:
还更糟糕的是查看此演示文稿:http://events.linuxfoundation.org/images/stories/pdf/klf2012_kim.pdf 第 22 页的幻灯片揭示了不同之处的摘要。
【讨论】: