问题描述
我想保留一个大的连续区域 (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)。