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

文章目录

  • 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.mzph.cn/news/86202.shtml

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

相关文章

批量、在线学习, 参数、非参数学习

批量学习(Batch Learning)和在线学习(Online Learning) 批量学习 批量学习的概念非常容易理解,我们之前介绍的许多机器学习算法,如果没有特殊说明,都可以采用批量学习的方式。批量学习的过程通…

iOS应用中的内存泄漏问题解决

解决iOS应用中的内存泄漏问题是非常重要的,因为内存泄漏可能导致应用变得缓慢或不稳定。以下是一些解决iOS内存泄漏问题的工具和方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 工具&…

SQLAlchemy Oracle Database 23c Free 集成之旅

SQLAlchemy & Oracle Database 23c Free 集成之旅 1. SQLAlchemy 是什么2. Oracle Database 23c Free 是什么3. 运行 Oracle Database 23c Free4. 学习 SQLAlchemy 统一教程4-1. 安装依赖库4-2. 建立连接 - 引擎4-3. 使用事务和 DBAPI4-3-1. 获取连接4-3-2. 提交更改4-3-3.…

【PowerQuery】Python自动刷新本地数据

Python数据刷新是开发爱好者和开发人员开发的PowerBI刷新模块进行数据刷新的手段,Python进行数据刷新是通过刷新PowerBI Desktop 的模式进行数据刷新。目前常用的Python的数据刷新模块是PbixRefresher,图为相关的模块和版本。 由于当前的脚本基于英文版本的PowerBI Desktop进…

【100天精通Python】Day69:Python可视化_实战:导航定位中预测轨迹和实际轨迹的3D动画,示例+代码

目录 1. 预测的3D轨迹和实际轨迹的动画图,同时动态更新 2 真值轨迹设置为静态的,预测轨迹不断更新 3 网格的三维坐标系有旋转运动,以此全方位展示预测轨迹和真值轨迹之间的空间关系 1. 预测的3D轨迹和实际轨迹的动画图,同时动态更…

vivo面试-Java

一、JAVA八股 1、Java实现线程的三种方式 (1) 继承 Thread 类: 创建一个新类,该类继承自Thread类,并重写run方法。然后创建该类的实例,并调用它的start方法来启动线程。 public class MyThread extends Thread {public void r…

【owt】 Intel® Media SDK for Windows: MSDK2021R1

https://www.intel.com/content/www/us/en/developer/articles/tool/media-sdk.html官方网不提供下载了: 2021地址 直接下载: MSDK2021R1.exe老版本 Intel Media SDK(Windows版本) 大神的介绍:owt-client-native 需要 https://github.com/open-webrtc-toolkit/owt-client…

罗德里格斯公式

1.点乘 A ⃗ ⋅ B ⃗ ∣ A ⃗ ∣ ∣ B ⃗ ∣ c o s ⟨ A ⃗ , B ⃗ ⟩ \vec{A} \cdot \vec{B} \left | \vec{A} \right | \left | \vec{B} \right | cos\left \langle \vec{A}, \vec{B} \right \rangle A ⋅B ​A ​ ​B ​cos⟨A ,B ⟩ 对应几何意义:向量 A ⃗…

面向使用者的git与gerrit相关笔记

git与gerrit相关笔记 前言一、gerrit是什么?二、一些配置1.先配置全局email 和name2.gerrit配置ssh key3.可能遇到的问题 三、提交代码和合并冲突常用Git命令三件套严格的要求 总结 前言 本文是介绍什么是gerrit和工作中git与gerrit相关的命令来避免一些提交代码的…

05_CSS进阶技巧

1 CSS 规范 遵循以下顺序 布局定位属性:display/position/float/clear/visibility/overflow(建议 display 第一个写)自身属性:width/height/margin/padding/border/background文本属性:color/font/text-decoraction/…

EMQX Enterprise 5.2 发布:Flow 设计器,Amazon Kinesis,Azure Event Hubs

EMQX Enterprise 5.2.0 版本现已正式发布! 新版本带来了一系列重磅更新,最令人瞩目的是可拖拽的可视化 Flow 设计器,它可以帮助企业快速创建、测试和部署数据集成。同时,我们新增了对 Amazon Kinesis 和 Azure Event Hubs 的支持…

VMware安装CentOS Stream 8以及JDK和Docker

一、下载镜像源 地址:https://developer.aliyun.com/mirror/?spma2c6h.25603864.0.0.285b32d48O2G8Y 二、安装配置 配置项 一共有以下这些,其中软件、软件选择 、安装目的地、网络主机名需要讲一下,其他都简单,自行设置即可。 …

电脑出现丢失msvcp71.dll的解决方法_常见msvcp71.dll解决方法

当电脑提示“找不到 msvcp71.dll”时,意味着您的系统缺少这个重要的动态链接库文件。msvcp71.dll 是 Visual Studio 2010 运行时所需的一个组件,因此如果您安装了 Visual Studio 2010 或更高版本,那么您很可能会遇到这个问题。以下是解决这个…

uni-app实现web-view图片长按下载

<template><view><web-view :webview-styles"webviewStyles" :src"webUrl"></web-view></view> </template> uniapp的web-view中图片无法长按保存&#xff0c;IOS下是正常的&#xff0c;但是Android下长按无反应 解…

Spring Cloud Alibaba Gateway 全链路跟踪TraceId日志

前言 凡是文中需要注册到nacos的都需要这个jar包 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>凡是使用config jar包的都需要写bootstrap.prop…

ipad触控笔有必要买原装吗?ipad2023手写笔推荐

目前&#xff0c;在无纸教学、无纸办公的大背景下&#xff0c;电容笔得到了广泛的关注。只是&#xff0c;对于这两支电容笔的不同之处&#xff0c;不少人并不是很清楚。其实这两种电容笔都很好区分&#xff0c;第一种是主动电容笔&#xff0c;也就是我们常用的电容式屏幕&#…

[JAVAee]Spring MVC

目录 Spring MVC框架 MVC Spring MVC的功能 用户与程序的连接 RequestMapping 指定为Get请求 指定为Post请求 获取参数 单个参数 表单传递多个参数 传递对象 后端参数重命名(后端参数映射) 设置参数必传/非必传 获取JSON对象 获取URL中的参数 上传文件 获取…

十六、MySql的MVCC机制CONNECT(收官!)

文章目录 一、数据库并发的场景有三种&#xff1a;二、读-写&#xff08;一&#xff09;3个记录隐藏列字段&#xff08;二&#xff09;undo 日志&#xff08;三&#xff09;模拟 MVCC&#xff08;四&#xff09;一些思考&#xff08;五&#xff09;Read View 一、数据库并发的场…

【深度学习】Pytorch 系列教程(十二):PyTorch数据结构:4、数据集(Dataset)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 4、数据集&#xff08;Dataset&#xff09; 随机洗牌 一、前言 Ch…