c -内存分配器-简单隔离存储:你如何从它的地址推断分配块的大小?



我正在读CS:APP的书,我在Dynamic Memory Allocation章节中偶然发现了Simple Segregated Storage
书中提到Simple Segregated Storage的优点之一是内存块不需要标头。它提到了

由于每个块只有相同大小的块,因此可以从其地址

推断分配块的大小。

图片从书- CS:APP -简单隔离存储
我未能理解这是如何工作的。我理解,由于块的大小对于单个空闲列表是相等的,当从内核请求一个大块并划分时,每个块的地址最初将增加相同的数量,但是我们如何从地址推断大小?它必须是块大小的倍数,但如果初始起始地址不是,那么它永远不会是块大小的倍数。此外,如果大小类是2,4,8,16,那么地址可以是许多其他大小类的倍数?

使用这种方法的分配器从操作系统获得大块内存。它指定了用于从每个块中分配块的块大小,以及"简单隔离存储"的关键。是每个给定块的分配将恰好是大小相同。对于任何给定的请求,这可能大于请求的大小,但对于分配器来说,这通常并不罕见。要确定给定分配的(真实)大小,分配器只需要确定它驻留在哪个块中。它不需要任何分配信息。

我完全理解你的意思,因为我试着在malloclab中使用这个方法并找到这个问题。

我同意我们不能从地址计算块大小,如果地址(4KB-1)是32,它可能是8的第5位,16的第3位或32的第1位。如果地址是0,它可以是任何大小的第一个块。

所以我们必须使用额外的空间来记录一些信息。

一个解决方案是记录每个块的起始地址和它属于哪个空闲列表,然后如果我们得到空闲地址void* ptr,搜索(ptr &~4KB)来查找相应的块大小。但是这太愚蠢了,而且很难编码。

另一个解决方案是添加标题。而我选择以这种方式结束。

最新更新