Lazy Allocation

这一章讲的是懒分配。什么是懒分配呢?就是在用户通过 sbrk 向 OS 申请内存的时候,操作系统仅仅增加 p->sz (即虚拟内存大小)而不实际分配物理内存,直到用户访问那块未分配的物理内存导致页错误时,由异常处理程序来做实际的分配与映射,相当于把分配物理内存这件事推迟了!

Lazy allocation 的好处:程序员过量申请内存,而实际使用的内存却很少的情况是十分常见的,使用懒分配就能很好的减少因这种情况导致的物理内存的浪费。

Lazy allocation 依赖于:缺页异常机制。这个异常是由硬件发现的!当 CPU 将虚拟地址 va 传递给 MMU 进行地址转换的时候,MMU 就会发现 va 对于的 PTE 的有效位为 0,则触发一个缺页异常。

实现思路:

  1. 修改 sys_sbrk 系统调用函数,每次用户申请内存时就仅仅增加虚拟内存大小(即 p->sz)而不做实际物理内存分配。在用户释放内存的时候,去做释放物理内存以及解除映射的逻辑。
  2. 在 usertrap 中添加缺页异常处理逻辑。
  3. 在 fork 中会调用 uvmcopy 时,父进程的有些内存可能还没有做映射呢,所以也要对 uvmcopy 就行修改。
  4. 在进行 uvmunmap 的时候遇到无效页则跳过。

这一章还是很简单的,没什么需要重点记录的。。。