【Linux】进程地址空间

目录

  • 一、回顾我们以前学习的地址空间
  • 二、进程地址空间
  • 三、进程地址空间的作用
  • 四、解决一个地址出现两个值的问题

一、回顾我们以前学习的地址空间

在这里插入图片描述

这个内存布局真是的我们实实在在的内存嘛? 答案是不是的
下面我们来验证

  1 #include<stdio.h>2 #include<assert.h>3 #include<unistd.h>4 5 int myval=100;6 7 int main()8 {9   pid_t id=fork();10   assert(id>=0);11   if(id==0)12   {13     //子进程14     myval=200;   //修改myval的值15     while(1)16     {17       printf("我是子进程,我的pid是:%d,我的父进程是:%d,myval: %d, &myval: %p\n",getpid(),getppid(),myval,&myval);18       sleep(1);19     }20   }else if(id>0)21   {22     //父进程23     while(1)24     {25       printf("我是父进程,我的pid是:%d,我的父进程是:%d,myval: %d, &myval: %p\n",getpid(),getppid(),myval,&myval);                                                                        26       sleep(1);27     }28   }29 30   return 0;31 }

在这里插入图片描述

可以看到,父进程和子进程中的g_val的地址是一摸一样的,那么按理说将子进程中的g_val改变后,由于他们使用的是一块空间,所以父进程中的g_val的值也应该改变,可这里为什么没有变化??

如果C/C++打印出来的地址是物理内存的地址,这种现象绝不可能存在!而这里使用的地址是虚拟地址。

在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理

所以最上面那张图应该叫做,进程虚拟地址空间

二、进程地址空间

每个进程都有一个地址空间,都认为自己在独占物理内存。而这个地址空间在内核中是一个结构体 struct mm_struct.

mm_struct 中的分布类似下面这种:

struct mm_struct {unsigned int code_start;  //地址空间上进行区域划分时,对应的线性位置,称为虚拟地址unsigned int code_end;unsigned int init_data_start;unsigned int init_data_end;unsigned int uninit_data_start;unsigned int uninit_data_end ;unsigned int heap_start;unsigned int heap_end;unsigned int stack_start;unsigned int stack end;
}


虽然这里只有start和end,但每个进程都可以认为mm_struct代表整个内存的所有的地址为0x0000…000~0xFFFF…FFF(即每个进程都认为自己拥有4GB的空间,至于到底有没有,是OS要做的事)

真实内存的样子

在这里插入图片描述

页表:是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系。 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表。

三、进程地址空间的作用

1.防止访问权限越界
通过添加一层软件层,完成有效的对进程操作内存进行权限管理,本质目的是为了保护物理内存以及各个进程的数据安全。
在这里插入图片描述

2.将内存申请和内存使用的概念划分清楚
通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进程读写内存和OS申请内存管理操作,进行软件上面的分离。
在这里插入图片描述

进程A想申请1000字节空间,进程A马上就能使用这1000字节吗?这是不一定的,可能会存在暂时不会全部使用的情况。

在OS角度,如果空间马上给进程A,就意味着整个系统会有一部分空间本来可以给其他进程立即使用,先在却被进程A闲置着。

这样就会存在空间浪费的情况。操作系统不允许出现浪费和不高效的行为

所以在这种情况下,OS会在进程A使用空间的时候才将内存申请给进程A。(相当于是类似写时拷贝的思想)

3.站在CPU和应用层的角度,进程同意可以看作统一使用4GB空间,而且每个空间区域的相对位置是比较确定的。

如果同时存在多个进程,而每个进程代码的其实位置是不确定的,那么CPU在执行时,需要找到代码在哪里,比较混乱。

而使用虚拟地址空间和页表的方式,将内存划分为代码段、常量区、堆、栈等区域,CPU执行进程时,每次从同一个位置开始即可,而不同的进程通过不同的页表映射到自己的物理内存中存放代码和数据的位置,提高了CPU的执行效率。

所以通过虚拟地址和页表,程序的代码和数据可以被加载到物理内存的任意位置!!极大的减少内存管理的负担。

OS最终这样的目的,为了达到一个目标:每个进程都认为自己是独占系统资源的。

四、解决一个地址出现两个值的问题

在开始那段代码中,我们可以看到myval的值在被子进程修改后,父进程值没有改变,同时打印出来的myval的地址相同,出现了一个地址两个值的情况,我们来解决。

在这里插入图片描述

子进程在创建时会以父进程为模板,即能够拷贝父进程的地方就拷贝,例如虚拟地址,只读区的映射关系(代码共享)。

所以子进程和父进程的虚拟地址是相同的,而页表的映射关系是不同的,所以他们的物理地址也不同。

所以就出现了,子进程改变myval的值,而父进程不变,但打印出的地址却是一样的情况了

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

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

相关文章

腾讯云CVM服务器竞价实例是什么?和按量计费有什么区别?

腾讯云服务器CVM计费模式分为包年包月、按量计费和竞价实例&#xff0c;什么是竞价实例&#xff1f;竞价实例和按量付费相类似&#xff0c;优势是价格更划算&#xff0c;缺点是云服务器实例有被自动释放风险&#xff0c;腾讯云服务器网来详细说下什么是竞价实例&#xff1f;以及…

linux I/O性能优化

Linux 文件系统 磁盘和文件系统的关系&#xff1a; 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 文件系统工作原理 索引节点和目录项 文件系统&#xff0c;本身是对存储设备上的文件&#xff0c;进行组织…

elementui form组件出现英文提示

今天让解决一个bug&#xff0c;是表单组件提示词会出现英文。 问题情景如下&#xff1a; 有时会出现中文&#xff0c;有时会出现英文。 解决方法&#xff1a; 经查看&#xff0c;代码采用的是elementui的form组件&#xff0c;在el-form-item中使用了required属性&#xff0c;同…

实时安全分析监控加强网络安全

网络犯罪分子只需几分钟&#xff0c;有时甚至几秒钟即可泄露敏感数据。但是&#xff0c;IT 团队可能无法在数周内发现这些违规行为。通常&#xff0c;这些违规行为是由外部方或客户发现的&#xff0c;到那时为时已晚。随着网络漏洞的激增&#xff0c;对安全分析的需求空前高涨。…

idea 打开java项目后新建的模块中,java文件夹需要变成蓝色,以及resources文件夹变成三条杠的

idea 打开java项目后新建的模块中&#xff0c;java文件夹需要变成蓝色&#xff0c;以及resources文件夹变成三条杠的方法 再选择modules&#xff0c;找到需要变蓝的文件夹&#xff0c;点击sources即可 同理resources文件夹变成三条杠也只需要找到对应文件夹&#xff0c;点击re…

Java项目作业~ 通过html+Servlet+MyBatis,完成站点信息的添加功能

需求&#xff1a; 通过htmlServletMyBatis&#xff0c;完成站点信息的添加功能。 以下是站点表的建表语句&#xff1a; CREATE TABLE websites (id int(11) NOT NULL AUTO_INCREMENT,name char(20) NOT NULL DEFAULT COMMENT 站点名称,url varchar(255) NOT NULL DEFAULT ,…

如何快速搭建app自动化环境编写用例?

使用Airtest 作为测试开发工程师&#xff0c;快速搭建app自动化环境并编写用例可以使用Airtest解决方案来实现。Airtest是一款基于Python的全平台UI自动化测试框架&#xff0c;支持多种移动设备和模拟器&#xff0c;同时集成了丰富的图像识别和手势操作功能。 以下是使用Airt…

通过nvm切换nodejs版本

下载&#xff1a; 1.下载nvm地址&#xff1a; https://github.com/coreybutler/nvm-windows/releases 下载该安装包&#xff0c;下载后无需配置就可以使用&#xff0c;十分方便。 简单说明一些包&#xff1a; nvm - noinstall.zip &#xff1a; 这个是绿色免安装版本&#…

[数据集][目标检测]道路坑洼目标检测数据集VOC格式1510张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1510 标注数量(xml文件个数)&#xff1a;1510 标注类别数&#xff1a;2 标注类别名称:["keng","…

实验三 图像分割与描述

一、实验目的&#xff1a; &#xff08;1&#xff09;进一步掌握图像处理工具Matlab&#xff0c;熟悉基于Matlab的图像处理函数。 &#xff08;2&#xff09;掌握图像分割方法&#xff0c;熟悉常用图像描述方法。 二、实验原理 1.肤色检测 肤色是人类皮肤重要特征之一&#xff…

【分布式】Viewstamped Replication Revisited

篇前感悟&#xff1a; 阅读分布式系统文章的意义其实并不在于你个人真正地去开发这样一个基于这种协议的系统&#xff0c;因为真正去开发一个高可用的分布式系统实在是太难了&#xff08;对我来说…&#xff09;更多的还是汲取其中的思想&#xff0c;包括设计思路&#xff0c;优…

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

Opencv-C++笔记 (17) : 模板匹配

文章目录 1--概念2-- 方法3 结果3.1 ROI区域的获取使用自适应目标匹配 1–概念 opencv 提供了一个专门用于模板匹配的函数 cv::matchTemplate();其调用方式如下&#xff1a; void cv::matchTemplate(cv::InputArray image, // 用于搜索的输入图像, 8U 或 32F, 大小 W-Hcv::Inpu…

2023年初中信息技术学科暑假备课

目录 2023年初中信息技术学科暑假备课1. 创意空间1.1 教师的空间1.2 学生的空间1.3 关于FTP服务器设置 2. 什么是编程2.1 编程语言2.2 人人都应学好编程2.3. 编程难吗&#xff1f;2.4 python用途 3. 开发环境3.1 打开IDLE3.2 IDLE窗口3.2.1 shell窗口和编辑窗口 4. 项目式教学4…

开发测试框架一 - 创建springboot工程及基础操作

一、创建及运行方式 1. 从官网导入&#xff1a; 注意&#xff1a;由于我的java版本是1.8&#xff1b;所以选中了spring2.7.14&#xff1b;如果你的java版本是9及以上&#xff0c;选中spring3相关的同时Java 版本也要对应起来 2. 创建第一个get请求 创建Controller package及…

Golang下载安装

目录 1. 下载压缩包 2. 解压 3. 查看SDK是否安装成功 4. 配置环境变量 5. 查看环境变量是否配置成功 1. 下载压缩包 官网下载地址&#xff1a; All releases - The Go Programming Language Windows64位选择如下下载&#xff1a; 2. 解压 解压后内容如下&#xff1a; …

uniapp-微信小程序篇

uniapp-微信小程序篇 一、创建项目(以Vue3TS 项目为示例) 可以通过命令行的方式创建也可以通过HBuilderX进行创建&#xff08;通过HBuilderX创建的项目建议选择最简单的模板&#xff09;&#xff0c;个人建议使用命令行方式。 (1) 命令行方式&#xff1a; npx degit dcloudio…

Vue3实现图片懒加载及自定义懒加载指令

Vue3实现图片懒加载及自定义懒加载指令 前言1.使用vue3-lazyload插件2.自定义v-lazy懒加载指令2.1 使用VueUse2.2 使用IntersectionObserver 前言 图片懒加载是一种常见性能优化的方式&#xff0c;它只去加载可视区域图片&#xff0c;而不是在网页加载完毕后就立即加载所有图片…

CentOS 7 下 Keepalived + Nginx 实现双机高可用

CentOS 7 下 Keepalived Nginx 实现双机高可用 文章目录 CentOS 7 下 Keepalived Nginx 实现双机高可用服务器准备服务信息服务架构 服务安装nginxKeepalived 服务配置nginxKeepalived 启动服务nginxkeepalived 服务验证查看 VIP 状态CURL 命令访问浏览器访问 高可用验证停止…

(7)(7.1) 使用航点和事件规划任务

文章目录 前言 7.1.1 设置Home位置 7.1.2 视频&#xff1a;制作并保存多路点任务 7.1.3 视频&#xff1a;加载已保存的多航点任务 7.1.4 使用说明 7.1.5 提示 7.1.6 自动网格 7.1.7 任务指令 7.1.8 任务结束 7.1.9 任务重置 7.1.10 MIS_OPTIONS 7.1.11 任务再出发 …