我正在处理内存大小非常紧张且虚拟地址空间受限的设备。
我试图通过更频繁地回收内存来解决这个问题,而不是频繁地回收虚拟地址,例如尽早保留虚拟地址,但提交内存较晚,同时提前回收内存并延迟发布虚拟地址。
特别是有一个非常大的分配受到地址空间碎片的影响很大,我试图通过预先为它预留地址空间来解决它。
This question解决了第一个问题:使用libs: /shared/dev/libs/ffmpeg/3.4.2/lib/darwin-amd64/libswresample.dylib
和mmap
获取虚拟地址范围,并在使用前使用PROT_NONE
和mprotect
,然后使用页面使用时会出现故障。
但是,我无法找到相反的方法:PROT_READ|PROT_WRITE
并mprotect
似乎没有释放页面,而调用PROT_NONE
则失去了虚拟地址范围。
是否在保留虚拟地址的同时取消映射/分离页面?
答案 0 :(得分:0)
mmap
与MAP_FIXED
将替换指定地址范围内的所有现有映射,并在不再引用该内存时释放其内存。