【问题标题】:How do parent and child share pages after fork() with Copy-On-Write in Linux?在 Linux 中使用 Copy-On-Write 的 fork() 之后,父子节点如何共享页面?
【发布时间】:2012-11-15 07:10:24
【问题描述】:

我对 fork() 用例很感兴趣。

1) 在fork之后,内核为子进程创建一个新的PCB。它将父级中所有页表条目的权限更改为只读。然后它在新的子 PCB 中复制父页面目录和表格。 它是否正确?还是父子进程共享?

2) 如果内核在复制页面后将它们全部更改为只读,那么内核如何知道页面的实际权限?

【问题讨论】:

  • 难道 fork() 不会为子进程克隆父级的 PCB 吗? fork()ed 进程是子进程,而不是线程。 init(1) 进程 fork() 整个运行环境,包括 shell 以及我们执行的程序,但我们无法“读取”init(1) 的 PCB。

标签: linux kernel


【解决方案1】:

我认为1)中的观点是正确的,在fork()期间,内核会为子进程创建一个新的task_struct,并复制mm_struct和页表,它与依赖于clone_flags的父进程共享资源。并且它将使is_cow_mapping()的MMU条目失效,并将相关的页表条目标记为只读。

2)的答案:内核只将页表条目is_cow_mapping()改为只读,当孩子或父母想要访问这些地址范围时,内核会复制并标记为读/写。

如果在 fork() 之后调用 exec(),则会创建一个全新的虚拟空间,从 parent 复制的旧虚拟空间将被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-26
    • 2013-02-26
    • 1970-01-01
    • 2018-08-27
    • 2012-05-19
    • 1970-01-01
    • 2012-03-30
    • 2012-01-15
    相关资源
    最近更新 更多