Linux mmap(2)
的实现有一个有用的标志:MAP_POPULATE
,指定该标志后,我们正在分配的所有页面都会出现故障。
其他 Unices 系统没有此标志,但 FreeBSD 除外,它有一个名为 MAP_PREFAULT_READ
的等效标志。
如果我想在 Windows 和其他 Unices 系统中实现此行为,我怎样才能以最好的方式做到这一点?
我想到了两种可能的方法:
1) 最可移植的:只需执行一个循环,在每个分配的页面的基地址处写入“\0”字符(如果页面很多,这也是最慢的实现)。这是否也会产生一些我现在没有看到的不良影响?
2) 在 Unices 上调用 madvise()+MADV_WILLNEED
。不幸的是,这种组合没有等效的 Windows 版本:在 Windows 上,您只有 VirtualAlloc()+MEM_RESET
,相当于 madvise()+MADV_DONTNEED
但您没有没有 madvise()+MADV_WILLNEED
可以调用,因为即使 VirtualAlloc()+MEM_RESET_UNDO
也只能AFTER VirtualAlloc 调用()+MEM_RESET
已在同一内存范围上调用,否则行为未定义。
因此,还有另一个问题的空间:Windows 是否有一个相当于 madvise()+MADV_WILLNEED
的工具,不仅在这种情况下使用,而且在一般情况下,作为告诉 Windows“看”的一种方式,我需要那些页面”?
有什么想法吗?
最佳答案
从 Windows 8 开始,您可以调用 PrefetchVirtualMemory
功能。这类似于 madvise() + MADV_WILLNEED
。
关于c - 在Windows和除Linux之外的其他Unice中实现mmap的 `MAP_POPULATE`标志,以及在Windows中实现MADV_WILLNEED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32049240/