好友分配算法 - 起始堆地址

Buddy Allocation Algorithm - Beginning Heap Address

本文关键字:地址 分配 算法 好友      更新时间:2023-10-16

我目前正在尝试实现《计算机编程艺术》第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 <<i 进行异或运算)。如果给定左块地址,这将返回右块。如果给定右块,这将返回左块。

但是,此方法假定堆从地址 0 开始。如果堆以具有 i 顺序范围内的位的地址开头,则执行上述计算将不会为您提供其好友的正确地址。

因此,简单地说,有没有办法概括这个计算,以便它可以在任何起始堆地址上执行?假设存在最大订单的绑定。IE* 如果最大阶数为 18,我们不会尝试执行任何大于或等于 18 阶的计算,因此您无需找到它的伙伴。

对此的任何帮助或建议都非常感谢!

哇,硬核。为阅读高德纳点赞!

无论如何,我

可能错过了重点,但在某些时候,您正在请求(我假设)来自操作系统的连续内存块以应用好友系统。那么,您不能只保留起始地址(无论如何您都需要稍后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;
}