在linux中是否重用了虚拟内存地址?

时间:2014-07-09 16:59:03

标签: linux memory virtual space reusability

我对虚拟内存管理有点想法,结果是可能存在两种类型的内存碎片。第一种情况发生在物理内存端,由于使用了一些字节,因此无法释放页面。大多数情况下,最后的字节迟早会被释放,然后物理内存页面将再次释放并取消映射。

但是malloc返回的指针(虚拟地址)会发生什么。我们假设一个32位系统。该程序"随机"分配和释放内存,但从来没有使用超过一些MByte。让我们进一步假设程序永远不会按照分配的顺序释放内存。所以"堆顶#34;指针永远不会减少,因为自由将永远不会发生在堆的末尾。我假设malloc必须将内存始终映射到堆内存空间的末尾。这意味着指针值将随着每次调用而增加。

之前或之后返回的指针将达到可能的最高地址(例如0xffffffff),并且当系统有足够的可用空闲页面时,由于大多数页面已被释放,因此无法进一步添加内存。这只是最高指针值的问题。

为了解决这个问题,需要一种算法来维护未映射的地址空间,并让它们随着更多内存在空间的开头或末尾被释放而增长。有没有像malloc一样的算法?

2 个答案:

答案 0 :(得分:0)

  

我认为malloc必须将内存始终映射到堆内存空间的末尾。

这个假设实际上是不正确的。一些实现可以保持多个池分配不同大小的块。 (例如,一种常见的方法是slab allocator,它为分配器将返回的每个块大小保留一个单独的池。)

无论如何, - malloc()的所有有意义的实现都将跟踪已释放的内存,并在可能的情况下重用它。

答案 1 :(得分:0)

我简要介绍了slab分配器。这似乎与内核中使用的内存页管理更相关。我的问题与用户空间以及每当分配内存时需要在调用进程的堆的地址空间中获取地址这一事实有关。当该地址空间受限于32位系统时,该地址空间会发生什么。

很明显,系统根本没有松动内存。我的意思是没有地址空间来获取可以映射内存的地址,而较低地址的所有内存已经被释放和取消映射。