实现显式空闲列表内存分配

时间:2014-10-18 10:08:33

标签: c memory-management heap

作为赋值的一部分,我们必须实现(基本)malloc函数(我们应该以某种方式模拟动态内存分配)。我已经实现了一个基于隐式空闲列表的解决方案,但问题是我获得了50%的利用率和9%的吞吐量(我必须获得90%的利用率+吞吐量)。隐式空闲列表的问题在于搜索空闲块需要很多时间。所以我想实现explicit free list以了解程序可以改进多少。现在的问题是我必须跟踪免费块的next / prev指针。因为我只能使用标量变量而不能使用任何类型的数据结构,例如:linked list,struct,..,我无法实现它。有人可以指出我如何跟踪C中的(虚拟)指针?

感谢,

1 个答案:

答案 0 :(得分:0)

从幻灯片中的图片(在评论中链接),我认为您应该将链接存储为整数偏移。

在C中,这最好被描述为结构。

struct alloc_cell {
    int size;
    int forward;
    int back;
    int data[];
};

现在,他在最后也重复了这个大小,并且用结构来描述更难。 目前尚不清楚它的必要性。它用于边界合并。


编辑:很久以后,考虑发表评论。

即使您不能在代码中使用结构,您仍然可以在伪代码中使用它们来帮助组织您的思考。 struct字段属于同一类型,自然地映射到数组 可以通过指向第一个成员/元素的指针访问的代表。

struct alloc_cell {    // int *cell;
    int size;          // cell[0] // *cell
    int forward;       // cell[1]
    int back;          // cell[2]
    int data[];        // (cell+3)[...] // &cell[3]
};

你甚至可以给予这些偏移助记符名称(但这可能被视为 overkill 和不必要的混淆)。

enum { SIZE, FORWARD, BACK, DATA };

cell[SIZE];                   // alloc_cell.size
cell[FORWARD];                // alloc_cell.forward
cell[BACK];                   // alloc_cell.back
cell+DATA; // &cell[DATA]     // alloc_cell.data