2

下面的代码是否会将数据从文件加载到系统内存中,以便对结果指针的访问永远不会阻塞线程?

auto ptr = VirtualLock(MapViewOfFile(file_map, FILE_MAP_READ, high, low, size), size); // Map file to memory and wait for DMA transfer to finish.
int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?

VirtualUnlock(ptr);
UnmapViewOfFile(ptr);

编辑:

达蒙斯回答后更新。

auto ptr = MapViewOfFile(file_map, FILE_MAP_READ, high, low, size);

#pragma optimize("", off)
char dummy;
for(int n = 0; n < size; n += 4096)
    dummy = reinterpret_cast<char*>(ptr)[n];
#pragma optimize("", on)

int val0 = reinterpret_cast<int*>(ptr)[0]; // Will not block thread?
int val1 = reinterpret_cast<int*>(ptr)[size-4]; // Will not block thread?

UnmapViewOfFile(ptr);
4

1 回答 1

2

如果文件的大小小于最小的最大工作集大小(或者,如果您相应地修改了工作集大小),那么理论上是的。如果您超过了您的最大工作集大小,VirtualLock则将什么也不做(即失败)。

(在实践中,我已经看到VirtualLock相当......自由......在解释它应该做的事情而不是它实际做的事情,至少在 Windows XP 下 - 在更现代的版本下可能会有所不同)

我过去一直在尝试类似的事情,现在我只是通过一个简单的for循环(读取一个字节)来触摸我想要在 RAM 中的所有页面。这没有留下任何问题并且有效,唯一可能的例外是页面在理论上可能会在触摸后再次被换出。在实践中,这永远不会发生(除非机器的 RAM 真的很低,然后发生就可以了)。

于 2012-08-15T12:10:54.463 回答