写时复制期间父进程是否会失去写能力?

2023-12-01

假设我们有一个父进程,在内存中存储了一些任意数量的数据,我们使用fork产生一个子进程。据我所知,为了让操作系统执行写入时复制,内存中包含我们正在修改的数据的特定页面将设置其只读位,并且操作系统将使用子进程尝试时产生的异常修改数据以将整个页面复制到内存中的另一个区域,以便子进程获得自己的副本。我不明白的是,如果内存中的特定部分被标记为只读,那么数据最初所属的父进程也将无法修改数据。那么整个计划如何运作呢?即使父级本身尝试修改数据,父级是否会失去其数据的所有权并且必须执行写入时复制?


是的,如果任一进程写入 COW 页,就会触发页错误。

在页面错误处理程序中,如果页面是supposed为了可写,它分配一个新的物理页并执行memcpy(newpage, shared_page, pagesize),然后更新发生故障的进程的页表,以将新页映射到该虚拟地址。然后返回用户空间以重新运行存储指令。

这是类似的胜利fork,因为一个过程通常会产生execve通常在接触一页(堆栈内存)后立即进行系统调用。execve销毁该进程的所有内存映射,有效地将其替换为新进程。父级再次拥有每个页面的唯一副本。 (除了那些页面already写时复制,例如分配的内存mmap通常是 COW 映射到单个零物理页,因此读取可以命中 L1d 缓存)。

明智的优化是为了fork实际复制包含堆栈顶部的页面,但仍然对所有其他页面执行惰性 COW,假设子进程通常会execve立即删除其对所有其他页面的引用。不过,暂时将所有页面翻转为只读然后返回,仍然会导致父级中的 TLB 失效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

写时复制期间父进程是否会失去写能力? 的相关文章

随机推荐