ssg*_*gao 9 linux memory fork copy-on-write
根据维基百科(可能是错的)
发出fork()系统调用时,会创建与父进程对应的所有页面的副本,由OS进行子进程加载到单独的内存位置.但在某些情况下不需要这样做.考虑一个子进行"exec"系统调用(用于执行C程序中的任何可执行文件)或fork()之后很快退出的情况.当需要子进程来执行父进程的命令时,不需要复制父进程的页面,因为exec用要执行的命令替换调用它的进程的地址空间.
在这种情况下,使用称为写时复制(COW)的技术.使用此技术,当发生fork时,不会为子进程复制父进程的页面.相反,页面在子进程和父进程之间共享.每当进程(父进程或子进程)修改页面时,就会对执行修改的进程(父进程或子进程)单独创建该特定页面的单独副本.然后,此过程将使用新复制的页面,而不是将来所有引用中的共享页面.另一个进程(未修改共享页面的进程)继续使用页面的原始副本(现在不再共享).这种技术称为写时复制,因为当某个进程写入页面时会复制该页面.
似乎当任一进程尝试写入页面时.将分配新页面副本并将其分配给生成页面错误的进程.之后,原始页面被标记为可写.
我的问题是:如果在任何进程尝试写入共享页面之前多次调用fork,会发生什么?
per*_*eal 12
如果fork
从原始父进程多次调用,则每个子进程和父进程都将其页面标记为只读.当子进程尝试写入数据时,父进程中的页面将复制到其地址空间,并且复制的页面在子进程中标记为可写,但不在父进程中.
如果fork
从子进程调用并且祖母尝试编写,则将原始父级的页面复制到第一个子级,然后复制到大子级,并将所有页面标记为可写.