本实验仍然是虚拟内存,所以暂且跳过了中间的内容(指lec和课本)
分析
copy on write fork :
在之前的code walk through(https://blog.csdn.net/RedemptionC/article/details/107709618)中提到了,fork的实现里,有一个uvmcopy的调用,作用是将父进程的内存复制到子进程中,这个复制包括申请物理内存,设置pte
但是在下列情况下:
- 父进程和子进程都不修改某些内存页
- fork之后子进程马上调用exec,而由exec的实现可知,子进程的内存马上会由可执行文件的内容代替
这个复制,就显得很浪费资源,而且这两种情况不在少数,因此我们需要copy on write
fork时不申请额外的内存,只申请一个页表,并且把子进程页表的pte指向父进程的物理内存(和父进程页表的pte一样),仅当父进程/子进程修改其内存时,才复制页
这里的做法和lazy allocation差不多,都是在异常处理时申请内存:在fork时,把父进程的pte的PTE_W clear,这样写的