我想在大型数组上实现插值搜索。其中一种可能的优化是触摸已经加载到主存储器中的存储器地址(触摸它们不会导致硬页面错误)。例如,如果我需要读取索引X处的数据,我可以检查此页面是否在主内存中,如果不是 - 我可以检查内存中已有的相邻页面之一。
所以,我需要一些机制来检查地址(X & 0xFFFFFFFFFFFE0000)
上的页面是否已加载(或不加载)。或者更好 - 我需要在某个地址范围内获取已加载页面的列表,或者类似的东西。
是否可以在linux或windows上使用用户空间代码(app是crossp-latform)?此时我只是使用最近触及的内存地址的LRU缓存,希望操作系统不会交换最近使用过的内存页面。
答案 0 :(得分:1)
在Win32 Api中
查看QueryWorkingSet函数以查询进程内存的状态。
作为在物理内存上加载页面的有效方法,请参阅PrefetchVirtualMemory
与Windows和Linux兼容的最低级别的跨平台API,我知道是POSIX规范。
另外我建议你看看numa Win32内存函数和intel缓存行和L2内存操作码,这是一个非常棘手的东西,但它可以大大增加内存读/写的性能(如果这是主要目标)。