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

目录

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

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

相关文章

烫伤事件屡有发生,觅光推脱责任,称是用户操作失误

提及“双十一”“直播间”等关键词&#xff0c;人们常常将其与“低价”“薅羊毛”等字眼挂钩。而在近日&#xff0c;科技美容品牌AMIRO觅光&#xff08;下称“觅光”&#xff09;却上演了一出“反向薅羊毛”的戏码&#xff0c;因线上线下渠道相差超千元的价格差饱受争议。 自横…

camera-caps:Jetson设备上的一种实用的V4L2可视化界面

camera-caps&#xff1a;Jetson设备上的一种实用的V4L2可视化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要选择tag 5.x版本

走迷宫(BFS宽度优先搜索)

给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0 或 1&#xff0c;其中 0 表示可以走的路&#xff0c;1 表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1)处&#xff0c;已知该人每次可以向上、下、左、右任意一个方向移动…

MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; 动动你们发财的小手&#xff0c;点点关…

JMeter接口测试之文件上传

最近用JMeter做接口测试&#xff0c;频繁遇到了文件上传的接口&#xff0c;与其他一般接口的处理方式不一样&#xff0c;想着分享下&#xff0c;希望能给测试同学一点启发。 文章将围绕三个部分进行展开&#xff1a; 一、用户场景 二、接口请求参数 三、JMeter脚本编写步骤…

C语言每日一题(36)队列实现栈功能

力扣 225 用队列实现栈 题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int…

vue2系列 — 自定义指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定义指令的钩子 bind&#xff1a; 当 v-XXX 指令绑定到节点上时 触发inserted&#xff1a;被绑定元素插入父节点时调用update&#xff1a;所在组件的 VNode 更新…

使用nprogress实现请求进度条

一、安装nprogress npm i nprogress 二、 在axios的请求拦截器中使用nprogress 如果对于axios的请求和响应拦截器的使用不了解的&#xff0c;可以看这篇文章&#xff1a; axios二次封装配置请求拦截器和响应拦截器-CSDN博客 nprogress上有两个有用的方法&#xff1a; star(…

OpenStack云计算平台-Dashboard(图形化)

目录 一、安装和配置 1、安全并配置组件 2、完成安装 ​二、验证操作 一、安装和配置 1、安全并配置组件 安装软件包&#xff1a; yum install openstack-dashboard 编辑文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全国高校数据?

前言 Python是一门强大的编程语言&#xff0c;它可以用于爬取互联网上的各种数据。在这篇文章中&#xff0c;我们将学习如何使用Python爬取全国高校数据&#xff0c;并使用代理IP进行爬取。 本文主要分为以下几个部分&#xff1a; 数据来源及需求安装依赖包及导入模块爬取全…

关于禅道的安装配置以及项目管理、团队协同工作

目录 一、禅道是什么&#xff1f; 二、特点和功能 三、安装禅道 3.1 下载官网 3.2 版本考虑 3.3 禅道使用手册参考 3.4 Windows端安装禅道 四、启动禅道 4.1 访问禅道 四、禅道部分功能的使用 4.1 添加项目集 4.2 启动/关闭项目 4.3 项目计划仪表盘/阶段目标/研发…

头歌——操作系统实训总结

死锁 1、系统出现死锁时一定同时保持了四个必要条件&#xff0c;对资源采用按序分配算法后可破坏的条件是&#xff08;A&#xff09;。 A、循环等待条件B、互斥条件C、占有并等待条件D、不可抢占条件 2、资源的静态分配算法在解决死锁问题中是用于&#xff08;B&#xff09;。 …

【图论】关键路径求法c++

代码结构如下图&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用来递归求解拓扑排序&#xff0c;topologicalSort(float**, int*&, int, int, int)传参图的邻接矩阵mat与结点个数n&#xff0c;与一个引用变量数组topo&#xff0c;返回一个布尔值…

代码随想录-刷题第五天

链表题目总结 链表基本操作 对链表进行增删改查等基本操作。注意&#xff0c;很多链表的题目使用虚拟头结点操作起来会更加方便。每次对应头结点的情况都要单独处理&#xff0c;所以使用虚拟头结点的技巧&#xff0c;就可以解决这个问题。 反转链表 可以使用头插法&#xf…

Shopee本土号封号几率大吗?如何避免封号?被封号了怎么办?

Shopee是近几年热门的电商平台之一&#xff0c;即使越来越多的跨境电商涌现&#xff0c;他的地位在东南亚市场依然占据一席之地&#xff0c;也依旧吸引着需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被关停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 学习笔记 map的使用

原题 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境电商必须要海外代理IP吗?盘点五大海外代理IP

相信跨境电商人近日都为了2023的跨境黑五旺季奋战&#xff0c;而2024也即将来临&#xff0c;对于跨境人的考验一波接着一波&#xff0c;根据Adobe Analytics的数据&#xff0c;2022年黑色星期五的销售额创下91.2亿美元新高&#xff0c;网络星期的销售额同样达到创纪录的113亿美…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

ToDesk提示通道限制 - 解决方案

问题 使用ToDesk进行远程控制时&#xff0c;免费个人账号最多支持1个设备同时发起远控&#xff0c;若使用此账号同时在2个设备发起远控&#xff0c;则会提示通道限制&#xff0c;如下图&#xff1a; 解决方案 方案1&#xff1a;断开其它远控 出现通道限制弹窗时&#xff0…