希望标题清楚。我有一块通过 mmap() 获得的内存。一段时间后,我得出结论,我不再需要这个范围内的数据。但是,我仍然希望保持这个范围。也就是说,我不想调用 mummap()。我正在努力成为一个好公民,而不是让系统交换超出它的需要。
有没有办法告诉 Linux 内核,如果给定的页面是由物理页面支持的,并且如果内核决定它需要那个物理页面,那么不要费心写那个页面来交换?
我想在幕后这个神奇的函数调用会破坏给定虚拟页面和物理页面之间的任何映射(如果存在),而无需先写入交换。
希望标题清楚。我有一块通过 mmap() 获得的内存。一段时间后,我得出结论,我不再需要这个范围内的数据。但是,我仍然希望保持这个范围。也就是说,我不想调用 mummap()。我正在努力成为一个好公民,而不是让系统交换超出它的需要。
有没有办法告诉 Linux 内核,如果给定的页面是由物理页面支持的,并且如果内核决定它需要那个物理页面,那么不要费心写那个页面来交换?
我想在幕后这个神奇的函数调用会破坏给定虚拟页面和物理页面之间的任何映射(如果存在),而无需先写入交换。
你的问题(如前所述)没有意义。
让我们假设有一种方法可以让您告诉内核做您想做的事情。
让我们进一步假设它确实需要额外的 RAM,因此它占用了您的页面,并且没有将其换出。
现在您的程序尝试读取该页面(因为您不想读取munmap
数据,可能您可能会尝试访问它)。内核要做什么?我看到的选择:
SIGSEGV
如果您想要选择 2,您可以使用munmap
.
如果您想要选择 1,您可以使用(或后跟 new )mremap
覆盖现有映射。MAP_ANON
munmap
mmap
无论哪种情况,您都不能在需要时依赖旧数据。
您的问题有意义的唯一方法是内核是否有一些额外的机制让您知道它正在夺走您的页面(例如,向您发送一个特殊信号)。但是您描述的情况可能很少见,足以保证额外的复杂性。
编辑:
您可能正在寻找madvise(..., MADV_DONTNEED)
你可以munmap
区域,然后mmap
再用MAP_NORESERVE
如果您在初始映射时知道不需要交换,请使用MAP_NORESERVE