【Linux】地址空间概念

目录

 前言: 地址空间回顾

 验证:一个变量是否会有两个值?

一. 什么是地址空间

虚拟地址与物理地址之间的关系

二. 地址空间是如何设计的 

1. 回答一个变量两个值

2.扩展

继续深入理解

三. 为什么要有地址空间

原因:

1. 使操作系统对访问或者映射的合法性检查,杀掉非法进程,从而保护数据安全。 

2.  使物理内存分配与进程管理,通过页表进行解耦,在加载时确定映射关系后,相互独立

3. 保证每个进程以统一的视角(有序的区域划分)进行管理,完成进程独立性的实现

页表补充


 前言: 地址空间回顾

之前我们学习C是,对内存分布的了解 

字符串常量在静态常量区(静态区) 

那么这真的是内存吗?

答案是:不是

 那我们之前所了解的上图又是什么? 那真正的内存又是指什么?让我们来解释其中的奥秘

 验证:一个变量是否会有两个值?

我们运行下面的代码

    #include <iostream>2 #include <unistd.h>3 using namespace std;4 5 int _gar = 100;6 int main()7 {8    pid_t pd = fork();9 10    if (pd == 0)11    {// 子进程12      int cen = 0;13      while (1)14      {15        cout << "I am child ,Pid :" << getpid() << " PPid:" << getppi    d() << " _gar = " << _gar << "地址:" << &_gar << endl;16        sleep(1);17        cen++;18        if (cen == 5)19        {20          _gar = 200;                                                21          cout << "100 -> 200 seccoss -gar = " << _gar << "++++++++++    +++++++++++" << endl; 22        }23      }24    }25    else26    {27     // 父进程28     while (1)29     {30        cout << "I am father ,Pid :" << getpid() << " PPid:" << getpp    id() << " _gar = " << _gar << "地址:" << &_gar << endl;31     sleep(1);32     }33    }34    35   return 0;36 }

根据我们实验出来的结果:

这其实是虚拟地址,也叫线性地址。

几乎所有的语言,所说的“地址”指的并非物理地址,而是虚拟地址!!!!

这里对本文刚开始的内存进行解释:

内存可以分为主存储器(主内存)和辅助存储器(如硬盘、固态硬盘等)。主内存是计算机中直接与CPU交互的存储器,用于存储当前正在执行的程序和数据。辅助存储器则用于长期存储数据,当程序或数据不再需要时,可以将其保存在辅助存储器中。(来源:chatgpt)

一. 什么是地址空间

虚拟地址与物理地址之间的关系

任何数据,都需要加载到内存中,都有各自的物理地址。如果我们进程A,B同时运行,相互独立,万一出现错误,将A将B中的数据读取了,这是极不安全的,而如果在虚拟地址上先操作,再通过一定的机制,确保访问的安全性。因此虚拟地址的存在,保护了物理地址上的数据安全。

地址空间的本质是:一种内核的数据结构,里面至少有各个区域的划分。

二. 地址空间是如何设计的 

我们知道每个进程都有自己的PCB,同时task_struct里面有进程地址空间数据的存储结构,也就是mm_struct。虚拟地址经过页表映射,指向物理地址。

 

 注意:每个进程中,不只是地址空间,页表也有自己私有一份。

 这样我们只要保证每个进程之间经过页表映射后的物理地址不同,即可保证进程之间互不干涉。

1. 回答一个变量两个值

解释:

父进程通过自己的task_struct中地址空间数据访问到在物理空间上的数据,子进程则是共享父进程的代码,但当子进程想对数据进行修改,为了保证进程之间的独立性,系统决定进行写时拷贝,为子进程拷贝一份数据,同时修改子进程页表映射数据。这样就在表面上看就是相同变量,不同的值,但本质上是相同的虚拟地址,不同的页表,不同的物理地址,不同的值。

具体的就体现在id的两次写入:

2.扩展

 结论:在可执行程序,编译时内部就有地址了

 我们在分析地址空间时,一直使用的是OS的视角,而不只是操作系统要遵守,编译器也要遵守! 即在编译器编译代码时,就已经在内部形成了地址,而且有各个区域:代码区,数据区...并且采用与linux内核一样的编址方式,每一个变量,每一行代码都有其虚拟地址。

继续深入理解

    我们知道执行进程是通过虚拟地址+页表的方式来访问物理地址的,那可执行程序的虚拟地址和页表的数据又是从那里来的呢?

流程分析 :

所以CPU在读取到变量a时,根据虚拟地址0x100在代码段中寻找,在代码段查询页表后,再跳转0x169地址找到数据a,CPU获取其内部跳转虚拟地址0x123,再从虚拟地址中寻找,通过页表访问到函数func。(物理内存位置随便加载)

三. 为什么要有地址空间

原因:

1. 使操作系统对访问或者映射的合法性检查,杀掉非法进程,从而保护数据安全。 

例:假设char* man = "鸡你太美";  *man = ‘寄’ , 我们在C语言期间就清楚字符常量无法修改,其原因来自底层页表中会记录代码段地址,并且记录其读写权限,操作系统检测到非法操作后就会中断结束进程,保护数据。(在物理内存我们是可以任意修改的,所以页表上的判断确保了操作的合法性,保护了数据的安全)

2.  使物理内存分配与进程管理,通过页表进行解耦,在加载时确定映射关系后,相互独立

问:是否可以提前加载未来的数据到物理内存中呢?
答:可以

解析: 物理内存的分配和进程管理,之间可以说没有关系。这种关系叫做解耦合,那什么是强耦合呢?就是之间关系紧密,不容易分开,例如:你把函数内容写在main函数里面。

 

我们在学习C,C++时,在语言层面上new,malloc等内存分配上的操作都是在对虚拟地址上的操作。那疑问来了

问:在进行虚拟地址分配的时候是否在物理内存上分配资源

答:不会,只在你访问时,才申请物理内存空间,通过这延迟分配的策略,提高整机效率。(这个操作仅操作系统自动完成,用户,进程0感知)

3. 保证每个进程以统一的视角(有序的区域划分)进行管理,完成进程独立性的实现

页表补充

以现在的视角看进程,加载内存就好像是创建进程,那是否会加载全部的数据到内存上呢?

我们在玩游戏时有的游戏动则40G,甚至是100G,我们的电脑是绝对装不下的,因此内存有一种内存换下机制,一些数据在一定时间内不再使用则被换下,加载新数据,(说到这里要对页表进行补充,页表不只映射物理内存,也映射硬盘地址)再次使用被换下的数据直接查询页表,用磁盘地址快速访问加载到内存中。

结语

   本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力

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

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

相关文章

基于SSM的新能源汽车在线租赁系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

LNMP 平台搭建(四十)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 搭建LNMP 一、安装Nginx 二、安装Mysql 三、安装PHP 四、部署应用 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP&#xff08;或者其他的编程语言&#xff0c;如…

【人月神话】深入了解软件工程和项目管理

文章目录 &#x1f468;‍⚖️《人月神话》的主要观点&#x1f468;‍&#x1f3eb;《人月神话》的主要内容&#x1f468;‍&#x1f4bb;作者介绍 &#x1f338;&#x1f338;&#x1f338;&#x1f337;&#x1f337;&#x1f337;&#x1f490;&#x1f490;&#x1f490;&a…

华为数通安全产品介绍

HiSecEngine USG12000系列防火墙&#xff08;以下简称USG12000系列&#xff09;是华为公司推出的首款T级AI防火墙&#xff0c;在网络边界实时防护已知与未知威胁&#xff0c;通常部署在云计算数据中心&#xff0c;大型企业及园区网出口&#xff0c;为数据中心、企业及园区网络提…

机器人中的数值优化(十三)——QP二次规划

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

WebSocket 协议及其使用案例

文章目录 前言一、初识 WebSocket 协议1.1 什么是 WebSocket 协议1.2 WebSocket 与 HTTP 的关系1.3 WebSocket 握手的过程1.4 WebSocket 解决了什么问题 二、WebSocket 数据帧格式2.1 WebSocket 数据帧格式图示2.2 各字段的详细说明 三、SpringBoot 项目中引入 WebSocket3.1 创…

蓝桥杯打卡Day2

文章目录 糖果分享游戏玛雅人的密码 一、糖果分享游戏IO链接 本题思路:本题是一道模拟题&#xff0c;最终需要每个人得到相同的糖果&#xff0c;那么此时我们开辟一个数组用来保存每个人分一半的结果&#xff0c;然后每个人都需要从左边拿到对方糖果&#xff0c;那么左边就是…

C#面试十问

1&#xff1a;C#中变量类型分为哪两种&#xff1f;它们的区别是什么&#xff1f;2&#xff1a;Class和Struct的区别&#xff1f;3&#xff1a;C#中类的修饰符和类成员的修饰符有哪些&#xff1f;4&#xff1a;面向对象的三个特征&#xff08;特点&#xff09;是什么&#xff1f…

js获得相对路径文件,并上传到服务器

如何通过js获得相对路径文件 已知一个相对路径文件&#xff0c;如何使用js将该文件读取为File格式&#xff0c;最后上传到服务器中呢。 1.最简单的解决方案——fetch 代码 import ./index.scss// js通过相对路径获取文件 function FetchGetLocalFile() {const fetchLocalFile …

centos7升级openssh版本

linux升级openssh版本&#xff0c;升级到8.6p1 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载rpm包 2.编写一键安装脚本&#xff08;然后执行&#xff09; #把所有的rpm包&#xff0c;我都放到了/ydy目录&#xff0c;下面安装时&#xff0c;也指定了这个目录 #编…

mysql、MHA高可用配置即故障切换

MHA概述 一套优秀的MySQL高可用环境下故障切换和主从复制的软件 MHA的出现就是解决MySQL 单点的问题 MySQL故障过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换 MHA能在故障切换的过程中最大程度上保证数据的一致性以达到真正意义上的高可用 MHA的组成&#xff08;核…

助力网络管理的利器:企业办公网络中的VLAN划分策略

企业办公网络的性能和安全性对员工的高效工作和信息安全具有重要意义。在实现这一目标时&#xff0c;VLAN&#xff08;Virtual Local Area Network&#xff09;划分在网络设计中发挥着至关重要的作用。通过将办公网络划分为多个虚拟局域网&#xff0c;VLAN划分可以实现网络资源…

uniapp - 倒计时组件-优化循环时间倒计时

使用定时器的规避方法 为了避免定时器误差导致倒计时计算错误&#xff0c;可以采用一些规避方法&#xff0c;比如将倒计时被中断时的剩余时间记录下来&#xff0c;重新开启定时器时再将这个剩余时间加到新的计算中。同时&#xff0c;为了避免定时器延迟&#xff0c;可以在每次执…

记一次Nginx代理Mysql服务的经历

背景&#xff1a; 根据组长背景描述&#xff0c;具备以下前提 1. Mysql服务器为 某A云厂商的RDS SAAS服务&#xff0c;但是不开通外网服务 2. EC2 服务器一台&#xff0c;某A云厂商LaaS服务&#xff0c;也不开通外网 3.阿里云服务器一台&#xff0c;这台服务器有服务需要连…

5700A福禄克FLUKE 5700A多功能校准器

181/2461/8938Fluke 5700A/5720A 高精度多功能校准器 5700A: 世界级标准产品 通过不断的改进、提高&#xff0c;5700A已经演变为5700A系列II。这是福禄克公司生产的、经过大量测试证明、极为可靠的、高精度校准器。5700A已经在全世界的范围被看作是校准器的标准&#xff0c;具有…

用python开发一个炸金花小游戏

众所周知&#xfeff;扑克牌可谓是居家旅行、桌面交友的必备道具&#xff0c; 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏&#xff0c;先来看一下基本的游戏规则。 炸&#xff08;诈&#xff09;金花又叫三张牌&#xff0c;是在全国广泛流传的一种民间多人纸牌游戏…

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先我们要知道后序遍历数组的最后一个元素必然是根节点&#xff0c;然后根据根节点在中序遍历数组中的…

postgres源码解析55 Brin Index--2(brinbuild流程)

上一篇讲解了brin index的基本概念以及页布局postgres源码解析54 Brin Index–1&#xff0c;后续会从源码角度对索引的构建、维护等方面进行深入讲解。 1 关键数据结构 2 brinbuild执行流程图 3 brinbuild 函数详解 1 首先调用brin_matepage_init初始化brin meta元数据页&…

【0904作业】QT 完成登陆界面跳转到聊天室+完成学生管理系统的查找和删除功能

一、完成登陆界面跳转到聊天室 1> 项目结构 2> 源码 ① .pro ②main #include "mywnd.h" #include"chatCli.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWnd w;w.show();Form f;QObject::co…

Lite transformer

图片以及思想来源请参考论文 Lite Transformer with Long-Short Range Attention 瓶颈结构&#xff08;bottleneck&#xff09;是否真的有效 注意力机制被广泛应用在诸多领域&#xff0c;包括自然语言处理&#xff0c;图像处理和视频处理。它通过计算所有输入元素的点积来建模…