fork()底层实现机制
fork(),vfork(),_clone()都是通过调用clone(),然后由clone()去调用do_fork()。
1.
:代表着进程描述符,即进程控制块PCB。
:为子进程分配新的pid参数。最大值默认为32768,short int短整型的最大值,它就是系统中允许同时存在的进程的最大数目。最小值即为pid重置起始点,如图:。
2.
Copy_process()创建进程描述符以及子进程执行所需要的所有其他数据结构
* 它的参数与do_fork相同。外加子进程的PID,目的是复制进程描述符,即PCB。
(1).
调用dup_task_struct为子进程获取进程描述符。为新进程创建一个内核栈,thread_info结构等信息和父进程的pcb完全相同,完成拷贝工作等。接下来,子进程的状态被设置为TASK_UNINTERRUPTIBLE(不可中断)以保证它不会投入运行。
(2).
复制其他的信息,包括文件描述符合、进行描述符等等。子进程着手使自己与父进程区别拷来。进程描述符内的许多成员都要被清0或设为初始值。进程描述符的成员值并不是继承而来的,而主要是统计信息,进程描述符中大多数的数据都是共享的。
(3).
重设新进程的pid的返回值。
(4).
让父进程和子进程平分剩余的时间片,最后copy_process()做扫尾工作并返回一个指向子进程的指针,再回到do_fork()函数,如果copy_process函数成功返回,新创建的子进程被唤醒并让其投入运行。内核有意选择子进程首先执行。因为一般子进程都会马上调用exec()函数,这样可以避免写时拷贝的额外开销,如果父进程首先执行的话,有可能会开始向地址空间写入。