简单隔离存储如何预分配固定块大小的列表?

问题描述

我正在学习动态内存分配,但在某些细节上仍然有些困惑。 我们知道,隔离存储是为了维护多个空闲列表,其中每个列表都包含大小大致相同的块:

enter image description here

因此一种流行的方法简单的隔离存储,它可以预先分配固定块大小的列表,其中列表占据了完整的VM页面

enter image description here

以下是我的问题:

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]...
}