在malloc实现中维护一个空闲列表

时间:2011-10-14 06:54:28

标签: c list malloc heap free

我正在尝试为我的操作系统类实现malloc,我想知道维护双向链接的空闲内存块列表的优势,而不是单链表。

2 个答案:

答案 0 :(得分:2)

如果你在malloc()中将一大块内存分成较小的内存,那么当你用free()返回它们时,你必须将每个返回的块与它的2个邻居连接起来。在这种情况下,双重链表是最容易处理的。

答案 1 :(得分:0)

使用隐含列表的free_block粗略草图。内存被安排为一个整数数组,block是该数组中块与空闲的偏移量,prevnext是前后块的偏移量。每个块都以包含块大小的整数开头和结尾,包括页眉和页脚:

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);
    }
}

因为包含块大小的标题在每个块的开头和结尾都是重复的,所以它用作双向链表,您可以向前和向后遍历空闲列表。指针是隐式或相对的。