【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,我们的电脑是绝对装不下的,因此内存有一种内存换下机制,一些数据在一定时间内不再使用则被换下,加载新数据,(说到这里要对页表进行补充,页表不只映射物理内存,也映射硬盘地址)再次使用被换下的数据直接查询页表,用磁盘地址快速访问加载到内存中。
结语
本小节就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区评论,如果给小伙伴带来一些收获请留下你的小赞,你的点赞和关注将会成为博主创作的动力。
相关文章:

【Linux】地址空间概念
目录 前言: 地址空间回顾 验证:一个变量是否会有两个值? 一. 什么是地址空间 虚拟地址与物理地址之间的关系 二. 地址空间是如何设计的 1. 回答一个变量两个值 2.扩展 继续深入理解 三. 为什么要有地址空间 原因: 1. 使…...

视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级
视频推拉流EasyDSS视频直播点播平台,集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体,可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 TSINGSEE青犀视频的EasyDSS平台具有点播文件分类展示方法…...

JavaScript基础06——let和var两个关键字有啥不同
哈喽,小伙伴们大家好,我是雷工! 每日学习一点点,今天继续学习JavaScript基础知识,下面是学习笔记。 1、变量的本质 内存:计算机中存储数据的地方,相当于一空间。 变量的本质:是程序…...

Apache Doris 2.0.1 1.2.7 版本正式发布!
亲爱的社区小伙伴们,我们很高兴的宣布,2023 年 9 月 4 日 我们正式发布了 Apache Doris 2.0.1 和 Apache Doris 1.2.7 这两个版本,这两个版本由上百名位贡献者共同努力完成的,提供了更多有用的新特性,同时修复了若干已…...

YOLOv5算法改进(11)— 替换主干网络之EfficientNetv2
前言:Hello大家好,我是小哥谈。EfficientNetV2是一个网络模型,旨在提供更小的模型和更快的训练速度。它是EfficientNetV1的改进版本。EfficientNetV2通过使用更小的模型参数和采用一种称为Progressive Learning的渐进学习策略来实现这一目标。…...

Lombok讲解
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,如:getter、setter、equals、hashCode、toString等。 Lombok的常用注解有: Data:这是一个自定义注解,它相当于Getter…...

【Android】功能丰富的dumpsys activity
在Android中,要查看客户端Binder的连接数,可以通过dumpsys命令结合service参数来获取相关信息。请按照以下步骤进行操作: 连接到设备的计算机上,打开命令行终端。 使用adb shell命令进入设备的Shell环境。 执行以下命令来查看服…...

亚马逊云科技 云技能孵化营——我的云技能之旅
文章目录 每日一句正能量前言活动流程后记 每日一句正能量 不能在已经获得足够多的成功时,还对自己的能力保持怀疑,露出自信的微笑,走出自信的步伐,做一个自信的人! 前言 亚马逊云科技 (Amazon Web Services) 是全球云…...

南大通用数据库-Gbase-8a-学习-38-常规日志(general log)
目录 一、环境信息 二、general log的用途 三、general log相关参数介绍 四、LInux环境模拟实验 1、查看参数配置 2、开启general log 3、输入测试SQL 4、查看文件级别general log 5、改为表级别general log 6、再次输入测试SQL 7、查看gbase.general_log 一、环境信…...

汽车信息安全导图
尊敬的读者们,欢迎来到我的信息安全专栏。在这个专栏中,我将结合我在信息安全领域的开发经验,为大家深入浅出地讲解信息安全的重要性和相关知识点。 在数字化时代,信息成为了我们生活中不可或缺的一部分。我们的个人信息、交易数据、社交网络、公司机密等都以电子形式存储…...

【元宇宙】区块链,元宇宙最大化的驱动力
如今,一些观察者认为区块链是在结构上实现元宇宙的必要条件,而其他人则认为这种说法是荒谬的。人们对于区块链技术本身仍然有很多困惑,所以根本谈不上清楚地了解込块链技术与元宇宙的关系。所以,我们可以从区块链的定义开始介绍。…...

$ref属性的介绍与使用
在Vue.js中,$ref是一个特殊的属性,用于访问Vue组件中的DOM元素或子组件实例。它允许你直接访问组件内部的DOM元素或子组件,并且可以在需要时进行操作或修改。以下是有关$ref的详细介绍和示例演示,给大家做一个简单的介绍和概念区分…...

Holistic Evaluation of Language Models
本文是LLM系列文章,针对《Holistic Evaluation of Language Models》的翻译。 语言模型的整体评价 摘要1 引言2 前言3 核心场景4 一般指标5 有针对性的评估6 模型7 通过提示进行调整8 实验和结果9 相关工作和讨论10 缺失11 不足和未来工作12 结论 摘要 语言模型&a…...

android 布局 横屏 android横屏适配
一、刘海屏适配 1、layoutInDisplayCutoutMode属性 Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 这是一种默认的属性,在不进行明确指定的情况下,系…...

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书
北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书...

【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】
【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】 文章目录 【Linux】Ubuntu20.04版本配置pytorch环境2023.09.05【教程】一、安装Anaconda虚拟环境管理器二、创建虚拟环境并激活三、安装Pytorch四、测试pytorchReference 一、安装Anaconda虚拟环境管理器 首先进入…...

11 Python的正则表达式
概述 在上一节,我们介绍了Python的文件操作,包括:打开文件、读取文件、写入文件、关闭文件、文件指针移动、获取目录列表等内容。在这一节中,我们将介绍Python的正则表达式。正则表达式是一种强大的工具,用于在文本中进…...

关于工信部发布的app备案以及小程序备案流程
一、相关政策 通知:https://beian.miit.gov.cn/#/Integrated/lawStatute 腾讯备案:网站备案 首次备案-网站备案-文档中心-腾讯云 阿里备案:网站备案_ICP备案_备案迁移_备案-阿里云 二、遇到的问题 APP备案 安卓获取平台公钥方法…...

【高等数学基础知识篇】——不定积分
文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…...

python使用鼠标在图片上画框
python rect.py 图片文件夹先左击左上角,再右击右下角,画出一个框结果保存在res文件夹rect.py import cv2, sys, ospathsys.argv[1] imcv2.imread(path) alos.listdir(path) al.sort() if not os.path.exists(res): os.makedirs(res)def getInfo(event,…...

算法通关村第十五关:青铜-用4KB内存寻找重复元素
青铜挑战-用4KB内存寻找重复元素 位运算在查找元素中的妙用 题目要求: 给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中…...

SQL注入 - 宽字节注入
文章目录 SQL注入 - 宽字节注入宽字节注入前置知识宽字节靶场实战判断是否存在SQL注入判断位数判显错位判库名判表名判列名 SQL注入 - 宽字节注入 靶场 sqli - labs less-32 宽字节注入主要是绕过魔术引号的,数据库解析中除了UTF-8编码外的所有编码如:G…...

Flink基础
Flink architecture job manager is master task managers are workers task slot is a unit of resource in cluster, number of slot is equal to number of cores(超线程则slot2*cores), slot一组内存一些线程共享CPU when starting a cluster,job manager will allocate a …...

javaee spring aop 注解实现
切面类 package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*;//切面类 Aspect public class MyAdvice {//定义切点表达式Pointcut("execution(* com.test.service.impl.*.add(..))")public void pc(){}//B…...

Qt应用开发(基础篇)——按钮基类 QAbstractButton
一、前言 QAbstractButton类,继承于QWidget,是Qt按钮小部件的抽象基类,提供按钮常用的功能。 QAbstractButton按钮基类,它的子类(pushbutton、checkbox、toolbutton等)处理用户操作,并指定按钮的绘制方式。QAbstractBu…...

2023年最新的 前端面试题(个人总结)
目录 vue 1.vue2 和 vue3 的区别 2.vue2 和 vue3的原理 3.组合式api 和 选项式api 3. Proxy和object.defineproperty 4..v-show 与 v-if 的区别 5.计算属性和 watcher 6.虚拟DOM 7.key的作用是什么? 8.v-if 和 v-for 的优先级是什么? 9.vuex …...

服务器基本故障排查方法
1、加电类故障 定义 从上电(或复位)到自检完成这一段过程中电脑所发生的故障。可能的故障现象 1、 主机不能加电(如:电源风扇不转或转一下即停等)、有时不能加电、开机掉闸、机箱金属部分带电等; 2、 开机无显,开机报警; 3、 自检报错或死机、自检过程中…...

docker从零部署jenkins保姆级教程
jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简…...

什么是 MVVM 模式?
MVVM 模式 官方解释:Vue 虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。 什么是 MVVM 模式? MVVM 是一种新的开发模式,对比传统模式&…...

WebGL Varing变量的作用和内插过程,及执行Varing时涉及的图形装配、光栅化、颜色插值、片元着色器执行机制等详解
目录 前言 在 WebGL 或 OpenGL 中,“varying” 是一种用于在顶点着色器和片元着色器之间传递数据的特殊类型的变量。它允许在顶点着色器对数据进行处理后,在片元着色器中使用该处理后的数据进行进一步计算。 彩色三个点 编辑 彩色三个点示例代码…...