gpt4 book ai didi

c - mmap 保护标志对进程间共享的影响

转载 作者:太空宇宙 更新时间:2023-11-04 04:09:32 25 4
gpt4 key购买 nike

保护标志会影响进程间的共享吗?如果我有 PROT_READ|PROT_WRITE 保护的映射内存区域,只要我没有写入它,它是否仍然完全共享?

int prot = PROT_READ|PROT_EXEC;
image = mmap(NULL, filesize, prot, MAP_PRIVATE, fildes, 0);

对比:

int prot = PROT_READ|PROT_WRITE|PROT_EXEC;
image = mmap(...)

我想在映射后对内存区域的一小部分进行小的修改,然后重新保护它,因为它比在我需要时保护小部分更简单。

问题是它最终是强制每个进程复制整个文件,还是只强制每个进程复制我修改的部分?

最佳答案

根据mmap(2)在最近的 Linux 系统上的手册页中,MAP_PRIVATE 使用 copy-on-write 分配内存(奶牛)。这意味着,除非您对其进行更改,否则您的内存不会被复制。由于 COW 是实现这一点的有效方法,我假设其他 *NIX 系统也是以这种方式完成的。

mmap 的内存被组织成大小相等的 block ,即所谓的页面。内存将始终映射为页面大小的倍数,即整页。每个页面都可以独立交换。因此,如果您将某些内容写入此 mmap 内存范围,则只需复制至少一页。

页面大小取决于您的系统,在 x86 上通常为 4096 字节。如果您对系统的页面大小感兴趣,可以使用 sysconf(3) .

   #include <unistd.h>
long pagesize = sysconf(_SC_PAGESIZE);

您从 mmap() 获得的指针已经指向页面大小的倍数,您应该向 mprotect() 传递一个与页面边界对齐的地址。

关于c - mmap 保护标志对进程间共享的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com