Linux 以编程方式检查内存页状态

Linux 以编程方式检查内存页状态,linux,windows,memory,paging,Linux,Windows,Memory,Paging,我想在大数组上实现插值搜索。一种可能的优化方法是先触摸已经加载到主存中的内存地址(触摸它们不会导致硬页错误)。例如,如果我需要读取索引X处的数据,我可以检查此页是否在主内存中,如果不在主内存中,我可以检查已在内存中的相邻页之一 因此,我需要一些机制来检查地址(X&0xfffffffffe0000)处的页面是否已加载(或未加载)。或者更好——我需要获取某个地址范围内的加载页面列表,或者类似的内容 在linux或windows(应用程序是crossp平台)上的用户空间代码中是否有可能?此时,我只使用

我想在大数组上实现插值搜索。一种可能的优化方法是先触摸已经加载到主存中的内存地址(触摸它们不会导致硬页错误)。例如,如果我需要读取索引X处的数据,我可以检查此页是否在主内存中,如果不在主内存中,我可以检查已在内存中的相邻页之一

因此,我需要一些机制来检查地址
(X&0xfffffffffe0000)
处的页面是否已加载(或未加载)。或者更好——我需要获取某个地址范围内的加载页面列表,或者类似的内容

在linux或windows(应用程序是crossp平台)上的用户空间代码中是否有可能?此时,我只使用最近接触的内存地址的LRU缓存,希望操作系统不会交换最近使用的内存页。

在Win32 Api中

查看QueryWorkingSet函数,以查询进程的内存状态

作为在物理内存上加载页面的一种有效方法,请参阅预取虚拟内存

据我所知,与Windows和Linux兼容的最低级别、跨平台API是POSIX规范


另外,我建议大家看看numa Win32内存函数、英特尔缓存线和二级内存操作码,这是一个非常棘手的问题,但它可以大大提高内存读/写的性能(如果这是主要目标的话).

QueryWorkingSet或QueryWorkingSetx不提供此信息。理论上,工作集驻留在物理内存中,请检查此页面:QueryWorkingSet是我需要的。你知道这个API的POSIX模拟是什么吗?遗憾的是,我没有这个信息。windows中的POSIX实现可能需要从Microsoft安装额外的软件,因为POSIX是运行在内核之上的用户子系统。如果我发现一些有趣的东西,我会告诉你的。根据你解释中的信息,我认为在unix中定位工作集函数并开发两种不同的实现可能是一个好主意,一种用于WIN32,另一种用于unix/Linux(您的代码需要查询非常接近操作系统的信息,可能无法100%移植实现)。