fork创建进程的步骤
我们都知道,在Linux中调用fork()函数,会创建一个子进程,那么在创建这个子进程的过程中,发生了些什么事情?
首先,我们要知道,fork()函数其实是调用发起_fork()系统调用,控制权由用户态转为内核态,
内核会分配新的内存块和内核数据结构给子进程(也就是PCB task_struct结构体),
然后内核会将父进程的部分数据内容以二进制形式拷贝到子进程,
下来再将所谓的子进程PCB加入到管理链表中(操作系统管理进程就是将程序用PCB描述,用链式结构进行管理),
然后从内核态返回用户态(父进程fork返回进程pid,子进程返回0),
后开始调度器调度。
但是我们要注意一点,fork之前父进程独立执行,fork之后父子进程分别执行自己的执行流,但是谁先执行由调度器调度。
这里还有一点需要注意,当子进程刚被创建出来,父子进程不再写入的时候,父子进程是数据共享一份,代码独有,但是当有任意一方试图写入数据的时候,便已写时拷贝的方式各自拥有一份数据
这就是所谓的写时拷贝。
当然当然,fork()也有可能调用失败,fork()调用失败的理由也就这两种?
系统中有太多的进程,资源不够
实际用户的进程超过了限制