gpt4 book ai didi

operating-system - 父进程在写时复制期间会失去写能力吗?

转载 作者:行者123 更新时间:2023-12-04 01:58:09 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于operating-system - 父进程在写时复制期间会失去写能力吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49246735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com