我正在尝试为我的操作系统类实现malloc,我想知道维护双向链接的空闲内存块列表的优势,而不是单链表。
答案 0 :(得分:2)
如果你在malloc()中将一大块内存分成较小的内存,那么当你用free()返回它们时,你必须将每个返回的块与它的2个邻居连接起来。在这种情况下,双重链表是最容易处理的。
答案 1 :(得分:0)
使用隐含列表的free_block
粗略草图。内存被安排为一个整数数组,block
是该数组中块与空闲的偏移量,prev
和next
是前后块的偏移量。每个块都以包含块大小的整数开头和结尾,包括页眉和页脚:
void free_block(int memory[], int block) {
// Write the header of the free block
int block_size = GET_SIZE(memory[block]);
memory[block] = MAKE_FREE(block_size);
// Check if the next block is free
int next = block + block_size;
int next_size = GET_SIZE(memory[next]);
if (IS_FREE(memory[next])) {
// Great! Coalesce the blocks
block_size = block_size + next_size;
memory[block] = MAKE_FREE(block_size);
}
// Check if the previous block is free
int prev_size = GET_SIZE(memory[block - 1]);
int prev = block - prev_size;
if (IS_FREE(memory[prev])) {
prev_size = prev_size + block_size;
memory[prev] = MAKE_FREE(prev_size);
}
}
因为包含块大小的标题在每个块的开头和结尾都是重复的,所以它用作双向链表,您可以向前和向后遍历空闲列表。指针是隐式或相对的。