Skip to content

feat(cow): 实现写时复制

zhangweijie requested to merge mit6.s081_cow into cow

Copy on Write

当fork的时候,子进程不直接复制父进程的数据,而是指向相同的物理页,同时物理页设置成 只读,只有在父或子进程需要写内存的时候,才将对应的内存进行复制,提高效率

  1. 第一个需要解决的问题,如何判断某个物理页可以被回收?
    1. 因为父进程或者子进程销毁的时候,并不能直接回收物理内存,因为有其他进程也在引用,只有该物理内存没有被引用的时候,才能被回收
    2. 实现引用计数,当物理页的计数为0的时候,就可以回收,每次被引用的时候,+1,销毁的时候-1,直到为0才真正回收。
    3. 分配的时候,需要记录引用计数,Copy的时候进行+1操作,同时设置标记位
  2. 第二个是当需要写的时候,需要触发异常,由中断程序来分配物理内存,并重新指向物理内存,同时抹掉只读权限
    1. 需要判断当前的页表是否是真的因为cow而导致的
    2. 判断页表项是否存在、是否有效、是否是因为cow导致,如果是,则分配,并将原来的cow标志位去掉
  3. 第三个是fork的时候,需要将原本的权限改成只读
  4. 第四个是将copyout的时候,需要判断被写的用户页面是否是因为cow导致的,若是的话,需要生成新的物理页。

Merge request reports

Loading