linux-创建子进程的过程与原理(fork讲解)

news2024/10/6 4:05:18

        我们知道,子进程可以被命令行创建,被fork函数创建,但是子进程创建了什么呢,是完全拷贝父进程函数?还是继承父进程数据呢?

首先我们要知道,进程的构成:进程=内核数据结构+可运行程序载入的代码和执行过程产生数据与部分属性数据。

 

        子进程也是进程,其实在cpu的角度来看,就是在数据结构上多了一个task_struct结点,那么PCB一定是多了一个。那么在结点的的角度来说,就是讲以父进程的PCB进程属性数据为模板拷贝了一份作为子进程的PCB。

那么问题来了,既然PBC是父进程拷贝来的,那么代码和数据是不是也要拷贝呢?

这里代码确实是父子进程共享的,为什么呢?两个原因,首先在进程载入内存中的代码区,这个区域与常量区,在内存期间代码是不可被修改的,如果每创建一个子进程占用内存代码区一部分资源,这是非常浪费内存资源的,所以操作系统在创建子进程时候,使得子进程与其父进程共享一份代码。

谢谢你的阅读 

那么数据是否共享呢?其实在创建子进程的过程中数据是共享的 

但是到了后续,一旦父进程或子进程进行数据写入时候,这时候数据必须分开了。

会在数据写入前拷贝一份数据,然后让父进程数据独立,拷贝数据归于子进程

这个过程我们成为:写时拷贝(在进程改变数据段数据前,会发生拷贝,拷贝后才会写入)

为什么要分开数据段呢?应为如果父子代码和数据段一样的,那么他们的工作都是一样的,这是没有任何意义的。

总结:在代码创建的时候,子进程的内核数据结构是拷贝父进程的,而代码段父子进程共享,然后数据段的内容,在未发生写入时候父子共享,在发生写入时拷贝数据,子进程数据信息独立(写时拷贝)。

这里有个疑点,既然代码段一样,那么怎么使得父子进程做不同的事情呢?忘记了吗fork其实是一个函数

int main()
{
    //.......
    int ret=fork();//pid_i == int
    //.......
    return 0;
}

 不卖关子了!

当进程创建失败:返回值负数(ret<0)

当进程创建成功:子进程返回值为0(ret==0)

                             父进程返回值为子进程pid (ret==子pid)子进程pid>0

所以在有创建子进程的进程代码会有if...else...

int main()
{
    //.......
    int ret=fork();//pid_i == int
    if(ret>0)//父进程执行
    {
        //.........
    }
    else if(ret == 0)  //子进程执行
    {
        //.........
    }
    else  //进程创建失败执行
    {
        //.........
    }
    //.......
    return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二维差分【算法推导,图文讲解清晰】

798. 差分矩阵 - AcWing题库 算法推导 二维差分相对一维差分会复杂一点&#xff0c;而且还要结合二维前缀和的一些细节处理 A、B数组角色问题 在差分思想中&#xff0c;构造并不是那么重要&#xff0c;而是其中A、B数组的角色。 我们假想存在一个数组B&#xff0c;输入的A…

论文阅读《NeRF-Supervised Deep Stereo》

论文地址&#xff1a;https://arxiv.org/pdf/2303.17603.pdf 源码地址&#xff1a;https://nerfstereo.github.io/ 概述 针对深度估计的标签数据难以获取&#xff0c;自监督方法在病态&#xff08;遮挡、非朗伯面&#xff09;区域的表现差&#xff0c;跨域泛化能力弱的问题&…

【jvm系列-06】深入理解对象的实例化、内存布局和访问定位

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

Vue——组件基础

目录 定义一个组件​ 使用组件​ 传递 props​ 监听事件​ 通过插槽来分配内容​ 动态组件​ DOM 模板解析注意事项​ 大小写区分​ 闭合标签​ 元素位置限制​ 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应…

Learning to summarize from human feedback导读(1)

总结&#xff1a; &#xff08;1&#xff09;生成摘要等模型&#xff0c;虽然有评估方法&#xff0c;但是人类总结的质量依旧难以相比 总结&#xff1a; &#xff08;1&#xff09;在各种NLP任务中&#xff0c;大规模语言模型的预训练以及取得了很高的性能 &#xff08;2&am…

PHP快速入门09-正则相关,附一定要学会的20个高频使用案例

文章目录前言一、正则表达式介绍二、正则高频案例20个2.1 检查字符串是否以字母开头2.2 检查字符串是否以数字开头2.3 检查字符串是否包含特定字符2.4 检查字符串是否以特定字符结尾2.5 检查字符串是否为纯数字2.6 检查字符串是否为纯字母2.7 检查字符串是否为有效的电子邮件地…

Bean对象的作用域和生命周期

文章目录&#xff1a;一.Bean的作用域 (1)Bean作用域的含义 &#xff08;2)Bean的6种作用域 二.Bean的生命周期&#xff08;1&#xff09;开辟内存空间 &#xff08;2&#xff09; 属性注入 &#xff08;3&#xff09;初始化 &#xff08;4&#xff09;使用Bean &#xff08;…

【CSDN|每日一练】运输石油

目录 运行结果题目描述输入描述:输出描述:示例代码结语运行结果 题目描述 某石油公司需要向A、B两地运输石油。 两地的需求量不同,而一辆车只能装载一定量的石油。 经过计算A地需要a辆车,B地需要b辆车运输才能满足需求。 现在一共有n辆车分布在各地,每辆车前往A、B两地…

HFSS一些使用技巧总结

1. 快捷键&#xff1a; CTRLH&#xff0c;隐藏选择的object、face 字母E&#xff0c;选择edge&#xff08;线&#xff09; alt左键双击九个区域&#xff0c;切换9个不同的视角&#xff08;与789组合使用) 2. 复制&#xff1a; 这样的复制好处在于&#xff1a;复制完的物体相…

使用Excel打造一款个人日志系统

写在前面 我很多年前看过晨间日志的奇迹这一本书&#xff0c;我深受启发&#xff0c;这本书的中心思想就是通过九宫格的方式写连体日志&#xff0c;自己可以方便查找而有而且有激情去完成这个日志&#xff0c;书中推荐的方法是使用excel写日志。但是自己总感觉用excel过于麻烦…

Java 源码中的 <? extends U>与 <? super L>是什么?

目录 ? extends U ? super L 总结一下: ? extends U 其中extends意思为&#xff1a;扩大;扩展;延长&#xff0c;&#xff1f;我们可以把他看作一个通配符&#xff0c;匹配所有的接口&#xff0c;U就一个泛型占位符&#xff0c;所以连在一起可联想到&#xff0c;从U…

前后端分离下的-SpringSecurity

前后端分离下的SpringSecurity 项目创建 使用SpringBoot初始化器创建SpringBoot项目 修改项目依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2…

电容笔和Apple pencil的区别是什么?好用电容笔推荐

Apple Pencil与目前市场上常见的电容笔最大的不同之处在于&#xff0c;普通电容笔并不具备苹果Pencil特有的重力压感&#xff0c;而仅仅是一种倾斜的压感。不过&#xff0c;其在其它方面的表现也很出色&#xff0c;与Apple Pencil相似&#xff0c;而且价格仅为200元。现在&…

项目管理中的冲突是什么?

项目管理中的冲突可以采取多种不同的形式。团队成员在创意愿景上存在分歧&#xff0c;与高层管理人员就期望和时间表发生争执&#xff0c;甚至与第三方供应商发生争执&#xff0c;都是项目冲突的主要例子。 冲突的常见原因是什么&#xff1f; 基于项目的组织内部冲突的典型原因…

【记录】Git连接gitee、新建仓库

学习记录1.连接gitee2.新建仓库1.连接gitee https://www.cnblogs.com/cokefentas/p/14727592.html git安装与卸载 apt-get install git apt-get remove gitgit配置 配置用户名 git config --global user.name "your name" 配置邮箱 git config --global user.email…

2023都说测试行业饱和了,为什么我们公司新招的的测试开了15K?

其实每年都有人说测试行业饱和了&#xff0c;但依旧有很多人找到了薪资不错的工作。来说说我的看法吧&#xff0c;我认为不用担心测试会饱和的问题&#xff0c;我们人口基数大&#xff0c;任何一个行业都有竞争&#xff0c;这是非常正常的情况。而且在有技术能力的人面前永远没…

Vue3通透教程【十一】初探TypeScript

文章目录&#x1f31f; 写在前面&#x1f31f; TypeScript是什么&#xff1f;&#x1f31f;TypeScript 增加了什么&#xff1f;&#x1f31f;TypeScript 初体验&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue …

什么是进程,线程,协程

一.进程1.简介计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序是运行于操作系统之上…

十分钟验证一个轻量化车联网解决方案

智能网联汽车在车联网的应用上&#xff0c;通常是以智能传感器、物联网、GIS技术为基础&#xff0c;结合大数据、人工智能技术&#xff0c;通过OT&#xff08;Operation tecnology&#xff09;和IT&#xff08;information tecnology&#xff09;融合的方式&#xff0c;实现智能…

使用Ubuntu22.04搭建k8s环境和一些k8s基础知识

minikube搭建 基本环境 我使用virtualBox构建的ubuntu&#xff0c;选择4核4G内存minikube是一个K8S集群模拟器&#xff0c;可以快速构建一个单节点的集群&#xff0c;用于在本地测试和开发首先使用官方脚本安装docker curl -fsSL https://test.docker.com -o test-docker.sh…