荒野块可以忙吗?

荒野块可以忙吗?

我对 linux 中堆管理的一个方面很好奇,特别是 ubuntu 的 glibc 2.17 版本。

我知道每个堆中的最后一个块,即顶部或荒野块,往往是空闲的,并且会从中切出一些位并将其添加到其中,并在需要时更改其大小sbrk()(如果它是第一个堆?)。

但是,我找不到的是:是否有可能分配荒野块,这意味着堆中的最高块很忙?

这种差异似乎仅具有理论上的意义,但它对于是否可以在没有外部元数据的情况下分析内存中的堆有一些影响。

答案1

我不知道 glibc 的实现,但是在Doug Lea 的 malloc答案是不”。引用链接中的内容:

将荒野块视为比所有其他块“更大”,因为它可以这样做(取决于系统限制)并在最佳优先扫描中使用它。这导致仅当不存在其他块时才始终使用荒野块,从而进一步避免了可预防的碎片。

我猜想在一种情况下,技术上可能会违反不变量:如果用户分配的块恰好是所有剩余系统内存的大小。

对于如何管理荒野进行了更深入的讨论威尔逊;约翰斯通;尼利; Boles:“动态存储分配:调查和批判性评论”,国际内存管理工作周, 1995

相关内容