【问题标题】:Is there a reuse of virtual memory addresses in linux?linux中是否有虚拟内存地址的重用?
【发布时间】:2014-08-30 19:54:40
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linux memory virtual space reusability


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我看了一眼slab分配器。这似乎与内核内部使用的内存页面管理更相关。我的问题与用户空间有关,并且每当分配内存时,它都需要在调用进程的堆的地址空间中获取地址。当 32 位系统中给定的地址空间受到限制时,该地址空间会发生什么情况。

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

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 2014-01-16
        • 2018-07-09
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2012-03-21
        • 2014-09-06
        • 1970-01-01
        相关资源
        最近更新 更多