【问题标题】:Buddy system allocator in linux kernellinux内核中的好友系统分配器
【发布时间】:2018-05-31 00:35:58
【问题描述】:

我对 Linux 内核中的好友系统分配器有疑问。

考虑这个例子:

假设伙伴系统正在分配 128KB RAM。 如果我使用 kmalloc 分配 32KB,我的理解是,

在步骤 1 中,128KB 被拆分为两个 64KB,第一个 64KB 被拆分为两个 32KB。 然后前 32KB 分配给我。

显然仍有 96KB 的连续内存可用。

现在如果我在这个阶段分配 90KB,会发生什么? kmalloc 会失败还是伙伴(甚至是slab)分配器会处理这个并成功分配请求的内存?

【问题讨论】:

    标签: linux memory-management linux-kernel


    【解决方案1】:

    在前 32KB 之后,您不能分配大于 64KB 的任何内容。在这种情况下,kmalloc() 返回nullptr

    对于伙伴分配器来说是这样。平板分配器的工作方式不同,但这是题外话。

    【讨论】:

    • 为什么在使用伙伴分配器时这不是一个大问题?因为你总是有足够的总内存?
    • @aneeshjoshi 你能重新表述你的问题吗?我不明白你想问什么
    • 很抱歉。上述限制对我来说似乎是一个主要问题。上述情况在实际系统中是否经常发生?如果是,为什么还要使用伙伴分配器?
    • Buddy 分配器运行速度很快,而且很容易实现,但这是有代价的。其中之一就是上面提到的内存“碎片化”。另一个是以块大小为粒度分配的内存。话虽如此,假设您要求 4 个字节的内存,如果块大小为 1KByte,您将获得整个 1KB,接下来的 4 个字节将占用另外 1KB,依此类推。关于“真实系统”,它们可能不仅是不同的类型您的台式电脑,并分别按照他们的设计行事。我不能为他们所有人说话。据我所知,Linux 现在不使用伙伴分配器。
    猜你喜欢
    • 2012-04-24
    • 2011-08-16
    • 2017-03-24
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多