第六章:谈谈分叉和写时复制(COW)
这篇文章详细探讨了Unix系统中的进程创建和管理,特别是
fork
系统调用和写时复制(Copy On Write, COW)机制。
1. 进程的起源:
- 所有计算机上的进程都是由一个父程序通过
fork-exec
模式创建的,除了init进程。
2. fork
系统调用:
fork
是创建新进程的基础系统调用,它克隆当前进程及其内存,并允许两个进程继续正常运行。- 新创建的进程称为“子进程”,调用
fork
的进程称为“父进程”。 fork
在父进程中返回子进程的PID,在子进程中返回0。
3. fork
的效率:
fork
通过复制旧进程的页表来创建新进程,而不是复制RAM,这使得fork
操作非常高效。
4. 写时复制(COW):
- COW机制允许父进程和子进程在没有写入尝试时共享相同的物理内存地址。
- 当任一进程尝试写入内存时,会触发硬件中断,由内核处理,复制内存页,允许写入,并重新尝试写入操作。
5. init进程:
- init进程是由内核直接设置的第一个用户空间程序,负责启动操作系统中的所有程序和服务。
- 在Unix-like系统中,杀死init进程(PID 1)将关闭操作系统环境。
6. 内核启动init进程:
- 计算机启动时,BIOS寻找启动引导程序,加载并执行它。
- 引导程序加载内核到RAM并执行。
- 内核运行初始化任务,包括设置中断处理程序、加载驱动程序、创建初始内存映射,然后启动init程序。
7. Linux中的初始化:
- 在Linux中,大部分内核初始化发生在
start_kernel
函数中。 rest_init
函数创建init进程的线程。
8. 程序的运行:
- 程序通过处理器执行内存中的指令序列来运行。
- 中断和系统调用允许程序间接访问系统资源。
9. 程序的启动:
- 内核启动后,init进程开始运行,使用
fork-exec
模式启动其他程序。 fork
创建新进程,execve
替换当前进程为新程序。
10. ELF文件和内核:
- 新程序通常是ELF文件,内核解析ELF文件以确定如何加载程序以及在虚拟内存映射中放置代码和数据。
11. 程序执行的总结:
- 程序运行在用户模式下,通过系统调用间接访问I/O。
- 内核负责加载程序的虚拟内存映射,并设置CPU的指令指针到新程序的代码起始处。
文章通过解释fork
和COW机制,帮助读者理解Unix系统中程序是如何被创建和执行的。这些机制对于确保系统的稳定性和效率至关重要。