fork介绍,返回值问题,写时拷贝,进程切换,子进程开始执行的位置,子进程的用途

news2024/11/15 5:57:30

目录

fork

介绍

fork的返回值问题

介绍

fork()时,系统要做什么 

数据是否要独立 

如果共享的话,就会出现问题!

写时拷贝 

引入

介绍

举例(fork返回值)

fork返回的值是什么 

创建失败的原因

子进程执行位置从哪里开始

引入

进程切换

子进程执行的位置

子进程的用途


fork

介绍

  • fork()函数是一个系统调用,用于创建一个新的进程
  • 它会复制当前进程的内容,并在新进程中运行,当前进程是新进程的父进程,从而使父进程和子进程可以并行执行
  • 各自有自己的独立地址空间,但它们可以共享一些资源,如文件描述符
  • 头文件:<unistd.h>

fork的返回值问题

介绍

 

  • 当我们运行起来这个程序时,我们会发现,我们已经成功创建出了子进程(因为有两个pid被打印出来,并且其中一个是另一个的父亲)
  • 但是,我们仔细观察观察,似乎ret这个变量似乎有不同的值
  • 因为我们看到它可以同时执行if 和 else的内容,也就是说,在两个进程中,实际上ret的值是不同的
  • 这是为什么呢?

 

fork()时,系统要做什么 

  • 首先明确: 进程 = 内核数据结构(os来分配) + 进程代码和数据(一般从磁盘中来)

  • 执行fork,也就是创建了一个新的进程,只不过这个新进程有点特殊,数据几乎全部都继承自创建自己的父进程
  • 控制权转移到内核中后(os会为子进程分配空间,提供初始值)
  • 从fork()函数的返回值开始,就开始并行执行两个进程啦

数据是否要独立 

  • 因为进程具有独立性,所以子进程也得有自己的代码和数据
  • 但是我们没有加载内存的过程,它也就没有自己的代码和数据,就可以和父进程共享使用
  • 代码共享没有什么问题,因为不可更改,都是只读
  • 但是!!数据可不能共享,它是可写的!
  • 如果共享的话,就会出现问题!
  • 一般创建子进程就是为了和父进程执行不同的操作
  • 如果其中一个变量一修改,另一个进程也会受到影响的话,未免也太挫了,也不满足独立性
  • 所以!数据必须分离!!

写时拷贝 

引入

虽然数据要分离,但是子进程用不到的那些数据还有必要再拷贝一份吗?

  • 显然是没有的
  • 这样的情况下,共享也是没有问题的
  • (这样的例子可以在c语言中看到,比如两个指针指向同一个常量字符串,编译器也不会傻到开辟两份空间存储内容一样的字符串)
  • 因此,只有将来会被父/子进程写入的数据,才值得被拷贝
介绍
  • 但是,其实os也无法知道哪些数据会被写入,提前拷贝了也不会立马使用(相当于占着茅坑不拉屎)
  • 所以,os选择了写时拷贝技术来将数据分离
举例(fork返回值)
  • 所以前面的fork返回值问题,实际上返回值接收的这一过程就是写入
  • 所以发生了写时拷贝
  • 父子进程这一变量存在两份,但虚拟地址并没有改变,也就导致了我们看到的结果
  • 但是可以通过不同的页表映射,从而找到实际的物理地址

fork返回的值是什么 

虽然我们已经知道了两个进程中的ret不一样,但为什么会不一样呢?

  • 是因为fork()在不同进程中返回了不同的值
  • fork()在父进程中返回子进程的进程pid(该值一般大于0),而在子进程中返回0
  • fork的返回值由os控制
  • 它将子进程的pid返回给父进程,以便父进程可以管理子进程,然后继续下面的代码
  • 子进程返回0,用于区分子进程
  • 如果父进程收到-1,则代表进程创建失败

创建失败的原因

  • 创建内存是需要使用内存资源的
  • 如果当前系统有太多进程,内存资源不足时,os就可能不让你继续创建了
  • 而且作为一个用户,可拥有的进程数是一定的

子进程执行位置从哪里开始

引入

我们其实还会发现,在fork之前的语句,子进程并没有执行:

我们会发现,在fork之前的那句打印只出现了一次,说明子进程是没有执行那个语句的

可以说明 -- 子进程并不是从头开始执行程序的

那子进程从哪里开始执行呢?

进程切换

  • cpu使用进程切换的策略执行语句
  • 并且要保证每个进程下次来的时候,必须从之前的位置继续运行(而不是重新来过,不然前面就白执行了)
  • 所以cpu必须要有对应的寄存器数据(EIP  ,  程序计数器(pc指针)),来记录当前运行进程的执行位置
  • cpu执行指令靠的就是EIP中的地址 (地址+指令长度=下一条指令地址)
  • 每个进程走的时候,带走这份数据,下次来的时候再给寄存器,就可以实现想要的效果啦
  • (寄存器数据也就是进程的上下文数据)

子进程执行的位置

  • 子进程成功创建的时候,恰好为fork该执行return指令的时候
  • 因为当执行到return时,就说明它的主要功能已经实现,也就是子进程已经创建出来了
  • 它里面的pc也就继承自父进程的进度(return的那里),他就认为自己的EIP起始值就是return指令的地址
  • 所以子进程就从return开始执行
  • 也可以通过这个理论,修改子进程的pc值

子进程的用途

就 -- 要么子承父业,要么自己独自发展

 

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

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

相关文章

SAP-部分字段变更

在SAP中部分字段是可以自行调整的&#xff0c;例如下图 这个字段是客户组1&#xff0c;已经被改成一级经理&#xff0c;现在来操作改回客户组1 首先选择字段点击F1-技术信息-数据元素&#xff08;双击&#xff09; . . 保存&#xff0c;返回&#xff0c;激活&#xff0c;返…

计算方法 期末总结

思维导图 绪论 算法的性质&#xff1a; 有穷性、确切性、有输入输出、可行性 算法的描述方法&#xff1a; 自然语言、伪代码、流程图、N-S流程图 算法设计思想&#xff1a; 化大为小的缩减技术&#xff1a;二分法化难为易的校正技术&#xff1a;开方法化粗为精的松弛技术&a…

听GPT 讲Rust源代码--src/tools(2)

题图来自AI生成 File: rust/src/tools/rust-installer/src/util.rs 在Rust源代码中&#xff0c;rust/src/tools/rust-installer/src/util.rs文件是安装程序的一个辅助文件&#xff0c;它提供了一些实用函数和结构体来处理安装过程中需要的一些操作。 这个文件中定义了几个结构体…

本地websocket服务端暴露至公网访问【cpolar内网穿透】

本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…

香港科技大学广州|先进材料学域博士招生宣讲会—华中科技大学大学专场!!!(暨全额奖学金政策)

“跨学科融合创新&#xff0c;引领新兴与未来行业的突破与发展——先进材料学域” 世界一流的新型可持续材料创新研究 夯实的先进材料领域国际学术影响力 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; …

力扣:178. 分数排名(Python3)

题目&#xff1a; 表: Scores ---------------------- | Column Name | Type | ---------------------- | id | int | | score | decimal | ---------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都包含了一场比赛的分数。Score …

力扣236. 二叉树的最近公共祖先(java DFS解法)

Problem: 236. 二叉树的最近公共祖先 文章目录 题目描述思路解题方法复杂度Code 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&am…

3、如何从0到1去建设数据仓库

1、数仓实施过程 1.1 数据调研 数据调研包括&#xff1a;业务调研、需求调研 业务调研 需要调研企业内有哪些业务线、业务线的业务是否还有相同点和差异点 各个业务线有哪些业务模块&#xff0c;每个模型下有哪些业务流程&#xff0c;每个流程下产生的数据 是怎样存储的 业务调…

5.1 PBR基础 BRDF介绍

基于物理的渲染&#xff08;Physically Based Rendering&#xff0c;PBR&#xff09;是指使用基于物理原理和微平面理论建模的着色/光照模型&#xff0c;以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。 一、反射率方程 理论基础放在参考链接里。 直接开始…

登陆页面模板

简单好看的登陆页面 vue项目代码 可忽略js部分 先来个效果图 <template><div class"login"><div class"content"><p >账户密码登录</p><div class"unit"><label class"label">用户名</…

Vocoder,声码器详解——语音信号处理学习(十)

参考文献&#xff1a; [1] Vocoder (由助教許博竣同學講授)哔哩哔哩bilibili [2] Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. arXiv preprint arXiv:1609.03499, 2016. [3] https://deepmind.com/blog/article/wavenet-generative-mode…

【数据结构/C++】线性表_双链表基本操作

#include <iostream> using namespace std; typedef int ElemType; // 3. 双链表 typedef struct DNode {ElemType data;struct DNode *prior, *next; } DNode, *DLinkList; // 初始化带头结点 bool InitDNodeList(DLinkList &L) {L (DNode *)malloc(sizeof(DNode))…

Flutter 父子组件通信

在Flutter 中父组件调用子组件的方法可以通过GlobalKey实现&#xff0c;而子组件调用父组件方法可以通过回调函数实现。 父组件 class _MyHomePageState extends State<MyHomePage> {final GlobalKey<LoadPencilState> loadPencilKey GlobalKey<LoadPencilSt…

千梦网创:创业,一场游戏一场梦

创业这件事就好比一场养成类游戏&#xff0c;而我们自己就是游戏主角。 这个游戏有一个特殊之处在于&#xff1a;SSS级装备有穿戴等级设定&#xff0c;就算你氪重金买到了一把神器&#xff0c;自身阅历不够也根本无法发挥它的强大威力而只能当个装饰。 这就要求我们真正沉浸在…

react中虚拟dom,diff,fiber - 初级了解

借鉴&#xff1a; 「React深入」一文吃透虚拟DOM和diff算法 - 掘金 (juejin.cn) 虚拟dom、fiber、渲染dom、dom-diff - 掘金 (juejin.cn) 未阅读源码&#xff0c;了解层面&#xff0c;后续可以深入了解 1.虚拟DOM ①.结构上&#xff1a;虚拟DOM比真实DOM轻很多 ②.操作上&…

每日汇评:黄金测试2000美元水平遭到拒绝,为下跌留下了空间

黄金在心理关键的2000美元水平失去了上升动力&#xff1b; 美元指数上涨持续&#xff0c;同时国债收益率反弹&#xff0c;都对黄金价格的上涨构成压力&#xff1b; 美国即将迎来感恩节假期&#xff0c;意味着明天和周五流动性较低&#xff1b; 黄金价格继续在每盎司2000美元以上…

Android二维码扫描开源库 - BGAQRCode-Android

目录 ● 功能介绍 ● 常见问题 ● 效果图与示例 apk ● Gradle 依赖 ● 布局文件 ● 自定义属性说明 ● 接口说明 ● 下载源码 功能介绍 根据之前公司的产品需求&#xff0c;参考 barcodescanner 改的&#xff0c;希望能帮助到有生成二维码、扫描二维码、识别图片二维码等需求…

centos7上用docker部署redis

1. 下载redis镜像 docker pull redis docker images # 查看镜像是否下载成功2. 安装redis容器 2.1 先准备好配置文件redis.conf vi /data/redis/redis.conf写入配置信息&#xff0c;appendonly yes&#xff0c;如果需要给redis配置密码&#xff0c;可以写入requirepass root…

DDoS攻击和CC攻击有什么不同之处?

DDoS是针对服务器IP发起&#xff0c;CC攻击针对的是业务端口。DDoS攻击打的是网站的服务器&#xff0c;而CC攻击是针对网站的页面攻击&#xff0c;用术语来说就是&#xff0c;一个是WEB网络层拒绝服务攻击&#xff08;DDoS&#xff09;&#xff0c;一个是WEB应用层拒绝服务攻击…

C语言从入门到实战——数组和指针的强化练习题

数组和指针的强化练习题 前言1. sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2. 数组和指针笔试题解析2.1 一维数组2.2 字符数组2.3 二维数组 3. 指针运算笔试题解析3.1 题目1&#xff1a;3.2 题目23.3 题目33.4 题目43.5 题目53.6 题目63.7 题目7 前言…