如何在保持虚拟地址映射的同时返回物理页面?

问题描述

我想保留一个大的连续区域 (4GiB) 的虚拟地址空间。我可以用 with ar as ( select [1,2,3,4] as ar ) select n,(select array_agg(case when n & (1<<pos) <> 0 then ar.ar[offset(pos)] end ignore nulls) from ar cross join unnest(generate_array(0,x.cnt - 1)) pos ) as combo from ar cross join (select count(*) as cnt from ar cross join unnest(ar.ar) x ) x cross join unnest(generate_array(1,cast(power(2,x.cnt) - 1 as int64))) n 做到这一点。然后,当我写入内存时,内核将逐渐使其成为物理支持。在某个阶段,我希望将这个范围内的物理页返回 回内核,同时保持虚拟地址空间的整个区域仍然被映射。我的问题是,如果我返回带有 mmap 的物理页面,那么我不仅返回物理页面,而且还返回虚拟地址空间。

是否可以只返回物理页面,同时仍然保留虚拟地址空间?

解决方法

是的,在 advice 设置为 MADV_DONTNEED 的情况下调用 madvise(2)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...