Joh*_*ter 7 c linux shared-memory
我想分配并初始化一大块连续的内存(~1GB),然后将其标记为只读并分叉多个(比如几十个)将使用它的子进程,而不制作自己的内存副本(机器没有足够的内存().
我是否正确地认为如果我malloc像往常一样将内存标记为只读mprotect(addr, size, PROT_READ),然后fork,这将允许子进程安全地使用内存而不会导致它被复制?(假设我确保在mprotect调用后没有尝试写入分配的内存).
编辑:感谢您的所有答案.
一个后续问题 - 我正在计划使用shmget,但我认为它已经使用mm,因此仅限于较小的分配(请参阅本页的" 限制"部分).例如/proc/sys/kernel/shmmax,服务器上的32MB我正在使用这个.但我想要1GB的连续内存.我错了这个限制吗?
实现将要求addr是sysconf()返回的页面大小的倍数.
如果未通过调用mmap()建立映射,则不指定此函数的行为.
mprotect仅适用于页面,而不是任意字节范围,因此通常malloc是不合适的. posix_memalign可能有帮助,但......mprotect应该为自己没有做任何mmap事情.请mmap(0, pages*sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0)改用.