【问题标题】:Implementing Explicit free lists memory allocation实现显式空闲列表内存分配
【发布时间】:2014-12-13 20:05:30
【问题描述】:

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

谢谢,

【问题讨论】:

  • 你是什么意思“不能使用任何类型的数据结构,例如:链表”,但不知何故你可以有“下一个/上一个指针”?有些事情没有意义。
  • @luserdroog 所以我们不允许使用任何类型的数据结构。但是显式空闲列表会跟踪下一个/上一个空闲块。换句话说,显式空闲列表是一种算法,我必须实现它。explicity free lists
  • 好的。所以你不能“使用(预先写好的)链表”,因为 这是 一个链表。对吗?
  • @luserdroog 是的。我想我现在明白了,我只需要保存一个带有地址(下一个或上一个块)的普通指针吗?
  • 添加了答案。我赞成结构。

标签: c memory-management heap-memory


【解决方案1】:

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

在 C 中,最好将其描述为结构。

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

现在,他在结尾处也有重复的大小,这很难用结构来描述。 不清楚它有多么必要。它用于边界合并。


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

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

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

您甚至可以为这些偏移量提供助记名称(但这可能被认为是矫枉过正和不必要的混淆)。

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

【讨论】:

  • 嗯,我想过使用结构,但正如我所说,结构也是不允许的。只有标量变量,
猜你喜欢
  • 2020-02-03
  • 2011-07-13
  • 2014-11-24
  • 2019-03-14
  • 2018-10-09
  • 2022-01-19
  • 2015-03-21
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多