在Windows和其他Unix版本中实现mmap的`MAP_POPULATE`标志,在Windows中使用MADV_WILLNEED

Linux mmap(2)有一个有用的标志: MAP_POPULATE ,当指定时,将默认所有我们分配的页面。 其他的Unices系统没有这个标志,除了有一个名为MAP_PREFAULT_READ的等价标志的FreeBSD。

如果我想在Windows和其他Unices系统中实现这种行为,我怎样才能以最好的方式做到这一点?

我想了2种可能的方法:

1)最便携的:只要做一个循环,在每个分配的页面的基地址写一个'\ 0'字符(也是最慢的实现,如果页面很多)。 这也会有一些不好的影响,我现在没有看到?

2)在madvise()+MADV_WILLNEED上调用madvise()+MADV_WILLNEED 。 不幸的是,这个组合的等价Windows版本没有:在Windows上,你只有VirtualAlloc()+MEM_RESET ,这相当于madvise()+MADV_DONTNEED但是你没有madvise()+MADV_WILLNEED来调用,因为even必须调用VirtualAlloc()+MEM_RESET ,在同一范围的内存上调用VirtualAlloc()+MEM_RESET之后,否则行为是不确定的。

所以,还有另外一个问题的空间:有一个相当于madvise()+MADV_WILLNEED Windows不仅用于这种情况,而且一般来说,作为告诉Windows“看,我需要这些页面”的一种方式?

有什么想法吗?

从Windows 8开始,您可以调用PrefetchVirtualMemory函数。 这与madvise() + MADV_WILLNEED