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
。