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

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

相关文章

从三个主要需求市场分析,VR全景创业的潜力发展

VR全景&#xff0c;5G时代朝阳产业&#xff0c;其实拍摄制作很简单&#xff0c;就是利用一套专业的相机设备去给商家拍摄&#xff0c;结合后期专业的3DVR全景展示拍摄制作平台&#xff0c;打造3D立体环绕的效果&#xff0c;将线下商家真实环境1&#xff1a;1还原到线上&#xf…

使用docker快速搭建wordpress服务,并指定域名访问

文章目录 引入使用docker快速跑起服务创建数据库安装wordpress服务配置域名 引入 wordpress是一个基于PHP语言编写的开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;它有丰富的插件和主题&#xff0c;可以非常简单的创建各种类型的网站&#xff0c;包括企业网站、…

AI Chat 设计模式:15. 桥接模式

本文是该系列的第十五篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 如果你是第一次接触桥接模式&#xff0c;那么你会有哪些疑问呢&#xff1f;A.1Q.2 什…

内网隧道—HTTP\DNS\ICMP

本文仅限于安全研究和学习&#xff0c;用户承担因使用此工具而导致的所有法律和相关责任&#xff01; 作者不承担任何法律和相关责任&#xff01; HTTP隧道 Neo-reGeorg Neo-reGeorg 是一个旨在积极重构 reGeorg 的项目&#xff0c;目的是&#xff1a; 提高可用性&#xff0…

山西电力市场日前价格预测【2023-08-17】

日前价格预测 预测明日&#xff08;2023-08-17&#xff09;山西电力市场全天平均日前电价为376.70元/MWh。其中&#xff0c;最高日前电价为431.75元/MWh&#xff0c;预计出现在19: 45。最低日前电价为339.25元/MWh&#xff0c;预计出现在13: 15。 价差方向预测 1&#xff1a; 实…

【Unity造轮子】制作一个简单的2d抓勾效果(类似蜘蛛侠的技能)

文章目录 前言开始1. 实现简单的抓勾效果2. 高阶钩爪效果 源码参考完结 前言 欢迎阅读本文&#xff0c;本文将向您介绍如何使用Unity游戏引擎来实现一个简单而有趣的2D抓勾效果&#xff0c;类似于蜘蛛侠的独特能力。抓勾效果是许多动作游戏和平台游戏中的常见元素&#xff0c;…

【AI绘画】3分钟学会ikun幻术图

目录 前言一、效果展示二、准备工作三、操作步骤3.1平台创建实例3.2 启动SD 四、安装QR Code Monster 模型五、成图 前言 大家热爱的ikun幻术在今天的分享中将呈现。在本文中&#xff0c;我们将揭示一个备受欢迎的图像幻术技术&#xff0c;让您感受到令人惊叹的视觉创造力。 …

springboot+vue游戏攻略推荐网站的设计与开发_s5832

热门网游推荐网站是一个利用JAVA技术建设的网上管理系统&#xff0c;在热门网游推荐管理中实现信息化。系统的设计就是为了迎合广大用户需求而创建的一个界面简洁、有定向内容、业务逻辑简单易操作的热门网游推荐网站。本文以热门网游推荐为例&#xff0c;提出了利用JAVA技术设…

Linux下grep通配容易混淆的地方

先上一张图: 我希望找到某个版本为8的一个libXXX.8XXX.so ,那么应该怎么写呢? 先看这种写法对不对: 是不是结果出乎你的意料之外? 那么我们来看一下规则: 这里的 "*" 表示匹配前一个字符的零个或多个 于是我们就不难理解了: lib*8*.so 表示 包…

医疗PACS源码,支持三维多平面重建、三维容积重建、三维表面重建、三维虚拟内窥镜

C/S架构的PACS系统源码&#xff0c;PACS主要进行病人信息和影像的获取、处理、存储、调阅、检索、管理&#xff0c;并通过网络向全院提供病人检查影像及诊断报告&#xff1b;各影像科室之间共享不同设备的病人检查影像及诊断报告;在诊断工作站上&#xff0c;调阅HIS中病人的其它…

拒绝摆烂!C语言练习打卡第二天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4dd;…

Springboot写单元测试

导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintag…

【Unity每日一记】方位辨别—向量的叉乘点乘结合

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

grafana 的 ws websocket 连接不上的解决方式

使用了多层的代理方式&#xff0c;一层没有此问题 错误 WebSocket connection to ‘wss://ip地址/grafana01/api/live/ws’ failed: 日志报错 msg“Request Completed” methodGET path/api/live/ws status403 解决方式 # allowed_origins is a comma-separated list of o…

Flutter:简单搞一个内容高亮

内容高亮并不陌生&#xff0c;特别是在搜索内容页面&#xff0c;可以说四处可见&#xff0c;就拿掘金这个应用而言&#xff0c;针对某一个关键字&#xff0c;我们搜索之后&#xff0c;与关键字相同的内容&#xff0c;则会高亮展示&#xff0c;如下图所示&#xff1a; 如上的效果…

【Linux操作系统】举例解释Linux系统编程中文件io常用的函数

在Linux系统编程中&#xff0c;文件IO操作是非常常见和重要的操作之一。通过文件IO操作&#xff0c;我们可以打开、读取、写入和关闭文件&#xff0c;对文件进行定位、复制、删除和重命名等操作。本篇博客将介绍一些常用的文件IO操作函数。 文章目录 1. open()1.1 原型、参数及…

读书笔记 |【项目思维与管理】➾ 顺势而动

读书笔记 |【项目思维与管理】➾ 顺势而动 一、企业步入“终结者时代”二、过去成功的经验也许是最可怕的三、做好非重复性的事四、适应客户是出发点五、向知识型企业转变六、速度是决胜条件 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; …

docker私有仓库harbor

一、安装docker-compose yum install docker-compose -y 二、下载harbor安装包 tar -xf harbor-online-installer-v2.1.0.tgz cp harbor.yml.tmpl harbor.yml 三、修改harbor配置 [rootharbor ~]# vim harbor.ymlhostname: "修改为本机ip" harboradminpassword:…

每天一道leetcode:1218. 最长定差子序列(动态规划中等)

今日份题目&#xff1a; 给你一个整数数组 arr 和一个整数 difference&#xff0c;请你找出并返回 arr 中最长等差子序列的长度&#xff0c;该子序列中相邻元素之间的差等于 difference 。 子序列 是指在不改变其余元素顺序的情况下&#xff0c;通过删除一些元素或不删除任何…