给个实际例子会比较清楚一些。假设某程序的两个个体(instances)都正在执行,共享相同的 code pages(都是只读性质)。其中之一处于除错状态,使用者告诉除错器在程序某处放上一个中断点(breakpoint)。当除错器企图写入中断点指令,会触发一个 page fault(因为 code page 拥有只读属性)。操作系统一看到这个page fault,首先断定是除错器企图读内存内容,这是合法的。然而,随后「写入到共享的code page 中」的动作就不应该被允许了。系统于是会先将受影响的各页拷贝一份,并改变被除错者的 page table,使映像关系转变到这份拷贝版。一旦内存被拷贝并被映像,系统就可以让写入动作过关了。写入(中断点)的动作只影响该份拷贝内容,不影响原先内容。
"copy on write" 并不只在分享程序代码时才派上用场。在 windows nt 中,可写入的datapages 一开始也是只读属性,当应用程序对其中一个 page 写入数据,cpu 会产生 pagefault。操作系统于是把这个 page 改登记为「可读可写」。为什么要这么麻烦呢?因为如此一来内存管理器还是可以把其它只读的 data pages 共享给大家。如果稍后有人对这些 data pages 做写入动作,”copy on w