当前位置: 首页 > news >正文

Linux内核是如何创建进程?

目录

1.Linux如何创建进程

2.fork函数原理

2.1 fork函数原型

2.2 fork函数实现原理

2.3 父子进程虚拟地址空间(mm_struct)之间的关系

2.4 写时拷贝(copy-on-write)技术

2.5 父子进程如何共享文件(files_struct)

3.vfork函数原理

3.1 vfork函数原型

3.2 vfork和fork函数区别?


1.Linux如何创建进程

Linux创建进程都是通过父进程克隆的方式实现。

  • 子进程刚创建成功时,虚拟地址空间和父进程虚拟地址空间信息一样(即代码和数据都是一样)。

  • 通过调用exec家族函数可以替换虚拟地址空间信息为新的程序的信息。

图片

2.fork函数原理

2.1 fork函数原型

pid_t fork(void);

功能:创建一个新的进程。

参数:

无。

返回值:

fork函数调用一次返回两次。

  • 父进程:返回子进程PID。

  • 子进程:返回0。

  • 失败:返回-1。

2.2 fork函数实现原理

图片

2.3 父子进程虚拟地址空间(mm_struct)之间的关系

  • 父子进程各自拥有自己独立的虚拟地址空间。

  • 父子进程共享代码段(只读)。

  • 采用写时拷贝(copy-on-write)技术创建子进程虚拟地址空间。

2.4 写时拷贝(copy-on-write)技术

传统fork函数缺点:

  1. 复制子进程虚拟地址空间时,存在大量拷贝,效率很低。

  2. 子进程立马需要执行execv函数替换虚拟地址空间内容,导致上一步复制子进程虚拟地址空间变得多余。

什么是写时拷贝?

写时拷贝是指父进程在创建子进程时,只创建虚拟地址空间,不为子进程分配实际的内存,父进程和子进程之间共享相同的物理内存页面。

当父进程或者子进程对虚拟地址空间对应的内存进行修改时才会分配实际内存。

写时拷贝技术优点:

  • 节省内存开销。

  • 提高创建进程效率。

拷贝前

图片

拷贝后

图片

2.5 父子进程如何共享文件(files_struct)

图片

FD_CLOSEXEC文件标志?

子进程和父进程共享文件是一种不安全的行为,如果子进程调用exec家族函数,子进程的虚拟机制空间被新的程序替换,如果子进程还保留父进程的文件描述符表,后果很严重。

文件设置FD_CLOSEXEC文件标志后,子进程调用exec家族函数,该文件会被关闭。

如何设置FD_CLOSEXEC文件标志?

  • 方法1:open函数带上O_CLOSEXEC标志。

如:open(“file”,  O_RDWR  | O_CREAT  | O_TRUNC | O_CLOSEXEC, 0644 );

  • 方法2:fcntl函数F_SETFD操作设置。

3.vfork函数原理

3.1 vfork函数原型

pid_t vfork(void);

功能:fork函数创建一个新的子进程,该子进程与父进程共享相同的地址空间。

参数:

无。

返回值:

vfork函数调用一次返回两次。

  • 父进程:返回子进程PID。

  • 子进程:返回0。

  • 失败:返回-1。

3.2 vfork和fork函数区别?

  • vfork函数创建子进程和父进程共享地址空间。

  • 使用vfork函数创建的子进程则会暂停父进程的执行,直到子进程调用exec()或者_exit()函数退出或替换自己的地址空间。

不推荐使用vfork函数!!!

vfork函数由于子进程和父进程共享地址空间,vfork比传统fork函数效率高。随着写时复制技术出现,这个优势已经不存在了。

vfork存在不安全的行为,所以不推荐使用vfork函数。

http://www.lryc.cn/news/213851.html

相关文章:

  • IDEA 使用技巧
  • 安防监控项目---web网页通过A9控制Zigbee终端节点的风扇
  • Ubuntu 22.04 在登录界面循环
  • 【C++ 系列文章 -- 程序员考试 201805 下午场 C++ 专题 】
  • Python如何使用datetime模块进行日期和时间的操作
  • flutter之bloc使用详解
  • 记一次 .NET 某工厂无人车调度系统 线程爆高分析
  • 高等数学啃书汇总重难点(九)多元函数微分法及其应用
  • Vue3前端100个必要的知识点
  • CCS3列表和超链接样式
  • vue手机项目如何控制蓝牙连接
  • 遥遥领先,免费开源的django4-vue3项目
  • 视频平台跨网级联视频压缩解决方案
  • 利用python进行数据分析 pdf
  • Day46.算法训练
  • 基于YOLOv8模型暗夜下人脸目标检测系统(PyTorch+Pyside6+YOLOv8模型)
  • 如何在 Photoshop 中使用位图模式制作自定义音乐海报
  • 1 — NLP 的文本预处理技术
  • TypeScript之泛型
  • 一个小妙招从Prompt菜鸟秒变专家!加州大学提出PromptAgent,帮你高效使用ChatGPT!
  • Netty通信框架
  • 6西格玛质量标准: 提升业务效率的关键
  • OpenGL ES相关库加载3D 车辆模型
  • 云原生环境下JAVA应用容器JVM内存如何配置?—— 筑梦之路
  • 防雷接地测试方法完整方案
  • 【云原生-K8s】Kubernetes安全组件CIS基准kube-beach安装及使用
  • 玩家必备,2款顶级游戏录屏软件!
  • 七、W5100S/W5500+RP2040树莓派Pico<UDP 组播>
  • Wonder3D:用单张图片生成纹理网格
  • macOS 创建Flutter项目