如何禁用mmap()的写时复制和零填充

Har*_*ish 6 c linux mmap copy-on-write page-fault

我正在使用mmap()实现cp(文件复制)命令.为此,我在MAP_SHARED模式中映射了MAP_PRIVATE(我只是想读取)模式和目标文件中的源文件(因为我必须回写目标文件的更改内容).

在执行此操作时,我发现由于2个原因导致的大量次要页面错误导致性能下降.1)在为源文件调用mmap(MAP_PRIVATE)时按需填充零.2)在为目标文件调用mmap(MAP_SHARED)时复制写入.

有没有办法禁用零填充按需和写时复制?

谢谢,哈里什

osg*_*sgx 5

mmap(2)的MMAP_POPULATE标志:

http://linux.die.net/man/2/mmap

MAP_POPULATE(自Linux 2.5.46起)为映射填充(故障前)页表。对于文件映射,这将导致文件上的预读。页面错误不会阻止以后对映射的访问。从Linux 2.6.23开始,仅私有映射支持MAP_POPULATE。

它应该预先对mmapped区域中的所有页面进行故障处理。它应该适用于问题(1),而不适用于问题(2)(共享)。

  • 注意:`MAP_POPULATE`表示在使用映射时没有延迟(除非由于内存压力而被分页),但是这也意味着`mmap`调用本身会阻塞直到读入整个文件。通常最好避免支持posix_madvise的MAP_POPULATE(http://linux.die.net/man/3/posix_madvise)(或非标准化的madvise的http://linux.die.net/man / 2 / madvise))使用`POSIX_MADV_WILLNEED`,等效于`MAP_POPULATE`,但不会阻塞。您可以打开/映射源文件,建议其加载,然后操作系统将批量读取后台文件,而不是要求进行故障处理。 (3认同)