这是一种与子进程共享只读内存的安全方法吗?

我想分配并初始化一大块连续内存(~1GB),然后将其标记为只读并分叉多个(比如几十个)将使用它的子进程,而不创建自己的内存副本(机器没有足够的内存().

我是否正确地认为,如果我像往常一样malloc内存,然后用mprotect(addr, size, PROT_READ)fork将其标记为只读,这将允许子进程安全地使用内存而不会导致它被复制? (假设我确保在mprotect调用之后没有尝试写入分配的内存).

编辑:感谢您的所有答案.

一个后续问题 – 我打算使用shmget,但我认为它使用的是mm,因此仅限于较小的分配(见Restrictions section of this page).例如/ proc / sys / kernel / shmmax在服务器上是32MB我正在使用这个.但我想要1GB的连续内存.我错了这个限制吗?

最佳答案
man mprotect

The implementation will require that addr be a multiple of the page size as returned by 07001.

The behaviour of this function is unspecified if the mapping was not established by a call to 07002.

> mprotect仅适用于页面,而不适用于任意字节范围,因此通常malloc是不合适的. posix_memalign可能有所帮助,但……
>虽然它目前可能适用于您的系统,但您不应该保护您自己没有做过的任何事情.请改用mmap(0,pages * sysconf(_SC_PAGESIZE),PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0).

转载注明原文:这是一种与子进程共享只读内存的安全方法吗? - 代码日志