c - 在Windows和除Linux之外的其他Unice中实现mmap的 `MAP_POPULATE`标志,以及在Windows中实现MADV_WILLNEED

标签 c linux unix winapi memory-management

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/

相关文章:

c - 打印缓冲区内容

bash - 如何在 mailx 命令中抄送邮件列表

bash - UNIX:使用 egrep 或 sed 查找字符串第一次出现的行?

xml - 在 Linux 上运行进程的 shell 脚本

mysql - Windows 客户端 - Linux 上的 MYSQL 服务器

c - 传递给线程(unix)的结构有错误的值

c - 关于 C 中指针的问题?

c++ - fork创建子进程时,parent ID与parent ID不一样

C - 在格式化字符串中查找子字符串

python - 没有得到 LD_LIBRARY_PATH