当你 fork 一个进程时,在开始时,父子共享同一个内存页。但是如果其中一个人在这个页面上写,它会被复制,这样第一个就不会受到这个变化的影响。这大致就是所谓的 Copy-on-Write。
我的问题是:如果我们 fork() 一个进程,然后孩子修改页面会发生什么:页面重复一次,但之后,父亲也修改了页面。页面是否再次重复?父亲“知道”独生子已经被复制了吗?
预先感谢您的帮助。
当你 fork 一个进程时,在开始时,父子共享同一个内存页。但是如果其中一个人在这个页面上写,它会被复制,这样第一个就不会受到这个变化的影响。这大致就是所谓的 Copy-on-Write。
我的问题是:如果我们 fork() 一个进程,然后孩子修改页面会发生什么:页面重复一次,但之后,父亲也修改了页面。页面是否再次重复?父亲“知道”独生子已经被复制了吗?
预先感谢您的帮助。
(通用有过度简化的风险——即它是如何工作的)
Parent process has Virtual Page 10 as readwrite physical page 1000.
Parent process has Virtual Page 11 as readwrite physical page 1001.
父叉子。
Parent process has Virtual Page 10 as readonly physical page 1000.
Parent process has Virtual Page 11 as readonly physical page 1001.
Child process has Virtual Page 10 as readonly physical page 1000.
Child process has Virtual Page 11 as readonly physical page 1001.
父级写入虚拟页 10。触发保护故障。操作系统检测到它是写入页面上的副本 将物理页面 1000 复制到 1002 减少对物理页面 1000 的引用计数重新启动指令
Parent process has Virtual Page 10 as readwrite physical page 1002.
Parent process has Virtual Page 11 as readonly physical page 1001.
Child process has Virtual Page 10 as readonly physical page 1000.
Child process has Virtual Page 11 as readonly physical page 1001.
子写入虚拟页 11 触发保护故障。操作系统检测到它是写入页面上的副本 将物理页面 1001 复制到 1003 减少对物理页面 1001 的引用计数重新启动指令
Parent process has Virtual Page 10 as readwrite physical page 1002.
Parent process has Virtual Page 11 as readonly physical page 1001.
Child process has Virtual Page 10 as readonly physical page 1000.
Child process has Virtual Page 11 as readwrite physical page 1003.
父级写入虚拟页 11 触发保护故障。操作系统检测到它是写入页面上的副本,并且引用计数为 1。操作系统将页面更改为读写重新启动指令
Parent process has Virtual Page 10 as readwrite physical page 1002.
Parent process has Virtual Page 11 as readwrite physical page 1001.
Child process has Virtual Page 10 as readonly physical page 1000.
Child process has Virtual Page 11 as readwrite physical page 1003.
有 n 个进程可以访问写时复制页,其中 n ≥ 2。如果一个进程写入,则该页被复制并成为该进程的正常页。原始页面现在仅共享 n-1 次;如果 n = 1 那么它也变成一个普通页面。制作两份副本是没有意义的。