扫码关注官方订阅号
认证0级讲师
先说一下fork,fork会生成一个和当前进程相同的副本,称为子进程。原进程的所有资源都以适当的方式复制到子进程,因此该系统调用之后,原来的进程就有了两个独立的实例。这两个实例的联系包括:同一组打开文件、同样的工作目录、内存中同样的数据(两个进程各有一份副本)。当然Linux使用了copy on write,也就是说只有新的进程对内存页执行write操作的时候才会复制内存页面。
具体如何完成: 首先要了解一下task_struct这个数据结构。Linux内核很多涉及进程的部分都围绕这个数据结构(数据结构定义在include/sched.h中,有兴趣去看一下)。数据结构里面的成员非常多,下面会按照几个部分介绍一下。
task_struct
fork之后,操作系统会copy当前进程的task_struct机构体,除了id号不一样之外,其余完全一样。fork之后如果没有调用exec(),那么仅仅只是生成多个当前的进程,提升并发的能力,比如说nginx。nginx的进程都是master进程fork出来的,所以他们有相同的监听句柄。至于是哪个worker进程去响应,nginx有自己的竞争方式。
exec()
fork
最后关于子进程fork自己会发生什么。请看下图:
linux启动时候只有一个init进程,剩下的题主自行理解。
fork并不算是基本函数,它调用的clone,而clone函数有参数可以进行更灵活的配置。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
先说一下fork,fork会生成一个和当前进程相同的副本,称为子进程。原进程的所有资源都以适当的方式复制到子进程,因此该系统调用之后,原来的进程就有了两个独立的实例。这两个实例的联系包括:同一组打开文件、同样的工作目录、内存中同样的数据(两个进程各有一份副本)。当然Linux使用了copy on write,也就是说只有新的进程对内存页执行write操作的时候才会复制内存页面。
具体如何完成:
首先要了解一下
task_struct
这个数据结构。Linux内核很多涉及进程的部分都围绕这个数据结构(数据结构定义在include/sched.h中,有兴趣去看一下)。数据结构里面的成员非常多,下面会按照几个部分介绍一下。fork之后,操作系统会copy当前进程的
task_struct
机构体,除了id号不一样之外,其余完全一样。fork之后如果没有调用exec()
,那么仅仅只是生成多个当前的进程,提升并发的能力,比如说nginx。nginx的进程都是master进程fork
出来的,所以他们有相同的监听句柄。至于是哪个worker进程去响应,nginx有自己的竞争方式。最后关于子进程fork自己会发生什么。请看下图:
linux启动时候只有一个init进程,剩下的题主自行理解。
fork并不算是基本函数,它调用的clone,而clone函数有参数可以进行更灵活的配置。