一句话总结:为该进程创建内核数据结构task_struct、地址空间mm_struct、页表并创建映射关系,一定程度上还要将该进程的代码和数据加载进内存
以下是对上面的解释:
首先,fork创建子进程,是不是操作系统里多了一个进程?是的!
进程=内核数据结构(操作系统维护)+进程代码和数据(一般从磁盘中来,也就是你的c/c++程序,加载之后的结果)
进程调用fork,当控制转移到内核中的fork代码后,内核做:
- 分配新的内存块和内核数据结构给子进程
- 将父进程部分数据结构内容拷贝至子进程
- 添加子进程到系统进程列表当中
- fork返回,开始调度器调度
创建子进程,给子进程分配对应的内核结构,必须子进程自己独有了,因为进程具有独立性!理论上,子进程也要有自己的代码和数据!可是一般而言,我们没有加载的过程,也就是说,子进程没有自己的代码和数据!!所以子进程只能“使用”父进程的代码和数据!
代码:都是不可被写的,只能读取,所以父子共享,没有问题!
数据:可能被修改,所以必须分离!
OS为何要选择写时拷贝的技术,对父子进程进行分离
1.用的时候,再给你分配,是高效使用内存的一种表现
2.OS无法在代码执行前预知哪些空间会被访问