关于fork() 及写时拷贝实现

“不同的进程访问同样的逻辑地址而对应的物理地址不同,是由于各自页表的不同。
linux系统下每个进程都拥有自己的页表,父进程fork出新的子进程时,子进程拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。当父进程或子进程发生写操作时将会发生缺页异常,缺页异常处理函数将会为子进程分配新的物理地址“

个人理解:每个进程都会有自己的页表(毋庸置疑),父进程fork出新的子进程时,子进程会拷贝一份父进程的页表,且父子进程将页表状态修改为写保护。注:二者页表里的虚拟空间地址是一样的(毕竟是拷贝)

父子进程都不需要对数据进行修改只是查看时:此时虽然各自都有一份页表,但页表中的虚拟地址映射到的是同一块物理地址,也就是说此时二者共享一块物理地址。

如图:

 

如果二者有需要对其中的数据进行修改时:系统要为 需要修改数据的进程 划分一块新的物理地址存储数据,也就是说此时二者可能页表中的虚拟地址相同,但映射到的已经不是同一块物理地址了。因为如果进程需要修改数据时没有单独为其分配物理地址就会发生覆盖。(

The child process and the parent process run in separate memory spaces.
At the time of fork() both memory spaces have the same content. Memory
writes, file mappings (mmap(2)), and unmappings (munmap(2)) performed
by one of the processes do not affect the other

如图(假使子进程需要修改num的值为112):

fork细节:一般来说,在fork之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。如果要求父、子进程之间相互同步,则要求某种形式的进程间通信

总结:所以在使用fork在借用cow策略实现时,其实父子进程会共享数据段、代码段、堆,而栈是父子进程独有的.

在了解了以上所说的内容后,可以看一下下面这篇文章更加深入理解:

写时复制技术详解(COW) - 腾讯云开发者社区-腾讯云 (tencent.com)

posted @ 2022-11-23 15:16  balabalahhh  阅读(97)  评论(0编辑  收藏  举报