实施mmap&x27;在Windows和Linux以外的其他Unice中使用s`MAP_POPULATE`标志,而在Windows中则需要MADV_

实施mmap&x27;在Windows和Linux以外的其他Unice中使用s`MAP_POPULATE`标志,而在Windows中则需要MADV_,c,linux,unix,winapi,memory-management,C,Linux,Unix,Winapi,Memory Management,Linuxmmap(2)的实现有一个有用的标志:MAP\u POPULATE,当指定时,它将预故障我们正在分配的所有页面。 其他Unices系统没有此标志,但FreeBSD除外,它有一个名为MAP\u PREFAULT\u READ的等效标志 如果我想在Windows和其他Unices系统中实现此行为,如何以最佳方式实现 我想到了两种可能的方法: 1) 最具可移植性:只需执行一个循环,在每个分配页面的基址处写入一个“\0”字符(如果页面很多,也是最慢的实现)。这是否也会产生一些我现在还没有看到的

Linux
mmap(2)
的实现有一个有用的标志:
MAP\u POPULATE
,当指定时,它将预故障我们正在分配的所有页面。 其他Unices系统没有此标志,但FreeBSD除外,它有一个名为
MAP\u PREFAULT\u READ
的等效标志

如果我想在Windows和其他Unices系统中实现此行为,如何以最佳方式实现

我想到了两种可能的方法:

1) 最具可移植性:只需执行一个循环,在每个分配页面的基址处写入一个“\0”字符(如果页面很多,也是最慢的实现)。这是否也会产生一些我现在还没有看到的负面影响

2) 在Unice上调用
madvise()+MADV_将需要
。不幸的是,这种组合的Windows版本是没有的:在Windows上,你只得到了
VirtualAlloc()+MEM_RESET
,这相当于
madvise()+MADV_DONTNEED
,但是你没有
madvise()+MADV_需要调用,因为即使
VirtualAlloc()+只有在同一内存范围内调用了
VirtualAlloc()+MEM\u RESET
后,才能调用MEM\u RESET\u UNDO
,否则行为将未定义

因此,还有另一个问题的空间:Windows是否具有与
madvise()+MADV_相当的功能,不仅在这种情况下,而且在一般情况下,作为告诉Windows“看,我需要这些页面”的一种方式


有什么想法吗?

从Windows 8开始,您可以调用该函数。这类似于
madvise()+MADV\u将需要

在每页上写
\0
的不良影响?嗯,好吧,如果销毁数据是好的,那么不是。它们是刚刚分配的新页面,所以你不销毁任何数据,也可以与文件备份存储一起使用。为什么不读取第一个地址而不是写入它呢?是的,也许从每个页面基址读取一个单词大小的类型是最好的,它仍然会导致软故障,正如MSDN所说:看起来这个API更多地涉及磁盘I/O,而不是像
madvise()这样的预故障页面+MADV_需要
。您可以向API传递多个不同的地址范围,这一事实证明它的目标是实现更高效的I/O,一种readv(),但用于内存页。我不知道为预故障页面调用此API是否合适…MSDN没有对此做任何说明。而且,顺便说一句,这是一个太新的API,有很多Windows8之前的版本。@MarcoPagliaricci:我被难住了。你希望Prefault会做什么,那个虚拟博物馆不会?你的最终目标不是要(从文件映射的文件备份存储中)分页内存吗?@IInspectable,首先这个API在很多窗口上都不可用,但除此之外,它似乎有一个稍微不同的行为
madvise()+MADV\u WILLNEED
:说,我认为使用PVM将是在Windows上模拟
madvise()+MEM_所需的
的最佳方法。我会做更多的测试,谢谢。