Reference-Counting
在 COW 机制下,一个物理页可能被多个进程(父进程、子进程、孙进程)共享。
当其中一个进程退出或修改页面时,我们不能直接 kfree 物理页,因为别人还在用。
解决方案:引用计数数组
- 结构: 定义一个全局数组
int ref_count[PHYSTOP / PGSIZE]。 - 规则:
kalloc(): 计数置 1。fork()(共享页面): 计数 +1。kfree()/ Handler (分离页面): 计数 -1。
- 释放: 只有当计数减为 0 时,才真正调用物理内存管理器的释放函数。
Lab 6 难点:
你需要修改 kernel/kalloc.c,在所有涉及物理页分配和释放的地方,正确维护这个计数器。还要注意并发锁(Spinlock)的问题。