fork的底层是调用clone函数创建,clone函数的功能是创建一个pcb,fork创建进程以及后边的创建线程本质内部调用的clone函数实现
我们知道,子进程可以被命令行创建,被fork函数创建,但是子进程创建了什么呢,是完全拷贝父进程函数?还是继承父进程数据呢?
首先我们要知道,进程的构成:进程=内核数据结构+可运行程序载入的代码和执行过程产生数据与部分属性数据。
子进程也是进程,其实在cpu的角度来看,就是在数据结构上多了一个task_struct结点,那么PCB一定是多了一个。那么在结点的的角度来说,就是讲以父进程的PCB进程属性数据为模板拷贝了一份作为子进程的PCB。
那么问题来了,既然PBC是父进程拷贝来的,那么代码和数据是不是也要拷贝呢?
这里代码确实是父子进程共享的,为什么呢?两个原因,首先在进程载入内存中的代码区,这个区域与常量区,在内存期间代码是不可被修改的,如果每创建一个子进程占用内存代码区一部分资源,这是非常浪费内存资源的,所以操作系统在创建子进程时候,使得子进程与其父进程共享一份代码。