【发布时间】:2014-08-30 19:54:40
【问题描述】:
我对虚拟内存管理进行了一些思考,得出的结果是内存碎片可能有两种类型。第一个发生在物理内存端,由于使用了一些字节,因此无法释放页面。大多数情况下,最后一个字节迟早会被释放,然后物理内存页面将再次空闲并被取消映射。
但是 malloc 返回的指针(虚拟地址)会发生什么。让我们假设一个 32 位系统。程序“随机”分配和释放内存,但使用的内存永远不会超过一些 MByte。让我们进一步假设程序永远不会按照分配的顺序释放内存。因此,“堆顶”指针永远不会减少,因为空闲永远不会出现在堆的末尾。我假设 malloc 必须始终将内存映射到堆内存空间的末尾。这意味着指针值将随着每次调用而增加。
早晚返回的指针将到达可能的最高地址(例如0xffffffff),并且当系统有足够的可用页面可用时,无法进一步添加内存,因为大多数页面已被释放。这只是可能的最高指针值的问题。
为了解决这个问题,需要一种算法来维护未映射的地址空间,并让它们随着空间开始或结束时释放的更多内存而增长。有没有malloc实现的这样的算法?
【问题讨论】:
标签: linux memory virtual space reusability