4

如果父进程与另一个进程共享一些页面并且我们分叉父进程。据我所知,孩子复制页表,我们将页面设置为只读并执行 Copy-On-Write。但是,如果我们写入错误的共享内存页面,这将创建共享内存页面的副本。Linux内核如何避免这种情况?

4

1 回答 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 回答