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.mfbz.cn/a/181906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DAOS低时延与高性能RDMA网络

什么是RDMA RDMA&#xff08;Remote Direct Memory Access&#xff09;远程直接内存访问是一种技术&#xff0c;它使两台联网的计算机能够在主内存中交换数据&#xff0c;而无需依赖任何一台计算机的处理器、缓存或操作系统。与基于本地的直接内存访问 ( DMA ) 一样&#xff0c…

超级武器!深入LoadRunner性能测试流程及极速分析结果!

性能测试目的 1 什么是性能测试? 性能测试是通过性能的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 负载测试和压力测试都属于性能测试&#xff0c;两者可以结合进行。通过负载测试&#xff0c;确定在各种工作负载下系统的性能&#xff0…

Redis深入理解-Socket连接建立流程以及文件事件处理机制

Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型 一个 redis 单机&#xff0c;可以抗几百上千的并发&#xff0c;这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求&#xff0c;都需要去建立网络连接&#xff0c;同时间可能会…

Jmeter怎么实现接口关联?

用于接口测试时&#xff0c;后一个接口经常需要用到前一次接口返回的结果&#xff0c;应该如何获取前一次请求的结果值&#xff0c;应用于后一个接口呢&#xff0c;拿一个登录的例子来说明如何获取。 1、打开jmeter&#xff0c;新建一个测试计划&#xff0c;在测试计划里新建一…

利用 docker 实现JMeter分布式压测

为什么需要分布式&#xff1f; 在工作中经常需要对一些关键接口做高QPS的压测&#xff0c;JMeter是由Java 语言开发&#xff0c;没创建一个线程&#xff08;虚拟用户&#xff09;&#xff0c;JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…

量子计算概述

目录 1.量子计算介绍 2.量子计算应用 3.量子计算研究机构 1.量子计算介绍 量子计算是一种遵循量子力学规律调控量子信息单元进行计算的新型计算模式。经典计算使用2进制进行运算&#xff0c;但2进制只有0和1两种状态&#xff0c;而量子计算除了包含0和1两种状…

深入理解Spring AOP的工作流程

文章目录 引言什么是AOP&#xff1f;Spring AOP的工作原理1. JDK动态代理2. CGLIB代理 Spring AOP的注解方式Aspect注解EnableAspectJAutoProxy注解 Spring AOP的工作流程拓展应用1. 自定义注解2. 异常处理3. 切面优先级 结论 &#x1f389;深入理解Spring AOP的工作流程 ☆* o…

相机和滤镜应用程序Nevercenter CameraBag Photo mac软件特点说明

Nevercenter CameraBag Photo mac是一款相机和滤镜应用程序&#xff0c;它提供了一系列先进的滤镜、调整工具和预设&#xff0c;可以帮助用户快速地优化和编辑照片。 Nevercenter CameraBag Photo mac软件特点 1. 滤镜&#xff1a;Nevercenter CameraBag Photo提供了超过200种…

Harmony Ble蓝牙App(二)连接与发现服务

Ble蓝牙App&#xff08;二&#xff09;连接与发现服务 前言正文一、BlePeripheral回调二、连接和断连三、连接状态回调四、发现服务五、服务提供者六、显示服务七、源码 前言 在上一篇中我们进行扫描设备的处理&#xff0c;本文中进行连接和发现服务的数据处理&#xff0c;运行…

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程&#xff1a; django-apscheduler基本使用 1.安装django-apscheduler代码如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下&#xff08;示例&#xff09…

性能测试必备知识-使用MySQL存储过程构造大量数据:实例解析

在软件开发过程中&#xff0c;测试是一个不可或缺的环节。通过测试&#xff0c;我们可以发现并修复软件中的各种问题&#xff0c;提高软件的质量和稳定性。然而&#xff0c;手动编写大量的测试用例是一项耗时且容易出错的任务。为了解决这个问题&#xff0c;我们需要学会使用批…

ES ElasticSearch安装、可视化工具kibana安装

1、安装ES docker run -d --name es9200 -e "discovery.typesingle-node" -p 9200:9200 elasticsearch:7.12.1访问测试&#xff1a; http://域名:9200/ 2、安装kibana对es进行可视化操作 执行命令 docker run -d --name kibana5601 -p 5601:5601 kibana:7.1.12.修…

在线工具收集

在线工具收集 1、在线P图 https://www.photopea.com/ 一款类似于PS的在线抠图软件 ①去除图片中的文字&#xff0c;并填充背景色 第一步&#xff1a;使用矩形选中要清除的文字 第二步&#xff1a;点击编辑选择填充 第三步&#xff1a;选择内容识别&#xff0c;保留透明区域…

[MySQL] MySQL 表的增删查改

本篇文章对mysql表的增删查改进行了详细的举例说明解释。对表的增删查改简称CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09;。其中重点是对查询select语句进行了详细解释&#xff0c;并且通过多个实际例子来帮助…

物联网AI MicroPython学习之语法 I2S音频总线接口

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型&#xff1a;I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明&#xff1a; 参数类型必选参数&#xff1f…

《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序

上链接&#xff1a;P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017 上题干&#xff1a; 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是…

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

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

电子学会C/C++编程等级考试2023年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:字符长方形 给定一个字符,用它构造一个长为4个字符,宽为3个字符的长方形,可以参考样例输出。 时间限制:1000 内存限制:65536输入 输入只有一行, 包含一个字符。输出 该字符构成的长方形,长4个字符,宽3个字符。样例输入…

虚拟机VMware上安装Ubuntu系统(详细图文教程)

关于虚拟机VMware的安装教程&#xff0c;学者看我另外一篇博客&#xff1a;VMware详细安装教程 目录 一、Ubuntn系统准备二、VMware上安装Ubuntn系统2.1 答疑 三、导入Ubuntu系统四、总结 一、Ubuntn系统准备 先下载好Ubuntn系统&#xff0c;这里我提供一个&#xff0c;下载链…

一、用户管理

一、后端数据库初始化 1.1 因为版本问题&#xff0c;始终报错&#xff0c;按照报错信息去查询解决方案&#xff0c;无法解决 灵机一动&#xff1a; 网址&#xff1a; Spring Boot 3.0 升级 实战踩坑记录 - 掘金 (juejin.cn) &#xff11;.&#xff12; 个人配置【运行成功…
最新文章