在Linux内核中的Buddy系统分配器

3

我有一个关于Linux内核中伙伴系统分配器的疑问。

考虑以下示例:

enter image description here

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

步骤1将128KB分成两个64KB,第一个64KB再分成两个32KB。 然后将第一个32KB分配给我。

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

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

1个回答

4

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

这适用于伙伴分配器。滑块分配器的工作方式不同,但这是离题的。


为什么在使用伙伴分配器时这不是一个大问题?因为你总是有足够的总内存? - aneesh joshi
@aneeshjoshi,你能重新表达一下你的问题吗?我不明白你想问什么。 - user3124812
抱歉。对我来说,上述限制似乎是一个重大问题。在实际系统中,上述情况经常发生吗?如果是,为什么还要使用伙伴分配器? - aneesh joshi
1
Buddy分配器运行速度快,易于实现,但代价也很高。其中之一就是上面提到的内存“碎片化”。另一个问题是以块大小为粒度分配的内存。假设您请求4个字节的内存,如果块大小为1KByte,则会给您整个1KB,下一个4个字节将需要另外1KB,依此类推。关于“真实系统”,它们可能不仅仅是您的台式电脑,并且会根据其设计相应地表现出不同的行为。我不能代表所有系统发言。据我所知,Linux现在不再使用Buddy分配器。 - user3124812

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接