如果父进程与另一个进程共享一些页面并且我们分叉父进程。据我所知,孩子复制页表,我们将页面设置为只读并执行 Copy-On-Write。但是,如果我们写入错误的共享内存页面,这将创建共享内存页面的副本。Linux内核如何避免这种情况?
问问题
1055 次
1 回答
6
内核知道使用共享内存操作分配了哪些内存页面。当一个孩子被分叉时,这些页面不会被标记为 Copy-on-Write,因此它们将在所有进程之间保持共享。
这记录在vm_area_struct
数据结构中,在vm_flags
成员中。标志之一是VM_SHARED
. mm/memory.c 包含以下函数,用于确定是否应将页面转换为 COW
static inline int is_cow_mapping(vm_flags_t flags)
{
return (flags & (VM_SHARED | VM_MAYWRITE)) == VM_MAYWRITE;
}
如果您想了解有关如何设置和使用此标志的更多信息,请转到Linux 交叉参考并搜索 VM_SHARED。
于 2012-11-15T20:45:23.563 回答