问题描述
我正在学习动态内存分配,但在某些细节上仍然有些困惑。 我们知道,隔离存储是为了维护多个空闲列表,其中每个列表都包含大小大致相同的块:
因此一种流行的方法是简单的隔离存储,它可以预先分配固定块大小的列表,其中列表占据了完整的VM页面:
以下是我的问题:
Q1-简单隔离存储如何预先分配固定块大小的列表?
a)为所有个不同大小的列表预先分配列表。例如我只想malloc
8个字节,但它还会为8、16、32、64等字节的块列表创建虚拟页面(vp),全部一次。
b)仅预先分配用户所需的大小。例如我malloc
16字节,仅创建了16字节的虚拟页面。
Q2-如果问题一中的b陈述是正确的,则意味着vp可以采用任意随机顺序,因此第一个vp不必为8字节块的最小大小。例如第一个vp可以用于64个字节的块,第二个vp可以用于8个字节的块,第三个vp可以用于16个字节的块..etc?
解决方法
简单的隔离存储如何预先分配固定块大小的列表?
嗯,这纯粹是实施细节,不是吗?分配器决定预分配所有内容,仅按请求的大小预分配页面,还是可配置执行一个或另一个,这并不重要。这个问题没有正确答案。
如果问题一中的b陈述是正确的,则表示vp可以是任意顺序
不是。分配器可以根据需要具有任意数量的支持结构,以精确地管理此类情况。
例如,它可能具有指向页面的指针数组,这些页面的块大小是2的幂次幂:
void *pages[10] = {NULL};
// Index i holds a pointer to pages for blocks of size 2^(i+3)
void *allocate(size_t size) {
unsigned index;
if (s <= (2 << 3)) // up to 8 bytes
index = 0;
else if (s <= (2 << 4)) // up to 16 bytes
index = 1;
else if (s <= (2 << 5)) // up to 32 bytes
index = 2;
else if (s <= (2 << 6)) // up to 64 bytes
index = 3;
// ...
if (pages[index] == NULL)
pages[index] = allocate_memory_page();
// Check free lists...
// Return a block from pages[index]...
}