c++ - '当一个大块被“锁定”在较小的块之间'时,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吗?
这在实际程序中会是什么样的情况?
解决方案
考虑一个分配大量内存的程序的长期运行逻辑函数。并且在逻辑函数运行的同时,其他代码位分配了非常小的内存块。
稍后,该长时间运行的函数可能会完成,并且它分配的大量内存将全部释放。但是程序的其他逻辑函数分配的许多小位仍然保留着内存。
您可能会遇到这样的情况,即程序向操作系统请求了大量内存,并且几乎所有这些内存都是空闲的,但是,程序的分配器无法将内存返回给操作系统,因为它分配的每个块都是从系统仍有一小部分在使用。这称为“内存碎片”。
推荐阅读
- html - 在 RStudio 中从 HTML 中检索数据
- python - JupyterLab 中的散景滑块未更新
- html - 如何对静态服务内容使用 jwt 身份验证?
- django - 通过无服务器运行 Django 时出现 Psycopg2 错误
- python - 通过部分字符串在熊猫数据框列表中查找字符串
- python - TypeError:预期的字符串或类似字节的对象“
- ms-word - Rmd to word with flex table - 只需要增加单词输出中表格的边距
- asp.net - 关于 ibm.data.db2 nuget 包
- java - 试图在 android studio 的列表视图中显示解析的 JSON 对象
- sql - 为什么我不能在 SQL 中正确分组数据?