fork写时拷贝

当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配它一个唯一的PID,为了给这个新进程创建虚拟存储器,它创建了当前进程的mm_struct、区域结构和页表的 原样拷贝。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都 标记为私有的写时拷贝
当fork在新进程中返回时,新进程现在的虚拟存储器刚好和调用fork时存在的虚拟存储器相同(就是父进程 运行到fork时的虚拟存储器,所以子进程运行的地方是从fork返回时开始的,并不是从头开始)。当这两个进程的任一个后来进行写操作时,写时拷贝机制就会创建新的 物理页面。(深入理解计算机系统二 558页)
通俗一点说,就是在exec之前 两个进程用的是 相同的物理空间(内存区)(所谓用是只读,不能写的),子进程的代码段、数据段、堆栈都是指向父进程的物理空间 。当父子进程中有 更改相应段的行为发生 时,再 为子进程相应的段分配物理空间(这时创建拷贝的进程的页表条目会指向这个新的物理页面(拷贝),然后恢复这个页面的可写权限) ,如果不是因为exec,内核会给 子进程的数据段、堆栈段分配相应的物理空间 (至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同, 子进程的代码段也会分配单独的物理空间
通常来说,fork函数的代码段基本是只读类型的,而且在运行阶段也只是复制,并不会对内容进行修改,因此父子进程是共享代码段,而数据段、Bss段、堆栈段等会在运行的过程中发生写过程,这样就导致了不同的段发生相应的写时拷贝过程,实现了不同进程的独立空间。
相应网页:
http://blog.chinaunix.net/uid-20937170-id-3012588.html

你可能感兴趣的:(fork写时拷贝)