【问题标题】:How to release memory while preserving virtual address range?如何在保留虚拟地址范围的同时释放内存?
【发布时间】:2018-09-21 21:43:45
【问题描述】:

我正在开发一种内存大小和虚拟地址空间限制非常严格的设备。

我正在尝试通过更频繁地回收内存而减少回收虚拟地址来解决这个问题,例如提前保留虚拟地址,延迟提交内存,提前回收内存,延迟释放虚拟地址。

特别是有一个非常大的分配受到地址空间碎片的影响,我试图通过预先为其保留地址空间来解决它。

This question解决了第一个问题:使用mmapPROT_NONE获取虚拟地址范围,使用前使用mprotectPROT_READ|PROT_WRITE,然后使用时页面会出错。

但是,我找不到相反的方法:mprotectPROT_NONE 似乎不会释放页面,而调用 munmap 会丢失虚拟地址范围。

是否在保留虚拟地址的同时取消映射/分离页面?

【问题讨论】:

  • 不确定它是否有效,但您是否尝试过madvise(ptr, size, MADV_DONTNEED)?手册中还有一些其他的建议标志看起来也很有用。这是评论而不是答案,因为我从未这样做过,也不知道它是否会起作用。 ;)
  • 我第二个 TypeIA。但是你需要使用MAP_PRIVATE。也可以考虑MAP_NORESERVE

标签: c linux memory-management mmap


【解决方案1】:

mmapMAP_FIXED 将替换指定地址范围内的任何现有映射,如果不再引用,则释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 2016-04-29
    • 2011-02-27
    • 1970-01-01
    • 2016-07-10
    • 2018-07-09
    • 2014-01-16
    • 2011-08-21
    相关资源
    最近更新 更多