【问题标题】: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。我发布的几乎是答案。无论如何,特里斯坦已经以更易读的格式呈现了。

标签: c++ c algorithm memory memory-management


【解决方案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 以告知我在列表的末尾,用于我的空闲列表表示。
猜你喜欢
  • 1970-01-01
  • 2012-01-10
  • 2022-01-10
  • 2020-01-02
  • 2018-08-15
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多