首页 > 解决方案 > '当一个大块被“锁定”在较小的块之间'时,mmap 不起作用是什么意思?

问题描述

我正在阅读 GNU 内存分配器的 GNU C 库文档。 https://www.gnu.org/software/libc/manual/html_node/The-GNU-Allocator.html

在关于使用 mmap 分配大块内存的段落中,它说

内存分配的另一种方式是用于非常大的块,即比页面大得多。这些请求使用 mmap 分配(匿名或通过 /dev/zero;请参阅内存映射 I/O))。这具有很大的优势,即这些块在被释放时会立即返回到系统。

因此,不会发生大块被“锁定”在较小块之间的情况,即使在调用 free 之后也会浪费内存。

据我了解, mmap 似乎是一个函数,我可以在其中为文件分配连续的内存空间(反之亦然?)。

所以我不明白这部分,即使它位于较小的内存块之间,也不能释放内存块吗?然后我们可以将它用于mmap吗?

这在实际程序中会是什么样的情况?

标签: c++cdynamic-memory-allocation

解决方案


考虑一个分配大量内存的程序的长期运行逻辑函数。并且在逻辑函数运行的同时,其他代码位分配了非常小的内存块。

稍后,该长时间运行的函数可能会完成,并且它分配的大量内存将全部释放。但是程序的其他逻辑函数分配的许多小位仍然保留着内存。

您可能会遇到这样的情况,即程序向操作系统请求了大量内存,并且几乎所有这些内存都是空闲的,但是,程序的分配器无法将内存返回给操作系统,因为它分配的每个块都是从系统仍有一小部分在使用。这称为“内存碎片”。


推荐阅读