好友分配算法 - 起始堆地址
Posted
技术标签:
【中文标题】好友分配算法 - 起始堆地址【英文标题】:Buddy Allocation Algorithm - Beginning Heap Address 【发布时间】:2013-10-30 05:47:39 【问题描述】:我目前正在尝试实现计算机编程艺术卷:1 中描述的Buddy Allocator,它利用了给定数据块及其对应地址的重要不变量伙伴。计算如下……
BUDDY(X):
X + 2^i if x mod 2^i+1 = 0
X - 2^i if x mod 2^i-1 = 0
Where X is the address of the block; i is the current order
使伙伴系统表现如此出色的原因在于,查找伙伴地址的计算可以简单地通过翻转第 i 个顺序位来执行(通过将其与 1
但是,此方法假定堆从地址 0 开始。如果堆从具有 i 顺序范围内的位的地址开始,则执行上述计算不会为您提供其正确的地址伙计。
因此,简单地说,有没有一种方法可以泛化这种计算,以便它可以在任何起始堆地址处执行?假设有一个最大订单的界限。 IE* 如果最大阶数为 18,我们不会尝试执行任何大于或等于 18 阶的计算,因此您不需要找到它的伙伴。
非常感谢任何帮助或建议!
【问题讨论】:
为什么不创建另一个函数 AnyBuddy(X, startPoint)= Buddy(X-startPoint)+startPoint ? @ElKamina 如果您有答案,请发布答案。 @self。我发布的几乎是答案。无论如何,特里斯坦已经以更易读的格式呈现了。 【参考方案1】:哇,铁杆。感谢阅读 Knuth!
无论如何,我可能没有抓住重点,但在某些时候,您会从操作系统请求(我推测)一块连续的内存来应用伙伴系统。所以你不能只保留起始地址(无论如何你需要它到free()
),并使用该偏移量来使你使用的地址看起来是从零开始的?即这样的事情:
uint8_t* start_addr = malloc(SIZE_IN_BYTES);
uint8_t* buddy(uint8_t* real_x)
uint8_t *x = real_x - start_addr;
// do buddy bit-flipping on "x"
return x + start_addr;
【讨论】:
我为共享内存实现了一次好友分配器并完全使用这种方法:) 关于这个还有一个问题,新地址空间可以从 0x4 开始吗?我需要为 NULL 指针保留 0x0 以告知我在列表的末尾,用于我的空闲列表表示。以上是关于好友分配算法 - 起始堆地址的主要内容,如果未能解决你的问题,请参考以下文章