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 new, uint64 sz)
{
pte_t *pte;
uint64 pa, i;
uint flags;
for(i = 0; i < sz; i += PGSIZE){
if((pte = walk(old, i, 0)) == 0)
panic("uvmcopy: pt

本文详细介绍了如何在xv6操作系统中实现Copy-on-Write (COW) fork,以解决传统fork可能导致的大内存拷贝浪费问题。COW fork通过延迟物理内存的分配和拷贝,仅在进程尝试写入时执行。主要修改了uvmcopy()、usertrap页故障处理、物理页引用计数维护等方面。并提供了kalloc、kfree、incref等关键函数的更新说明。
最低0.47元/天 解锁文章
2300

被折叠的 条评论
为什么被折叠?



