我有以下问题:
mmap
我通过with分配了一大块内存(多个 GiB)MAP_ANONYMOUS
。该块包含一个大的哈希映射,需要不时将其归零。不是每一轮都可以使用整个映射(不是每个页面都出错),所以memset
不是一个好主意 - 需要太长时间。
快速执行此操作的最佳策略是什么?
将要
madvise(ptr, length, MADV_DONTNEED);
向我保证任何后续访问都会提供新的空白页面?
从 Linuxman madvise
页面:
此调用不会影响应用程序的语义(除了MADV_DONTNEED的情况),但可能会影响其性能。内核可以随意忽略这些建议。
...
MADV_DONTNEED
对该范围内的页面的后续访问将成功,但将导致从底层映射文件(请参阅 mmap(2))重新加载内存内容或零填充按需页面以用于没有底层文件的映射。
...
当前的 Linux 实现(2.4.0)将此系统调用更多地视为命令而不是建议......
还是我必须munmap
重新映射该区域?
它必须在 Linux 上工作,并且理想情况下在 OS X 上具有相同的行为。