背景
进程的内核态、用户态
为了安全起见,用户进程不能随便执行系统级别的代码,所以进程提供了内核态和用户态两种状态。在内核态,进程拥有对于机器所有资源的权限,并且能够执行所有的内核代码。
为了隔离,用户态的进程和内核态的进程,都拥有自己的上下文,Program Counter 和堆栈。当用户态的进程触发了系统调用,就会trap到内核态,然后由OS切换PC和堆栈。
写时复制
当操作系统调用Fork创建新的进程的时候,会从父进程复制大量的数据,包括代码段,打开的文件描述符等。
这个时候如果真的去复制这些信息,那么会造成一定程度上的性能损耗。所以操作系统实际上会给子进程创建自己的页表,但是这些页表都指向父进程的页面,然后把这些页面标记为只读。

只有当父、子进程中的任意一方试图去往写保护的页面里写数据的时候,操作系统才会真正的进行页面的复制工作,然后标记这个页面是可以读写的。之后对于这个页面来说,父子进程是独立的。其他不涉及到读写冲突的,仍然是共享的父进程的页面。
