“不同的进程访问同样的逻辑地址而对应的物理地址不同,是由于各自页表的不同。
linux系统下每个进程都拥有自己的页表,父进程fork出新的子进程时,子进程拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。当父进程或子进程发生写操作时将会发生缺页异常,缺页异常处理函数将会为子进程分配新的物理地址“
个人理解:每个进程都会有自己的页表(毋庸置疑),父进程fork出新的子进程时,子进程会拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。注:二者页表里的虚拟空间地址是一样的(毕竟是拷贝)
父子进程都不需要对数据进行修改只是查看时:此时虽然各自都有一份页表,但页表中的虚拟地址映射到的是同一块物理地址,也就是说此时二者共享一块物理地址。
如图:
如果二者有需要对其中的数据进行修改时:系统要为 需要修改数据的进程 划分一块新的物理地址存储数据,也就是说此时二者可能页表中的虚拟地址相同,但映射到的已经不是同一块物理地址了。因为父子进程的数据应该是独立的,如果进程需要修改数据时没有单独为其分配物理地址就会发生覆盖。
如图(假使子进程需要修改num的值为112):
“
fork细节:一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。如果要求父、子进程之间相互同步,则要求某种形式的进程间通信
总结:所以在使用fork在借用cow策略实现时,其实父子进程会共享数据段、代码段、堆,而栈是父子进程独有的.
”
在了解了以上所说的内容后,可以看一下下面这篇文章更加深入理解:
写时复制技术详解(COW) - 腾讯云开发者社区-腾讯云 (tencent.com)
标签:fork,修改,物理地址,关于,进程,拷贝,页表 From: https://www.cnblogs.com/balabalabubalabala/p/16917179.html