【发布时间】:2018-09-21 21:43:45
【问题描述】:
我正在开发一种内存大小和虚拟地址空间限制非常严格的设备。
我正在尝试通过更频繁地回收内存而减少回收虚拟地址来解决这个问题,例如提前保留虚拟地址,延迟提交内存,提前回收内存,延迟释放虚拟地址。
特别是有一个非常大的分配受到地址空间碎片的影响,我试图通过预先为其保留地址空间来解决它。
This question解决了第一个问题:使用mmap和PROT_NONE获取虚拟地址范围,使用前使用mprotect和PROT_READ|PROT_WRITE,然后使用时页面会出错。
但是,我找不到相反的方法:mprotect 和 PROT_NONE 似乎不会释放页面,而调用 munmap 会丢失虚拟地址范围。
是否在保留虚拟地址的同时取消映射/分离页面?
【问题讨论】:
-
不确定它是否有效,但您是否尝试过
madvise(ptr, size, MADV_DONTNEED)?手册中还有一些其他的建议标志看起来也很有用。这是评论而不是答案,因为我从未这样做过,也不知道它是否会起作用。 ;) -
我第二个 TypeIA。但是你需要使用
MAP_PRIVATE。也可以考虑MAP_NORESERVE。
标签: c linux memory-management mmap