fork函数详解

前言

之前我们提到,创建子进程的时候,需要使用fork()函数,其中分别有id ==0和id >0的if函数,但是实验表明,两个if函数中的内容都得到了实现。按照我们之前所学,一个变量同一时间只能有一个值,那到底是怎么满足两个if都实现的呢?

1. fork函数

1.1 返回值:

fork函数在运行的时候创建新进程,新进程是子进程,旧进程是父进程。

fork函数的返回值:

>0:父进程,具体的数字是子进程的pid

==0:子进程

<0:出错

证明:

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id = fork();if(id==0){printf("我是子进程");printf("mypid:%d,myppid:%d\n",getpid(),getppid());printf("%p\n",&id);id = 5;//	printf("%p\n",&id);//	printf("%d\n",id);}else if(id>0){printf("我是父进程");printf("mypid:%d,myppid:%d\n",getpid(),getppid());printf("%p\n",&id);if(id==id){printf("1\n");}}return 0;
}

这里就能看出,子进程和父进程的关系以及>0的具体数字。

1.2 进程执行过程

当子进程创建后,会存在两个二进制代码相同的进程,分别是子进程和父进程,此时子进程中的数据和父进程的数据是相同的。因为子进程的创建是为了执行和父进程不同的任务,那么就避免不了对父进程的数据进行更改,那么此时操作系统就会给子进程重新开辟一块空间,存储子进程自己修改的数据,而未被修改的数据,就还是和父进程用一样的。这便是写时拷贝。

写时拷贝:等到修改数据时才真正分配内存空间,这是对程序性能的优化,可以延迟甚至是避免内存拷贝,当然目的就是避免不必要的内存拷贝。

1.3 页表

知道了进程执行过程,但是我们好像还是没有解决为什么id会有两个值同时出现的问题。

通过在父进程和子进程中分别打印id的地址,我们知道他们的地址是一样的。

但是我们知道,物理地址对应的数据是唯一的,那么我们拿到的地址就肯定不是物理地址。

因此此时打印的地址是虚拟地址。

这是因为页表的存在。

页表中存在着虚拟地址,物理地址,以及标记位(如进程对应的代码和数据是否已经加入到内存中),访问权限等。

如果没有加载到内存当中,那么就会触发缺页中断。即暂停进程执行,直到进程的数据和代码加载到内存中。

为什么会有缺页中断呢?因为CPU加载数据时是采用的惰性加载方式,当需要的时候才进行加载。这样能避免造成内存浪费。

其中虚拟地址和物理地址存在映射的关系。我们需要通过虚拟地址访问物理地址。

需要注意的是,写时拷贝并不影响虚拟地址,只会改变其映射的物理地址。

页表的作用:

1. 让所有进程能以统一角度看待内存。(让进程不必知道具体的物理地址)

2.让非法命令不能直接到达物理地址

3. 由于程序地址空间和页表的存在,将进程管理模块和内存管理模块进行解耦合(独立性)

即进程管理模块只需要使用虚拟地址,不用关心物理地址。

此时的进程 =内核(tast_struct + mm_struct)+数据和代码 。

mm_struct存储程序地址空间。

页表的首地址存储在CPU内存中的一个CR3寄存器中,此寄存器属于进程的上下文,当切换进程时,会带走该数据。

切换进程时还要切换程序地址空间,而pcb指向程序地址空间。

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

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

相关文章

二叉排序树

在说二叉排序树之前先考虑这样一个例子&#xff0c;假设我们的数据集开始只有一个数{62}&#xff0c;然后现在需要将88插入数据集&#xff0c;于是数据集成了{62,88}&#xff0c;还保持着从小到大有序&#xff0c;再查找有没有58&#xff0c;没有则插入&#xff0c;可此时要想在…

GitLab 中文版如何禁止从 UI 上下载代码?

本文分享如何通过配置来禁止用户从 GitLab 中文版 UI 界面上下载源代码。 GitLab 中文版也就是极狐GitLab&#xff0c;使用界面和 GitLab 一样。常规下载代码的方式也一样&#xff0c;要么使用 SSH 或者 HTTP 克隆&#xff0c;要么直接从 UI 上下载源代码&#xff1a; 但是有些…

Conmi的正确答案——ESP32导出烧录进芯片的固件

版本&#xff1a;ESP-IDF 4.4.7 系统&#xff1a;Windows 11 相关链接&#xff1a; 官网&#xff1a;Read Flash Contents: read_flash GITHUB独立工具&#xff1a;esptool 命令&#xff1a; # 我这里用的是C3和windows版的EXE工具 esptool.exe --chip ESP32-C3 -p COM17 -b …

vue2+ element ui 集成pdfjs-dist

目录 1. 下载Pdf.js1.1 下载1.2 修改配置1.2.1 将pdfjs-3.8.162-dist复制到项目中1.2.2 解决跨域问题1.2.3 将pdf.worker.js文件复制到public目录下1.2.4 安装 pdfjs-dist1.2.5 前端vue代码(示例) 3. 参考资料 1. 下载Pdf.js 1.1 下载 下载链接&#xff08;官方&#xff09;需…

为什么越来越多的跨境卖家放弃电商平台,转向独立站?

对于做跨境电商的卖家来说&#xff0c;采用多平台、多站点的经营策略非常重要。这样做不仅可以分散风险&#xff0c;避免把所有的钱都押在一个市场上&#xff0c;减少“把所有鸡蛋放在一个篮子里”的风险&#xff0c;还能拓宽销售渠道&#xff0c;帮助卖家赚更多的钱&#xff0…

PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级

PCB生产ERP系统的智能拼版技术&#xff0c;是基于PCB前端报价系统获取到的用户或市场人员已录入系统的板子尺寸及set参数等&#xff0c;按照最优原则或利用率最大化原则自动进行计算并输出拼版样式图和板材利用率&#xff0c;提高工程人员效率&#xff0c;减少板材的浪费。覆铜…

2024年第四届数字化社会与智能系统国际学术会议(DSInS 2024)

会议地点 悉尼会场&#xff1a;澳大利亚悉尼-悉尼科技大学空中科技大学功能中心&#xff0c;沃特尔&#xff08;Aerial UTS Function Centre, Wattle Room&#xff09; 具体地址&#xff1a;Building 10, Level 7, 235 Jones Street, Ultimo, New South Wales, 2007, AU 郑州…

从零开始快速构建Vue3项目

一、技术选型 组件大类 具体插件 vue3插件 相关插件开发文档 基础架构搭建 初始项目搭建、打包构件工具&#xff1a;vite开始 | Vite路由管理及菜单权限封装vue-router介绍 | Vue Router状态管理Pinia介绍 | Pinia 中文文档API请求及异常封装axiosUI框架 element-uihttps…

spring cloud 入门笔记1(RestTemplate,Consul)

最大感受&#xff1a; spring cloud无非是将spring boot中的各个工作模块拆分成独立的小spring boot&#xff0c;各个模块之间&#xff0c;不再是通过导包什么的&#xff0c;调用而是通过网路进行各个模块之间的调用 工具一&#xff1a;RestTemplate 在Java代码中发送HTTP请…

从虚构到现实!FAME助力模型编辑走向实际应用

论文&#xff1a;FAME: Towards Factual Multi-Task Model Editing 链接&#xff1a;https://arxiv.org/abs/2410.10859项目&#xff1a;https://github.com/BITHLP/FAME 前言 大语言模型中丰富的知识使得其在如智能助理&#xff0c;法律顾问&#xff0c;医疗咨询等多个领域中…

无需Photoshop即可在线裁剪和调整图像大小的工具

Bitmind是一个灵活且易于使用的批量图像本地化处理器&#xff0c;经过抓包看&#xff0c;这个工具在浏览器本地运行&#xff0c;不会上传图片到服务器&#xff0c;所以安全性完全有保证。 它可以将图像调整到任何特定尺寸&#xff0c;并在必要时按比例裁剪。 这是一个在线工具…

计算两个结构的乘法

在行列可自由变换的平面上&#xff0c;2点结构有3个 3点结构有6个 计算2*2 2a1*2a14a6 2a1*2a24a8 2a1*2a34a12 显然2a1*2a14a6因为这3个结构都分布在同一列上&#xff0c;就是整数乘法。2a1*2a2的结果有2种写法&#xff0c;一种外形像2a1细节为2a2&#xff0c;一种外形为2…

短剧项目全流程花费项目详解:从软件采购到OSS流量

一、引言 随着网络视频的兴起&#xff0c;短剧项目作为一种新兴的内容形式&#xff0c;受到了广泛关注。然而&#xff0c;短剧项目运营过程中涉及诸多费用&#xff0c;本文将对短剧项目的各项花费进行明细分析&#xff0c;以帮助相关从业者更好地规划预算和控制成本。 二、软…

Vector Optimization – Vector Mask Register

文章目录 Vector优化 – Vector掩码寄存器 Vector优化 – Vector掩码寄存器 One of the reasons for low levels of vectorization is the presence of conditionals (IF statements) inside loops. IF statements introduce control dependencies into a loop. 矢量化水平低的…

冗余连接2 hard题 代随C#写法

此题在卡码网109与力扣685题亦有记载 有一说一C#写法我没咋搞懂 就看明白了思路 这里贴一个答案待后续我醒悟了再来看罢 难就难在对整体数据结构classUnion&#xff08;并查集&#xff09;的理解不熟并且 对于输入输出这个迭代过程理解上也比较吃力 109. 冗余连接II 题…

MySQL:CRUD

MySQL表的增删改查&#xff08;操作的是表中的记录&#xff09; CRUD(增删改查) C-Create新增R-Retrieve检查&#xff0c;查询U-Update更新D-Delete删除 新增&#xff08;Create&#xff09; 语法&#xff1a; 单行数据全列插入 insert into 表名[字段一&#xff0c;字段…

【stable diffusion部署】手把手教你从0基础入门Stable Diffusion

前言 在开始学之前&#xff0c;我想提前说一下&#xff0c;我所理解的AI绘画的本质&#xff0c;就是手替&#xff0c;人提出方案&#xff0c;AI帮你完成具体的作画过程。 写这篇文章的初衷&#xff0c;网上的Stable Diffusion教程太多了&#xff0c;但是我真正去学的时候发现…

前端单元测试框架 引入说明

1. 背景&#xff1a; 2. 如何选择&#xff1a; 2.1. 流行框架 Jest&#xff1a;由Facebook开源的JavaScript测试框架&#xff0c;应用于脸书系以及 ReactJs 系Mocha&#xff1a;适用于 NodeJs 和 浏览器、简易、灵活、有趣的JavaScript 测试框架Jasmine&#xff1a;BDD&#…

有效提升网站流量的SEO技巧分享

内容概要 在数字时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为提升网站曝光度和吸引访问者的重要工具。SEO的核心目标是通过优化网站的各个方面&#xff0c;提高在搜索引擎结果页面上的排名&#xff0c;从而获得更多的自然流量。有效的SEO策略能够让您在激…

MacBook不额外安装软件,怎样投屏到安卓手机上?

提起iPhone或MacBook的投屏&#xff0c;人们总会想到airplay功能。但离开了苹果生态&#xff0c;其他品牌的手机电脑就未必配备airplay功能了。 如果想要将MacBook的电脑屏幕共享到安卓手机或平板上&#xff0c;到底要怎样做&#xff1f;需要安装什么软件吗&#xff1f; 不需要…