根据维基百科(这可能是错误的)
当发出 fork() 系统调用时,会创建与父进程对应的所有页面的副本,并由操作系统为子进程加载到单独的内存位置。但在某些情况下不需要这样做。考虑当子进程执行“exec”系统调用(用于执行 C 程序中的任何可执行文件)或在 fork() 之后很快退出的情况。当子进程只需要执行父进程的命令时,不需要复制父进程的页面,因为 exec 用要执行的命令替换了调用它的进程的地址空间。
在这种情况下,会使用一种称为写入时复制 (COW) 的技术。使用此技术,当发生分叉时,不会为子进程复制父进程的页面。相反,页面在子进程和父进程之间共享。每当进程(父进程或子进程)修改页面时,都会为执行修改的进程(父进程或子进程)单独创建该特定页面的单独副本。然后,此过程将在所有将来的引用中使用新复制的页面而不是共享的页面。另一个进程(未修改共享页面的进程)继续使用该页面的原始副本(现在不再共享)。这种技术称为写时复制,因为当某个进程写入该页面时,该页面就会被复制。
似乎当任何一个进程尝试写入页面时。该页面的新副本被分配并分配给生成页面错误的进程。之后原始页面被标记为可写。
我的问题是:如果在任何进程尝试写入共享页面之前多次调用 fork,会发生什么情况?
If fork
从原始父进程中多次调用,然后每个子进程和父进程都会将其页面标记为只读。当子进程尝试写入数据时,来自父进程的页面将被复制到其地址空间,并且复制的页面在子进程中被标记为可写,但在父进程中则不可写。
If fork
从子进程调用并且孙进程尝试写入,将原始父进程中的页面复制到第一个子进程,然后复制到孙进程,并将所有内容标记为可写。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)