我想分配和初始化相当大的连续内存块(~1GB),然后将其标记为只读并派生多个(比如说几十个)将使用它的子进程,而不制作自己的内存副本(机器将没有足够的内存用于此)。
我是否认为如果我malloc
像往常一样将内存标记为只读,然后将其标记为只读mprotect(addr, size, PROT_READ)
,fork
这将允许子进程安全地使用内存而不会导致它被复制?(前提是我确保在调用后没有尝试写入分配的内存mprotect
)。
编辑:感谢所有的答案。
一个后续问题 - 我计划使用shmget
,但我认为它已使用mm
,因此仅限于较小的分配(请参阅本页的限制部分)。例如/proc/sys/kernel/shmmax
,在我使用这个的服务器上是 32MB。但我想要 1GB 的连续内存。我对这个限制有误吗?