c - 如何为 mmap() 禁用写时复制和按需填零

标签 c linux mmap copy-on-write page-fault

我正在使用 mmap() 执行 cp(文件复制)命令。 为此,我将源文件映射到 MAP_PRIVATE(因为我只想读取)模式,将目标文件映射到 MAP_SHARED 模式(因为我必须写回目标文件的更改内容)。

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

有什么方法可以禁用按需填零和写时复制吗?

谢谢, 哈里什

最佳答案

mmap(2) 有 MMAP_POPULATE 标志:

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

MAP_POPULATE (since Linux 2.5.46) Populate (prefault) page tables for a mapping. For a file mapping, this causes read-ahead on the file. Later accesses to the mapping will not be blocked by page faults. MAP_POPULATE is only supported for private mappings since Linux 2.6.23.

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

关于c - 如何为 mmap() 禁用写时复制和按需填零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11132559/

相关文章:

linux - 安装 usblib 包 - Ubuntu

linux - 在 UNIX 中运行 .exe 文件

linux - MADV_DONTNEED 在 mmap() 之后立即执行任何有用的操作吗?

c - 连接到共享内存的不同部分无法正常工作

c - SIGSEGV,映射区域后

字符缓冲区输入超过 256 个字符

c - 持续错误 : subscripted value is neither array nor pointer nor vector

c - 数组名代表什么?

java - C++ 或 Java 中的 Linux 守护进程?

c - 如何在 C 中生成随机 64 位无符号整数