一、fork 的实现
fork 利用老进程克隆出一个新进程并使新进程执行,新进程之所以能够执行,本质上是它具备程序体,这其中包括代码和数据等资源。因此 fork 就是把某个进程的全部资源复制了一份,然后让处理器的 cs:eip
寄存器指向新进程的指令部分。
因此 fork 要分两步,先复制进程资源,然后跳过去执行。
如下列举出我们的操作系统中进程的资源:
- 进程的 pcb,即 task_struct
- 程序体,即代码段、数据段等,这是进程的实体
- 用户栈,编译器需要在栈中创建局部变量,并且函数调用也离不开栈
- 内核栈,进入内核态时,一方面要用它来保存上下文环境,另一方面的作用和用户栈一样
- 虚拟地址池:每个进程拥有独立的内存空间,其虚拟地址是用虚拟地址池来管理的
- 页表:让进程拥有独立的内存空间