【lesson10】fork创建进程的现象解答

news2024/11/19 1:29:42

文章目录

  • fork现象
  • fork问题

fork现象

我们先来看一段代码。
在这里插入图片描述
大家觉得这段代码的printf会打印几次?
结果:
在这里插入图片描述
我们可以清楚的看到,第二个printf打印了2次。
我们再来看一段不可思议的代码:
在这里插入图片描述
运行结果:
在这里插入图片描述
我们可以看到这res竟然有两个值。
从上面我们可以得出结论,fork之后变成了两个进程一个是父进程,一个是子进程。
代码证明:
在这里插入图片描述

运行结果:
在这里插入图片描述
我们可以看到确实fork之后变成了两个进程。

由此我们可以的出结论:fork之后的代码是父子共享的,所以才会出现上面printf会被打印两次的现象。

我们创建子进程出来就是为了执行不同的代码逻辑,如果代码是共享的我们该如何执行不同的代码逻辑呢?
用以下方法解决:
之前我们学过fork在子进程和父进程中的返回值是不同的
父进程:返回子进程pid
子进程:返回0
创建子进程失败:返回-1

接下来就是解决上面问题的方法:
用分支语句解决。
在这里插入图片描述
运行结果:
在这里插入图片描述
我们可以看到确实解决了上面的问题。
我们让他们一直循环,看两个进程会不会同时进行
在这里插入图片描述
运行结果:
在这里插入图片描述
我们在用监测指令,查看两个进程:
在这里插入图片描述
我们可以看到Linux中确实存在2个这样的进程,上面是父进程,下面是子进程。
上面说明了:fork之后有两个不同的执行流,各自ret在父子进程中是不一样的。

fork问题

问题一为什么一份C语言代码,其中同一个变量会有不同的值?
下篇博客讲解
问题二为什么给子进程返回的是0,给父进程返回的是子进程的pid
首先我们会理解一个事情:
父进程和子进程的比例一定是一比多的,我们可以理解为一个父亲可以有多个儿子,但是一个儿子一定只有一个父亲。
父进程 : 子进程 = 1 : n
其次举个例子
比如张三有四个孩子子,为了区分他们,分别给孩子们取了名字,小明,小花,小华和小美。有一天小明的老师把张三叫到学校,说小明这次考试不好等等。张三回到家会叫小名你给我过来,还是会叫孩子你给我过来,肯定是叫名字因为有四个孩子如果叫孩子你给我过来歧义太大。
最后推广:
所以上面的例子推广到fork中,就明白为什么fork给父进程返回的是子进程的pid,是为了更好的区分他们。
问题三:为什么fork会有两个返回值?
首先我们要理解一个问题:
创建进程的时候,OS要做什么?
本质就是系统多了一个进程,所以OS要新建一个PCB(task_struc)来管理进程。
在这里插入图片描述
子进程PCB(task_struct)结构体的内部属性,要以父进程的PCB结构体为模板创建。
例子:比如你和你父母的DNA一定是相似度很高的。
其次我们要理解:
当fork已经准备return了,fork的核心代码执行完了吗?
我们都知道进程是用PCB结构体管理的,而PCB结构体是存放在链表中的,是以链表的形式管理起来的
在这里插入图片描述
那么CPU要调度进程是直接从链表中调度进程吗?
不是的,在Linux中还存在一种运行队列,当进程要被调度是先要被加载到运行队列中。
在这里插入图片描述
当进程加载到运行队列中执行完就会被干掉。
在这里插入图片描述

所以操作系统和CPU运行某个进程,本质从PCB结构体形成的队列中挑选一个PCB结构体,来执行它的代码和数据,进程调度变成了在PCB结构体的队列中选择一个进程的过程。
只要想到进程优先想到对应的PCB结构体。
在这里插入图片描述
而当fork准备return的时候,核心代码数据其实早已经跑完了。
当我们到return的时候其实,父进程和子进程早就已经进入到运行队列中
在这里插入图片描述
所以当运行到return时父进程和子进程分别会执行自己return语句,所以就会有两个返回值。
问题四:fork()有两个返回值,意味着会被保存两次吗?
下次博客揭晓。
问题五:父子进程被创建出来了,哪一个进程先被运行完呢?
这个并不一定,因为一个进程并不一定会一直被CPU调度,可能CPU运行个10毫秒就继续运行另一个进程
所以谁先被运行或者先运行完,由操作系统的调度器决定,不由人为决定。

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

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

相关文章

编写Dockerfile

Dockerfile 编写Dockerfile 制作 FROM java:7 MAINTAINER bunny <邮箱qq.com> ADD easybbs-web-release-1.0.jar app.jar CMD java -jar app.jar构建 docker build -f ./my_dockerfile -t app:1.0 .启动 docker rm my_app docker ps -a docker run -d -p 9000:7070 …

前端教程-总览

现已经更新完毕图中教程汇总后期收集所有教程资料整理

【考研】2023暨南大学848答案 2020-2023 计算机基础综合 830答案

&#x1f525;&#x1f525; I 仓库 还在更新&#xff0c;敬请期待 &#x1f525;暨南大学计算机848报考信息汇总仓库 仓库内有20年真题答案 https://github.com/zhanjuex/JNU_848 备用仓库 (目录可能用不了 https://xindon.coding.net/public/open/JNU_848/git/files &#x1…

基于springboot+vue的入校申报审批系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

基于Java+SpringBoot+Vue+Uniapp的美容预约平台小程序设计与实现(开题报告+任务书+源码+lw+ppt +部署文档+讲解)

文章目录 前言用户微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌…

Spring的后处理器-BeanFactoryPostprocessor

目录 Spring后处理器 Bean工厂后处理器-BeanFactoryPostProcessor 修改beanDefinition对象 添加beanDefiniton对象 方法一 方法二 自定义Component Spring后处理器 Spring后处理器是Spring对外开放的重要拓展点&#xff08;让我们可以用添加自己的逻辑&#xff09;&…

使用 PyTorch 的计算机视觉简介 (4/6)

一、说明 在本单元中&#xff0c;我们将了解卷 积神经网络&#xff08;CNN&#xff09;&#xff0c;它是专门为 计算机视觉设计的。 多层卷积层允许我们从图像中提取某些图像模式&#xff0c;池化层&#xff0c;以及在 CIFAR-10上的表现。 二、多层 CNN 在上一个单元中&#xf…

拦截|篡改|伪造.NET类库中不限于public的类和方法

大家好&#xff0c;我是沙漠尽头的狼。 本文首发于Dotnet9&#xff0c;介绍使用Lib.Harmony库拦截第三方.NET库方法&#xff0c;达到不修改其源码并能实现修改方法逻辑、预期行为的效果&#xff0c;并且不限于只拦截public访问修饰的类及方法&#xff0c;行文目录&#xff1a;…

Mysql004:用户管理

前言&#xff1a;本章节讲解的是mysql中的用户管理&#xff0c;包括&#xff08;管理数据用户&#xff09;、&#xff08;控制数据库的访问权限&#xff09;。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

P-GaN栅极HEMT开关瞬态分析中的动态栅极电容模型

标题&#xff1a;Dynamic Gate Capacitance Model for Switching Transient Analysis in P-GaN Gate HEMTs 摘要 在这项工作中&#xff0c;提出了一种用于P-GaN栅极HEMT的高效开关瞬态分析模型&#xff0c;该模型考虑了开关瞬态过程中的动态栅极电容CG(VDS, VGS)特性。同时&a…

【STM32教程】第五章 STM32的定时器

案例代码及相关资料下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwdjauj 提取码&#xff1a;jauj 1 定时器综述 1.1 定时器简介 TIM&#xff08;Timer&#xff09;定时器&#xff0c;最基本功能就是定时触发中断&#xff1…

python随手小练3

题目&#xff1a; 写出一个判断闰年的python代码&#xff1a; 闰年的条件&#xff1a; 如果N能够被4整除&#xff0c;并且不能被100整除&#xff0c;则是闰年 或者&#xff1a;N能被400整除&#xff0c;也是闰年 即&#xff1a;4年一润并且百年不润&#xff0c;每400年再润一…

前端第二课,HTML,alt,title,width/heigh,border,<a>超链接,target,tr,td,th

目录 一、title: &#x1f49b; ​二、alt&#x1f499; 三、width/heigh&#x1f49c; 四、border ❤️ 五、超链接&#x1f49a; 六、target &#x1f497; 七、tr&#x1f495; 八、td&#x1f498; 九、th&#x1f49e; 十、rowspan 一、title: &#x1f49b; 快…

漏刻有时数据可视化Echarts组件开发(29):工业图形动画

var nodes = [{nodeName: 新能源,value: [-10, 100],symbolSize: 50,symbol:image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAAB3R…

【操作系统笔记四】高速缓存

CPU 高速缓存 存储器的分层结构&#xff1a; 问题&#xff1a;为什么这种存储器层次结构行之有效呢&#xff1f; 衡量 CPU 性能的两个指标&#xff1a; 响应时间&#xff08;或执行时间&#xff09;&#xff1a;执行一条指令平均时间 吞吐量&#xff0c;就是 1 秒内 CPU 可以…

ideal 同一项目启动多实列

点击service(如果没有:点击菜单栏&#xff1a;Views -> Tool Windows -> Services&#xff1b;中文对应&#xff1a;视图 -> 工具窗口 -> 服务&#xff1b;快捷键是Alt F8&#xff0c;但是本地快捷键可能冲突&#xff0c;并未成功。) 刚创建好的窗口是空白的&…

回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于RF-Adaboost随机森林结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于RF-Adaboost随机森林结合…

Android 遍历界面所有的View

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…

基于QT实现发送http的get和post请求(post还可以实现上传文件),同时实现接收返回json数据,并对其进行解析

使用到中重要的类&#xff0c;做个简单的介绍 QNetworkAccessManager&#xff1a;这个类是QT帮我们封装好的工具类&#xff0c;主要可以用来发送Http请求 QNetworkReply&#xff1a;这个类主要用来监听发送的请求&#xff0c;并得到请求的响应结果 QHttpMultiPart&#xff1a;这…

RSD处理气象卫星数据——常用投影

李国春 气象卫星扫描刈幅宽覆盖范围广&#xff0c;在地球的不同位置可能需要不同的投影以便更好地表示这些观测数据。这与高分辨率的局地数据有很大不同&#xff0c;高分数据更倾向于用使用处理局地小范围的投影方式。本文选择性介绍几种RSD常用的适合低、中、高纬和极地地区的…