【问题标题】:What's the difference between slab and buddy system?平板系统和伙伴系统有什么区别?
【发布时间】:2016-05-24 05:03:52
【问题描述】:

在我看来,它们非常相似。那么slab和buddy系统是什么关系呢?

【问题讨论】:

    标签: memory linux-kernel


    【解决方案1】:

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

    有两种方法可以使用平板。首先,您可以拥有一个仅适用于您经常分配的一种尺寸的平板。例如,一个内核可能有一个 inode 平板。但是你也可以有一些渐进大小的slab,比如一个128字节的slab、一个192字节的slab、一个256字节的slab等等。然后,您可以从下一个slab 大小开始分配任意大小的对象。

    请注意,在这两种情况下,除非整个slab被释放回全局“大块”分配器,否则slab不会为不同大小的对象重新使用内存。

    伙伴系统是一种不相关的方法,其中每个对象都有一个“伙伴”对象,当它被释放时它会合并。当需要更小的块时,块被分成两半。请注意,在伙伴系统中,块被划分并合并为更大的块,作为分配和返回以供重用的主要方式。这与平板的工作方式非常不同。

    或者更简单地说:

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

    Slab:非常大的块被分配一次并被分成相等大小的块。不会发生其他划分或合并,释放的块只是保存在一个列表中以分配给后续分配。

    Linux 内核的核心分配器是一个灵活的伙伴系统分配器。这个分配器为各种slab allcoators提供slab。

    【讨论】:

    • 如果你能在你的答案中解释伙伴分配器和平板分配器之间的联系也会很好(类似于this,但可能有更多细节)。谢谢。
    【解决方案2】:

    一般来说,slab分配器是一个固定大小的slab列表,适合放置预定义大小的元素。由于池中的所有对象大小相同,因此没有碎片。

    好友分配器将内存分成大小为两倍的块。例如,如果 min chunk 是 1k,下一个是 2K,然后是 4K 等等。所以如果我们请求分配 100b,那么会选择大小为 1k 的 chunk。导致碎片但允许分配任意大小的对象的原因(因此它非常适合精确对象大小可以是任意大小的用户内存分配)。

    另见:

    还更糟糕的是查看此演示文稿:http://events.linuxfoundation.org/images/stories/pdf/klf2012_kim.pdf 第 22 页的幻灯片揭示了不同之处的摘要。

    【讨论】:

      猜你喜欢
      • 2011-04-13
      • 2019-08-29
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      相关资源
      最近更新 更多