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

【Linux】虚拟地址空间

进程地址空间

  • 一、引入
  • 二、虚拟地址与物理内存的联系
  • 三、为什么要有虚拟地址空间


一、引入

对于C/C++程序,我们眼中的内存是这样的:
在这里插入图片描述

我们利用这种对于与内存的理解看一下下面这段代码:

在这里插入图片描述

运行结果:

在这里插入图片描述

观察父子进程中 val 变量的值,以及 val 的地址,我们发现父子进程中 val 的地址都是同一个地址 但是 val 的值并不相同,这是什么意思???内存中同一个地址却存放了两个不同的变量值?这显然是不可能的!地址具有唯一性,地址处存放的数据也具有唯一性!

一种合理的解释是:我们在C程序中所用到的地址的一个虚拟地址,并不是真正的物理内存地址!

在C/C++程序中我们所使用到的地址都是虚拟地址,这些虚拟地址组合起来就形成了虚拟地址空间,在Linux中虚拟地址空间被一个叫struct mm_struct的结构体所管理。

那么我们想知道这个程序的虚拟地址空间到底虚拟了多大的内存呢?
答案是:每个进程所能访问的最大的虚拟地址空间由计算机的硬件平台决定,具体地说是由 CPU 的位数决定的。

比如 32 位的 CPU 决定了虚拟地址空间的大小为 [0,232−1][0 ,2^{32}-1][02321],即 0x00000000 - 0xFFFFFFFF,也就是我们常说的 4 GB 虚拟内存空间。如果是 64 位的CPU,那么寻址范围是 [0,264−1][0 ,2^{64}-1][02641],即 0x0000000000000000 - 0xFFFFFFFFFFFFFFFF,共有 17 179 864 184 GB。

在这里插入图片描述

所以开头我们看到的内存其实是操作系统为我们程序虚拟的虚拟地址空间,这个虚拟地址空间的分配如下:

在这里插入图片描述

二、虚拟地址与物理内存的联系

经过上面的介绍我们知道了原来我们认为内存其实是虚拟地址空间,但是我们的代码与数据是要真真实实的存储在物理内存中,虚拟地址空间里面存放的仅仅是一些代码和数据的虚拟地址,那么我们是怎么通过虚拟地址来找到物理内存中的代码与数据呢?

答案是:通过一种数据结构——页表和一种硬件——MMU(内存管理单元),通过页表来进行虚拟地址与物理地址一 一对应从而找到相应的代码与数据

在这里插入图片描述

明白了这些后我们再来看开头的问题,为什么同一个地址存放的是不同的数据?

在这里插入图片描述
在父进程刚开始创建子进程时,子进程是的大多数数据(如:task_struct , 虚拟程地址空间等数据)都是以父进程为模板创建而来的,因此在最初时父进程与子进程的虚拟地址空间和页表是相同的,然后父进程尝试去修改变量 val 的值,由于进程具有独立性,操作系统不能让父进程的修改影响到子进程,于是发生了写时拷贝,操作系统先在物理内存中重新找一块空间保存了父进程修改后的 val 值,然后将父进程页表中对应物理地址进行更改。

注意:虚拟地址不更改,只改变物理地址!因为物理地址实实在在的变化了,虚拟地址没有必要更改。

三、为什么要有虚拟地址空间

可能你会觉得为什么要有虚拟地址空间呢?我们的进程为什么不直接使用物理地址呢?直接使用物理地址还能减少中间层提高运行的效率。

要回答这个问题我们可以从下面几个的角度来回答:

  • 防止地址随意访问,保护物理内存与其他进程

如果我们没有虚拟地址空间,当我们在内存中运行两个程序时,如果其中在一个进程中发生了越界访问,那么就有可能访问到其他的进程,这样进程之间就会互相影响了,进程的独立性就无法保证了
在这里插入图片描述
有了虚拟地址空间以后我们便可以通过页表来进行判断越界后的地址与接下来的操作是否统一的,如果是统一的便进行映射。

  • 将进程管理和内存管理进行解耦合!
    这里我们先来谈一谈malloc的本质,malloc函数是在调用后向OS申请内存,操作系统立马给你,还是需要的时候在给你呢 ?
    答案是:在你需要的时候给你!!!
    那么为什么会是这样的呢?因为操作系统要管理好所有的软硬件资源,OS一般不允许任何的浪费或者不高效的行为出现!

    我们在申请完内存以后并不一定立马使用,在你申请成功之后,和你使用之前,就以一段小小的时间窗口,这个空间没有被正常使用,但是别人用不了,于是这块空间就处于了闲置状态! 这是OS不允许的!

    于是我们在用malloc申请空间时OS其实是先通过task_struct找到虚拟地址空间和管理虚拟地址空间的mm_struct结构体,然后对于虚拟地址空间的内容进行修改并将mm_struct里关于堆区的范围进行修改,然后页表中关于虚拟地址的部分的内容会进行增加,但是新增的虚拟地址去没有与实际的物理地址建立映射关系,只有当你要使用你申请的空间时,OS才会真正的为你分配空间,并将页表中新增的虚拟地址对应的物理地址的映射关系建立起来!这时OS才真正的完成了内存分配!
    在这里插入图片描述

这个时候,我们将页表从中间一分为二,左边就是进程管理,右边就是内存管理,进程管理发生错误不影响内存管理,内存管理出现错误不影响进程管理,这样我们就实现了进程与内存管理的解耦合

在这里插入图片描述

  • 可以让进程以统一的视角,看待自己的代码和数据!
    在这里我们来讨论一下我们的程序在被编译的时候,没有被加载到内存,我们的程序内部有没有地址呢?
    答案是:有的!

    我们的C/C++程序在被编译时就采用了虚拟地址空间的方式进行编译,并将数据按照代码段,已初始化数据段,未初始化数据段等方式进行分类存储。当我们的程序加载进内存时,我们的程序可以分批式的将程序的数据段,代码段,分批的加载进地址空间中。
    注意:编译好的程序并没有堆区和栈区,只有加载进内存时形成进程时才有堆区与栈区!

有了地址空间之后我们的进程便不再关心代码与数据究竟在内存中的哪里,我们每个进程都是以统一的视角——虚拟地址空间的方式来待自己的代码与数据。

相关文章:

【Linux】虚拟地址空间

进程地址空间一、引入二、虚拟地址与物理内存的联系三、为什么要有虚拟地址空间一、引入 对于C/C程序,我们眼中的内存是这样的: 我们利用这种对于与内存的理解看一下下面这段代码: 运行结果: 观察父子进程中 val 变量的值&…...

四平方和题解(二分习题)

四平方和 暴力做法 Y总暴力做法&#xff0c;蓝桥云里能通过所有数据 总结&#xff1a;暴力也分好坏&#xff0c;下面这份代码就是写的好的暴力 如何写好暴力:1. 按组合枚举 2. 写好循环结束条件&#xff0c;没必要循环那么多次 #include<iostream> #include<cmath>…...

一篇文章搞定js正则表达式

我们测试正则表达式是否正确的方法有很多&#xff0c;例如通过正则表达式找到拼配的字符串&#xff1a; 在vscode编辑器中点击搜索框中的第三个按钮就可以实现&#xff1a; 或者 在浏览器中的控制台也可以实现&#xff1a; 我们可以通过下面的在线网站来测试你写的正则是否正确…...

[数据结构] 用两个队列实现栈详解

文章目录 一、队列实现栈的特点分析 1、1 具体分析 1、2 整体概括 二、队列模拟实现栈代码的实现 2、1 手撕 队列 代码 queue.h queue.c 2、2 用队列模拟实现栈代码 三、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&#xff1…...

官宣|Apache Flink 1.17 发布公告

Apache Flink PMC&#xff08;项目管理委员&#xff09;很高兴地宣布发布 Apache Flink 1.17.0。Apache Flink 是领先的流处理标准&#xff0c;流批统一的数据处理概念在越来越多的公司中得到认可。得益于我们出色的社区和优秀的贡献者&#xff0c;Apache Flink 在 Apache 社区…...

动态内存管理+动态通讯录【C进阶】

文章目录为什么存在动态内存分配❓&#x1f449;动态内存函数&#x1f448;malloc&freecallocrealloc❌常见的动态内存错误❌练习题&#x1fae0;C/C程序的内存开辟&#x1f914;柔性数组柔性数组的特点柔性数组的优势:star:动态通讯录:star:初始化添加销毁为什么存在动态内…...

基于pytorch+Resnet101加GPT搭建AI玩王者荣耀

本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorch自带的预训练模型"resnet101-5d3b4d8f.pth"本资源整理自网络&#xff0c;源地址&#xff1a;https://github.com/FengQuanLi/ResnetGPT注意运行本代码需要注意以下几点 注意&#xff01;&a…...

多线程控制讲解与代码实现

多线程控制 回顾一下线程的概念 线程是CPU调度的基本单位&#xff0c;进程是承担分配系统资源的基本单位。linux在设计上并没有给线程专门设计数据结构&#xff0c;而是直接复用PCB的数据结构。每个新线程&#xff08;task_struct{}中有个指针都指向虚拟内存mm_struct结构&am…...

清晰概括:进程与线程间的区别的联系

相关阅读&#xff1a; &#x1f517;通俗简介&#xff1a;操作系统之进程的管理与调度&#x1f517;如何使用 jconsole 查看Java进程中线程的详细信息&#xff1f; 目录 一、进程与线程 1、进程 2、线程 二、进程与线程之间的区别和联系 1、区别 2、联系 一、进程与线程 …...

自定义类型 (结构体)

文章目录&#x1f4ec;结构体的声明&#x1f50e;1.结构的基础知识&#x1f50e;2.结构的声明&#x1f50e;3.特殊的声明&#x1f50e;4.结构的自引用&#x1f50e;5.结构体变量的定义和初始化&#x1f50e;6.结构体内存对齐&#x1f50e;7.修改默认对齐数&#x1f50e;8.结构体…...

第14届蓝桥杯STEMA测评真题剖析-2023年3月12日Scratch编程初中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第113讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…...

程序员接私活一定要知道的事情,我走的弯路你们都别走了

文章目录前言一、程序员私活的种类1.兼职职位众包2.自由职业者驻场3.项目整包二、这3种私活可以接1.有熟人2.七分熟的项目3.需求明确的项目三、这3种私活不要接1.主动找上门的中介单2.一味强调项目简单好做3.外行人给你拉的项目四、接单的渠道1.线下渠道2.线上渠道3.比较靠谱的…...

十二届蓝桥杯省赛c++(下)

1、 拿到题目一定要读懂题意&#xff0c;不要看到这题目就上来模拟什么闰年&#xff0c;一月的天数啥的。这个题目问你当天的时间&#xff0c;就说明年月日跟你都没关系&#xff0c;直接无视就好了。 #include <iostream> #include <cstring> #include <algori…...

数据结构与算法——堆的基本存储

目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大…...

来了来了 !!!K8s指令、yaml部署

文章目录k8s资源清单一、k8s资源指令1、基础操作2、命令手册二、资源清单1、required2、optional3、other4、资源清单格式5、常用命令三、部署实例1、nginx3、eureka部署k8s资源清单 一、k8s资源指令 1、基础操作 #创建且运行一个pod #deployment、rs、pod被自动创建 kubect…...

spring-cloud-feign实战笔记

feign 配置 针对单个feign接口进行配置feign:client:config:# feignName 注意这里与contextId一致&#xff0c;不能写成name&#xff08;FeignClientFactoryBean#configureFeign&#xff09;# 不能写成 client-b (微服务名称)&#xff0c;否则不生效helloFeignClient: # conte…...

【Pytorch】利用PyTorch实现图像识别

本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 这是目录使用torchvision库的datasets类加载常用的数据集或自定义数据集使用torchvision库进行数据增强和变换&#xff0c;自定义自己的图像分类数据集并使用torchvision库加载它们使…...

在家查找下载最新《柳叶刀》The Lancet期刊文献的方法

《柳叶刀》The Lancet简介&#xff1a; 《柳叶刀》The Lancet是全球顶尖综合性医学期刊&#xff0c;每周都会发表来自世界各地顶尖科学家的研究精粹。是由托马斯威克利&#xff08;Thomas Wakley&#xff09;创办于1823年&#xff0c;由爱思唯尔&#xff08;Elsevier&#xff…...

当下的网络安全行业前景到底怎么样?还能否入行?

前言网络安全现在是朝阳行业&#xff0c;缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大常听到很多人不知道学习网络安全能做什么&#xff0c;发展前景好吗&#xff1f;今天我就在这里给大家介绍一下。网络安全作为目前比较火的朝阳行业&…...

SpringCloud:SpringAMQP介绍

Spring AMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。Spring AMQP官方地址 Spring AMQP提供了三个功能&#xff1a; 自动声明队列、交换机及其绑定关系基于注解的监听器模式&#xff0c;异步接收消息封…...

Labview信号采集与分析系统:基础框架与二次开发的宝藏

Labview 信号采集与分析系统&#xff08;含报告&#xff09; 系统可作自己设计的基础框架&#xff0c;然后在基础上进行二次开发。 系统功能&#xff1a; (1&#xff09;可采集传感器的真实信号&#xff1b; (2&#xff09;可采集 labview 产生的模拟信号&#xff1b; (3&#…...

ESP32低功耗项目实战:用Light Sleep和Deep Sleep保持LED亮度的完整代码与避坑指南

ESP32低功耗项目实战&#xff1a;用Light Sleep和Deep Sleep保持LED亮度的完整代码与避坑指南 在物联网设备开发中&#xff0c;电池续航往往是决定产品成败的关键因素。想象一下&#xff0c;你设计的智能门锁因为频繁更换电池而被用户抱怨&#xff0c;或者环境监测传感器因为电…...

Matlab实战:5种方法可视化MIMO/SISO信道容量差异(附完整代码)

Matlab实战&#xff1a;5种方法可视化MIMO/SISO信道容量差异&#xff08;附完整代码&#xff09; 无线通信系统的性能评估离不开对信道容量的深入理解。对于刚接触多天线系统的学习者来说&#xff0c;如何直观比较不同天线配置下的性能差异是一个常见痛点。本文将用Matlab带你探…...

Linux下adb调试小米手机报错Exception的5种解决方法(附详细排查步骤)

Linux下adb调试小米手机报错Exception的5种深度解决方案 最近在Linux环境下用adb调试小米手机时&#xff0c;不少开发者遇到了Exception occurred while executing put这个让人头疼的错误。作为一名常年与adb打交道的开发者&#xff0c;我深知这种问题一旦出现&#xff0c;轻则…...

AndEngine纹理打包优化:使用TexturePackerExtension提升游戏性能

AndEngine纹理打包优化&#xff1a;使用TexturePackerExtension提升游戏性能 【免费下载链接】AndEngine Free Android 2D OpenGL Game Engine 项目地址: https://gitcode.com/gh_mirrors/an/AndEngine 在Android游戏开发中&#xff0c;纹理管理是影响游戏性能的关键因素…...

终极指南:Claude Squad项目结构解析与核心模块功能详解

终极指南&#xff1a;Claude Squad项目结构解析与核心模块功能详解 【免费下载链接】claude-squad Manage local AI agents like Claude Code and Aider. 10x your productivity 项目地址: https://gitcode.com/gh_mirrors/cl/claude-squad Claude Squad是一款能够帮助开…...

从零部署Jetson Xavier NX:Ubuntu 20.04系统烧录、CUDA环境配置与深度学习框架实战指南

1. 开箱与硬件准备 第一次拿到Jetson Xavier NX开发板时&#xff0c;我差点被它小巧的尺寸骗了——这个巴掌大的板子居然藏着384个CUDA核心和48个Tensor核心。我入手的是带128GB SSD的EMMC版本&#xff0c;实测下来这套配置跑YOLOv5这类中等规模的模型完全够用。开箱清单里除了…...

手把手调试:如何用Windbg或Linux下工具查看并修改PCIe设备的BAR寄存器?

实战指南&#xff1a;Windows与Linux下PCIe设备BAR寄存器调试全流程 当一块PCIe网卡突然无法被系统识别&#xff0c;或者GPU设备在资源分配时发生冲突&#xff0c;作为驱动工程师的你该如何快速定位问题&#xff1f;本文将带你深入PCIe设备的底层世界&#xff0c;从BDF寻址到B…...

Mac用户必看:OpenClaw一键安装百川2-13B-4bits量化模型指南

Mac用户必看&#xff1a;OpenClaw一键安装百川2-13B-4bits量化模型指南 1. 为什么选择这个组合&#xff1f; 上周我在调试一个自动化文档处理流程时&#xff0c;发现常规的7B模型在处理复杂表格时经常漏掉关键字段。在测试了多个开源模型后&#xff0c;百川2-13B的表格理解能…...

【2026年6月最新】英语四级历年真题及答案解析PDF电子版(2015-2025年12月)

2026年6月全国大学英语四级考试安排2026年上半年全国大学英语四级考试&#xff08;CET4&#xff09;定于6月13日举行。2025年12月四级真题资料包提供2025年12月英语四级考试全套备考资料&#xff1a;完整版考试真题试卷详细答案解析高清听力音频MP3文件PDF电子版文档&#xff0…...