fork()的底层实现机制

本文探讨了Linux下fork()函数的底层实现,涉及clone()、do_fork()和copy_process()等关键步骤。在创建子进程时,会分配新的PID,复制进程描述符PCB,包括内核栈、thread_info结构,并初始化其他数据结构。子进程会与父进程共享大部分数据,但会设置自己的状态和一些特定成员。在成功创建后,子进程通常先于父进程执行,以优化exec()的性能。
摘要由CSDN通过智能技术生成

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()函数,这样可以避免写时拷贝的额外开销,如果父进程首先执行的话,有可能会开始向地址空间写入。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值