Linux内核学习—写时复制(COW)技术
写时复制技术(copy-on-write)
传统的Unix系统以一种比较统一的方式对待所有的进程:子进程复制父进程所有的资源。这种方法有一些很明显弊端:
- 将使用大量内存
- 复制操作耗费大量时间
- 通常情况下子进程不需要读或者写父进程拥有的所有资源,故该方法效率也是非常低的(复制的大量资源都没有使用)
并且,如果应用程序在进程复制后使用exec立即加载新程序,这意味着之前的复制基本是完全多余的,因为进程地址空间需要重新初始化,之前复制的数据不再需要,这导致之前做的都是无用功。
因此,现代Unix内核采用了写时复制(copy-on-write)机制避免fork时将父进程所有资源都复制到子进程。
该技术的核心思想是:只有在不得不复制内容时才去复制内容(tips:感觉操作系统中很多技术都是用到了该思想,如果一个操作的消耗比较大,那么就应该尽可能晚一点少一点该操作。例如:识别dirty bit的 extended clock页替换算法,还有很多操作系统在换页机制上均采用的是lazy换页,也就是不得不换页才换)
具体操作:当fork时只复制页表,因此fork之后父子进程的地址空间指向的是相同的物理内存页。如果父子进程都不需要修改彼此的页(也就是只读),则共享即可满足,因此将对应的页都标记为只读访问。只有两者中有一个进程要进行修改相应的物理页(也就是写操作),则会引发页错误。内核检测该页错误是否是因为对只读页面进行写操作引发的,如果是的话则处理该异常:拷贝该页面的内容到一个新的物理页&#