浅入深出充分理解-->(fork())父子进程

news2024/12/24 9:06:46

目录

进程是如何被管理的

Linux下的进程是如何被管理的

fork()父子进程的创建

1:为什么fork返回给父进程子进程的id,给子进程返回0

2:一个函数是如何做到返回两次的

3:一个变量怎么会有不同内容


在某一个时刻,我正在用电脑打开某个软件进行操作,可是突然这个软件卡死了,在长时间的苦等之下我终于忍受不了,唤出任务管理器就要去结束这个任务。当任务管理器被打开的那一刻,就能看到各种各样的进程,那么这些进程是如何产生的呢。这里将和大家一起来探讨学习

进程是如何被管理的

当我们打开电脑对其使用的时候,可以一边听歌,一边打游戏,一边聊天,这都归功于我们的操作系统,那么操作系统是如何办到的呢。

比如在我们的学校中,有校长,辅导员,学生。校长对辅导员说今年我们的学校要组织一个篮球的队伍去参加市里面的篮球比赛,身高要选取最高的那几个,然后你的辅导员拿到这个消息就开始对班内的学生进行筛选,然后辅导员在把选出来符合要求的一批人的信息在交给校长。这个信息里面就包括你这个人身高,年龄,体重等的各种各样的信息,校长在按照摆放的顺序由上至下的进行筛选。那么在完成这个过程中,校长是从来没有见过你的,他只是拿到你的信息就足够了解到你这个人是怎么样的。最后当你被确认入选的时候你才会去篮球场进行训练。

那么同样,一个程序在真正成为进程之前操作系统会把它的各种各样的信息描述起来,这样的的行为被称为PCB(process ctrl block)-->进程控制块。但是我们的电脑不可能只有一个进程,当进程需要被加载到内存中之前,操作系统会根据进程的PCB,为该进程创建对应的PCB,PCB被创建出来之后会由PCB在指向这个进程中的代码和数据。如果我后来想要删除一个进程,那么这个进程该如何被找到呢。操作系统会把PCB用链表的形式链接起来,当我们需要退出一个进程的时候,实际上就是对链表进行的一个删除操作,所以对进程的操作也就变成了对链表的增删改查。

 PCB的本质其实就是进程的属性数据,操作系统的管理实际上是对数据属性的管理。

Linux下的进程是如何被管理的

当我们了解了Windows下的进程是如何被管理的之后再来看看Linux下的进程又是如何被管理的。首先在Linux下的进程被称为task_struct。现在我们在Linux下简单写一下一份代码    

 然后让它运行起来并且去去查看一下它是否真的存在当前进程

 从这里确实看到这个程序运行起来了,并且这个程序上面有两个叫PPID,PID的东西。那么这个其实就是子进程ID和父进程ID了。那么什么是子进程什么又是父进程呢。

fork()父子进程的创建

我们这里认识一个函数叫fork()。先去看一下fork的介绍

 这里大概讲到fork()会去赋值调用来创建一个新的进程被称为子进程,被调用的哪个进程被称为父进程,

 

然后在去看一下返回值,这里的返回值提到的是如果成功了会给父亲返回子进程的id,给子进程返还0,失败的话会返回-1。根据这个条件我们可以写下这样几行代码

通过这样一段代码可以看到,for之后的语句被调用了两次,原因就是因为父进程回创建一个子进程,fork之后父子都会执行一次就打印了两次。

在简单了解了fork()之后我们再来看这样一段代码并通过执行它又能发现什么不一样的

 通过对比这段代码我们似乎发现了一个不同寻常的地方,根据以往我们所学的经验,一份.c文件中的两个死循环同时被执行到了.似乎有点不符合我们以往所学的逻辑。那么这里不仅会有几个疑问

1:为什么fork返回给父进程子进程的id,给子进程返回0

返回不同的值是因为为了让不同的执行流执行不同的代码,在一个文件中,有时候我们会想在某个阶段通过不同的值来执行不同的代码。并且一个父进程可能不只有一个子进程,在多个子进程的情况下用来区分当前是哪一个子进程

2:一个函数是如何做到返回两次的

  在此之前我们需要先了解,fork创建出来的子进程和父进程是共享一块代码的。在调度fork之前会,父进程会有自己的ppid(父进程编号)和pid(子进程编号)数据和代码,cpu可以直接去调度父进程,当fork创建出来子进程之后,子进程也会有自己的ppid和pid数据和代码,但是只有父进程的代码和数据没有子进程的,那么此时子进程就会和父进程指向同一块代码。那么我们在回到fork身上,在调用了fork之后就能简单理解此时的frok内部其实做了一些诸如这样的操作

创建子进程PCB

填充PCB

让父子进程指向同一块代码

父子进程都有task_struct,可以被cpu调度了

最后在return一个值回去。那么此时子进程已经被创建,因为父子进程共享一块代码,所以在父进程return之后,子进程也同样会执行return。

 

 

3:一个变量怎么会有不同内容

刚刚我们说到,父子进程共享一块代码,那么既然共享一块代码那么它们的数据怎么可以一会是大于0的值一会又是等于0的值呢。那么我们的操作系统同样也考虑到了如果父进程需要修改某个数据,可能会影响到子进程,但是如果直接拷贝一块空间出来给子进程使用,但是子进程使用了一点点岂不是会有很多的浪费。在这个问题上操作系统就想到一个办法,如果说某一个数据需要被修改,那么你就不要去原来的那块空间上去修改了,我给你重新开辟一块空间给你使用,至少这块空间的大小就是你要多少我就给你多少,这样的操作行为也被称为数据的写实拷贝。

 

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

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

相关文章

【Unity3D】水面特效

1 前言 水波特效 中通过屏幕后处理实现了环形水波效果,本文通过 Shader Graph 实现了模拟水面特效,包含以下特效细节。 深水区和浅水区颜色差异;水面有波纹,并且在移动;水面起伏波动;水面边缘有水泡&#…

《数字图像处理-OpenCV/Python》连载(1)前言

《数字图像处理-OpenCV/Python》连载(1)前言 本书京东优惠购书链接:https://item.jd.com/14098452.html 写作背景 编写本书的初衷,源自作者学习数字图像处理的经历。 在创新实验班开设的专业创新教育课程中,我选择的…

基于springboot灾区物资管理系统

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

RestFul API 详解

目录 一、RestFul API 概述1.1 API1.2 RestFul API 二、REST概述三、RestFul API 规范3.1 动作3.2 路径(接口命名)3.3 过滤信息(Filtering)3.4 状态码(Status Codes) 四、RESTful 的极致 HATEOAS 一、RestF…

Node.JS教程

文章目录 Node.JSNode.js学习指南一、Node.js基础1.认识Node.js2.开发环境搭建3. 模块、包、commonJS3.1、为什么要有模块化开发?3.2、CommonJS规范3.3、 modules模块化规范写法 总结 Node.JS Node.js学习指南 服务端开发底层平台周边生态 学习前提 JavaScript、E…

2023年菏泽市中职学校技能大赛“网络安全”赛项规程

2023年菏泽市中职学校技能大赛 “网络安全”赛项规程 一、赛项名称 赛项名称:网络安全 赛项所属专业大类:信息技术类 二、竞赛目的 通过竞赛,检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力,以及分析…

第二篇论文写作启发点V5

第二篇论文写作启发点V5 2.LLFLow模型的缺陷,这是先验,如果先验出现错误,那么后面这个模型都会错误。而我们使用了学习的方式去解决 3. 参考文献和实验时的对照模型最好使用最新的,就是没有被引用过的,这样可以降低论文…

【大数据】Linkis 简述

Linkis 简述 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件,用于解决前台各种工具、应用,和后台各种计算存储引擎间的连接、访问和复用问题。 1.引言…

ImportError: cannot import name ‘SQLDatabaseChain‘ from ‘langchain‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…

食品饮料制造行业如何实现数字化转型和工业4.0

随着科技的不断进步和全球产业的不断发展,食品饮料制造行业也正迎来数字化转型和工业4.0的浪潮。这一转型不仅提升了生产效率和质量,还满足了消费者对更健康、更可持续产品的需求。本文将深入探讨食品饮料制造行业在数字化转型和工业4.0方面的趋势、挑战…

文心一言测评,满足你的生活工作方方面面

出品| 大力财经 文 | 魏力 随着国产大模型如雨后春笋般爆发,百度文心一言在多个中文任务中已经超越了ChatGPT。 文心一言的逻辑性强,能够满足提问者的各种需求,并在各个领域都有出色的表现。在多个领域,人工智能需要更准确地回…

SQL - Navicat查看SQL执行计划

我们在工作中肯定写过sql语句,也会进行一下sql语句的优化,在优化sql语句里看过相应的explain 在进行sql语句优化的时候,理解执行计划中各个参数的意思,弄明白执行的顺序,对sql优化有很大的帮助。 1、通过 Explain 命令…

编程的成就感到底在哪里?

一个好的开发人员如何成为一个伟大的开发人员? 暂时忘记伟大:一个体面的开发人员如何成为一个好的开发人员? 从步骤 1 到步骤 n 没有明确的路径。 哎呀,甚至不清楚步骤n是什么。 作为具有逻辑思维的开发人员类型,缺乏…

计算机视觉 -- 图像分割

文章目录 1. 图像分割2. FCN2.1 语义分割– FCN (Fully Convolutional Networks)2.2 FCN--deconv2.3 Unpool2.4 拓展–DeconvNet 3. 实例分割3.1 实例分割--Mask R-CNN3.2 Mask R-CNN3.3 Faster R-CNN与 Mask R-CNN3.4 Mask R-CNN:Resnet1013…

Gateway简述

前言 ​ 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端调用多个微服务接口的地址。另外微服务架构的请求中,90%的都携带认证信息/用户登录信息,都需要做相关的限制管理,API网关由此应允而生。 这样的架构会存…

解决github上http克隆代码问题(SSH方式)centos

常见报错如下: fatal: unable to access https://github.com/cnych/demo_service/: Failed connect to 127.0.0.1:1080; Connection refused 代理问题报错 fatal: unable to access https://github.com/cnych/emo_service/: TCP connection reset by peer https…

BLE4.2 ch582 TMOS使用

需要注意的是,TMOS(任务管理系统)的时基是625us。每个Take任务最多能有15个事件; 创建一个TMOS任务,需要分五步: 1.创建任务TakeID static uint8_t LEDTaskId INVALID_TASK_ID;2.定义一个事件标志 #define LEDTas…

【附安装包】SolidWorks2023安装教程

软件下载 软件:Solidowrks版本:2023语言:简体中文大小:15.76G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU3.0GHz 内存8G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.ba…

测试驱动开发(TDD)

测试驱动开发(TDD) 本篇文章简单叙述一下什么是测试驱动开发,以及怎么进行测试驱动开发! TDD (Test Driven Development):(源于极限编程(XP))在不…