本文主要是介绍mit6.s081 lab6 Copy-on-Write Fork for xv6,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Implement copy-on write
copy-on-write fork需要解决什么问题?
xv6中的fork()调用需要拷贝所有父进程中的user space memory给子进程,如果user space memory中的空间很大,那么这个拷贝的过程需要消耗非常多的时间。而且这个拷贝的动作很多时候都是浪费的,因为在fork()后往往还会调用exec(),之前所拷贝的user space memory需要被丢弃掉。
为了解决以上问题,需要实现copy-on-write fork。在COW fork中将会推迟对物理内存的分配和拷贝操作,一开始只是创建一个pagetable给子进程,该pagetable指向父进程的物理页,COW fork会将父进程和子进程中的pte标记为不可写的,当其中的一个进程试图对物理页进行写操作室,CPU就会发生page fault,kernel中的page fault handler会对page fault进行处理,handler会为发生page fault的process分配一个物理页,并将原来的物理页中的内容拷贝到新的物理页,然后修改发生page fault的process中的pte指向新分配的物理页,并将pte标记为可写入的。物理页的删除需要通过一个引用计数来记录有多少个process正在共享当前的物理页,当引用数量为0时,才真正地释放该物理页。
为了实现cow fork需要对xv6进行以下修改:
1.修改uvmcopy()中的代码,复制页表时不再分配新的物理页,而是使子进程中的pte指向父进程的物理页,清除父进程和子进程中的pte中的PTE_W位。
int
uvmcopy(pagetable_t old, pagetable_t
这篇关于mit6.s081 lab6 Copy-on-Write Fork for xv6的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!