在块上使用 free() 是否总是会删除其虚拟内存和物理内存之间的映射?

在块上使用 free() 是否总是会删除其虚拟内存和物理内存之间的映射?

假设我们想通过使用从堆中分配一个块malloc。当分配大尺寸内存时,在内部malloc调用mmap;当分配小尺寸内存时,在内部malloc调用brk

sbrk()注意,使用或时堆是连续的brk()

假设我的分配规模相对中等,并且在内部malloc调用brk

假设我打电话malloc(small); malloc(medium); free(medium)

根据这篇文章Unix 一组令人困惑的低级内存分配方法的历史

如果您 free()d 正确地在中断顶部创建一块未使用的空间,则 malloc() 和公司最终可能会调用brk()sbrk()缩小程序的中断并将内存返回给操作系统。

由于空闲中块是最后一个(小分配块是倒数第二个),因此内存将返回给操作系统。

以下是我的问题:

  1. 我对“内存将归还给操作系统”这句话的理解是:该空闲块的虚拟内存和物理内存之间的映射被删除,其他进程可以使用该空闲块原来占用的物理内存。我的理解正确吗?

  2. 这次我调用malloc(medium); malloc(small); free(medium) 既然最后还有分配块,那么空闲块在虚拟内存和物理内存之间的映射还存在吗?其他进程可以使用这个空闲块的物理内存吗?

答案1

  1. 还有其他机制可以将物理内存重新用于其他目的,特别是在这种情况下的交换 - 如果内存压力足够高,则可以交换进程的物理内存以为其他内容腾出空间。

    如今,将内存返还给操作系统的主要好处是操作系统可以知道该内存不会被再次使用,因此它可以丢弃相应的物理内存,而无需任何进一步的仪式。 (看我对相关SO问题的回答了解详情。)

  2. 虚拟内存和物理内存之间的映射有些不稳定;请参阅上面关于交换的观点。在您的场景中,分配给进程的虚拟地址空间无法更改,因为无法减少程序中断,并且内核必须假设映射到它的任何物理内存都是“珍贵的”并且包含重要数据。但这并不意味着内核不能重新利用物理内存;而是意味着内核不能重新利用物理内存。这仅意味着它必须确保在此过程中存储的数据不会丢失。

相关内容