首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linux中是否有虚拟内存地址的重用?

问linux中是否有虚拟内存地址的重用?
EN

Stack Overflow用户
提问于 2014-07-10 00:59:03
回答 2查看 367关注 0票数 0

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-07-10 01:35:18

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2014-07-11 03:37:34

我简单地看了一下板条分配器。这似乎更多地与内核中使用的内存页管理有关。我的问题与用户空间有关,而且无论何时分配内存,它都需要在调用进程的堆的地址空间中获取一个地址。当32位系统中给定的地址空间受到限制时,它会发生什么情况。

很明显,系统完全不会丢失内存。我的意思是,没有剩余的地址空间来获取内存可以映射的地址,而位于较低地址的所有内存已经被释放并取消映射。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24659622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档