当前位置: 首页 > news >正文

【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】地址空间概念

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

视频集中存储/直播点播平台EasyDSS点播文件分类功能新升级

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

JavaScript基础06——let和var两个关键字有啥不同

哈喽&#xff0c;小伙伴们大家好&#xff0c;我是雷工&#xff01; 每日学习一点点&#xff0c;今天继续学习JavaScript基础知识&#xff0c;下面是学习笔记。 1、变量的本质 内存&#xff1a;计算机中存储数据的地方&#xff0c;相当于一空间。 变量的本质&#xff1a;是程序…...

Apache Doris 2.0.1 1.2.7 版本正式发布!

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

YOLOv5算法改进(11)— 替换主干网络之EfficientNetv2

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。EfficientNetV2是一个网络模型&#xff0c;旨在提供更小的模型和更快的训练速度。它是EfficientNetV1的改进版本。EfficientNetV2通过使用更小的模型参数和采用一种称为Progressive Learning的渐进学习策略来实现这一目标。…...

Lombok讲解

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

【Android】功能丰富的dumpsys activity

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

亚马逊云科技 云技能孵化营——我的云技能之旅

文章目录 每日一句正能量前言活动流程后记 每日一句正能量 不能在已经获得足够多的成功时&#xff0c;还对自己的能力保持怀疑&#xff0c;露出自信的微笑&#xff0c;走出自信的步伐&#xff0c;做一个自信的人&#xff01; 前言 亚马逊云科技 (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 一、环境信…...

汽车信息安全导图

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

【元宇宙】区块链,元宇宙最大化的驱动力

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

$ref属性的介绍与使用

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

Holistic Evaluation of Language Models

本文是LLM系列文章&#xff0c;针对《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 这是一种默认的属性&#xff0c;在不进行明确指定的情况下&#xff0c;系…...

北京已收录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的正则表达式

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

关于工信部发布的app备案以及小程序备案流程

一、相关政策 通知&#xff1a;https://beian.miit.gov.cn/#/Integrated/lawStatute 腾讯备案&#xff1a;网站备案 首次备案-网站备案-文档中心-腾讯云 阿里备案&#xff1a;网站备案_ICP备案_备案迁移_备案-阿里云 二、遇到的问题 APP备案 安卓获取平台公钥方法&#xf…...

【高等数学基础知识篇】——不定积分

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

python使用鼠标在图片上画框

python rect.py 图片文件夹先左击左上角&#xff0c;再右击右下角&#xff0c;画出一个框结果保存在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,…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架

1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...