【Linux】虚拟地址空间
进程地址空间
- 一、引入
- 二、虚拟地址与物理内存的联系
- 三、为什么要有虚拟地址空间
一、引入
对于C/C++程序,我们眼中的内存是这样的:
我们利用这种对于与内存的理解看一下下面这段代码:
运行结果:
观察父子进程中 val 变量的值,以及 val 的地址,我们发现父子进程中 val 的地址都是同一个地址 但是 val 的值并不相同,这是什么意思???内存中同一个地址却存放了两个不同的变量值?这显然是不可能的!地址具有唯一性,地址处存放的数据也具有唯一性!
一种合理的解释是:我们在C程序中所用到的地址的一个虚拟地址,并不是真正的物理内存地址!
在C/C++程序中我们所使用到的地址都是虚拟地址,这些虚拟地址组合起来就形成了虚拟地址空间,在Linux中虚拟地址空间被一个叫struct mm_struct
的结构体所管理。
那么我们想知道这个程序的虚拟地址空间到底虚拟了多大的内存呢?
答案是:每个进程所能访问的最大的虚拟地址空间由计算机的硬件平台决定,具体地说是由 CPU 的位数决定的。
比如 32 位的 CPU 决定了虚拟地址空间的大小为 [0,232−1][0 ,2^{32}-1][0,232−1],即 0x00000000 - 0xFFFFFFFF,也就是我们常说的 4 GB 虚拟内存空间。如果是 64 位的CPU,那么寻址范围是 [0,264−1][0 ,2^{64}-1][0,264−1],即 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++程序在被编译时就采用了虚拟地址空间的方式进行编译,并将数据按照代码段,已初始化数据段,未初始化数据段等方式进行分类存储。当我们的程序加载进内存时,我们的程序可以分批式的将程序的数据段,代码段,分批的加载进地址空间中。
注意:编译好的程序并没有堆区和栈区,只有加载进内存时形成进程时才有堆区与栈区!
有了地址空间之后我们的进程便不再关心代码与数据究竟在内存中的哪里,我们每个进程都是以统一的视角——虚拟地址空间的方式来待自己的代码与数据。
相关文章:
![](https://img-blog.csdnimg.cn/07c2ecf3bb7444699299f16e8a4759de.png)
【Linux】虚拟地址空间
进程地址空间一、引入二、虚拟地址与物理内存的联系三、为什么要有虚拟地址空间一、引入 对于C/C程序,我们眼中的内存是这样的: 我们利用这种对于与内存的理解看一下下面这段代码: 运行结果: 观察父子进程中 val 变量的值&…...
![](https://img-blog.csdnimg.cn/3111202f80e844a6afc0f2e85277a6a9.png)
四平方和题解(二分习题)
四平方和 暴力做法 Y总暴力做法,蓝桥云里能通过所有数据 总结:暴力也分好坏,下面这份代码就是写的好的暴力 如何写好暴力:1. 按组合枚举 2. 写好循环结束条件,没必要循环那么多次 #include<iostream> #include<cmath>…...
![](https://img-blog.csdnimg.cn/d6c3b95510cc4b9cae3a32f9e85737d9.png)
一篇文章搞定js正则表达式
我们测试正则表达式是否正确的方法有很多,例如通过正则表达式找到拼配的字符串: 在vscode编辑器中点击搜索框中的第三个按钮就可以实现: 或者 在浏览器中的控制台也可以实现: 我们可以通过下面的在线网站来测试你写的正则是否正确…...
![](https://img-blog.csdnimg.cn/216fc6cfbe78480f9022f63cbfa9fd57.png)
[数据结构] 用两个队列实现栈详解
文章目录 一、队列实现栈的特点分析 1、1 具体分析 1、2 整体概括 二、队列模拟实现栈代码的实现 2、1 手撕 队列 代码 queue.h queue.c 2、2 用队列模拟实现栈代码 三、总结 🙋♂️ 作者:Ggggggtm 🙋♂️ 👀 专栏࿱…...
![](https://img-blog.csdnimg.cn/img_convert/86434c8c45e9878d20b2b4b476188b30.gif)
官宣|Apache Flink 1.17 发布公告
Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.17.0。Apache Flink 是领先的流处理标准,流批统一的数据处理概念在越来越多的公司中得到认可。得益于我们出色的社区和优秀的贡献者,Apache Flink 在 Apache 社区…...
![](https://img-blog.csdnimg.cn/b28da00aaa2e4b9c9459ef0ff3b8a8a0.png)
动态内存管理+动态通讯录【C进阶】
文章目录为什么存在动态内存分配❓👉动态内存函数👈malloc&freecallocrealloc❌常见的动态内存错误❌练习题🫠C/C程序的内存开辟🤔柔性数组柔性数组的特点柔性数组的优势:star:动态通讯录:star:初始化添加销毁为什么存在动态内…...
![](https://img-blog.csdnimg.cn/img_convert/3ab5166112c9f7b31d93fcc452d1611e.png)
基于pytorch+Resnet101加GPT搭建AI玩王者荣耀
本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorch自带的预训练模型"resnet101-5d3b4d8f.pth"本资源整理自网络,源地址:https://github.com/FengQuanLi/ResnetGPT注意运行本代码需要注意以下几点 注意!&a…...
![](https://img-blog.csdnimg.cn/311a1859265f4aea9c78c53700972340.png#pic_center)
多线程控制讲解与代码实现
多线程控制 回顾一下线程的概念 线程是CPU调度的基本单位,进程是承担分配系统资源的基本单位。linux在设计上并没有给线程专门设计数据结构,而是直接复用PCB的数据结构。每个新线程(task_struct{}中有个指针都指向虚拟内存mm_struct结构&am…...
![](https://img-blog.csdnimg.cn/15adea2b8c354e74a05dd123457f009e.png)
清晰概括:进程与线程间的区别的联系
相关阅读: 🔗通俗简介:操作系统之进程的管理与调度🔗如何使用 jconsole 查看Java进程中线程的详细信息? 目录 一、进程与线程 1、进程 2、线程 二、进程与线程之间的区别和联系 1、区别 2、联系 一、进程与线程 …...
![](https://img-blog.csdnimg.cn/06209b4a9cf448e08e1db61fa1ee1b78.gif)
自定义类型 (结构体)
文章目录📬结构体的声明🔎1.结构的基础知识🔎2.结构的声明🔎3.特殊的声明🔎4.结构的自引用🔎5.结构体变量的定义和初始化🔎6.结构体内存对齐🔎7.修改默认对齐数🔎8.结构体…...
![](https://img-blog.csdnimg.cn/img_convert/66f482ffc319593db307afe0fca634d8.png)
第14届蓝桥杯STEMA测评真题剖析-2023年3月12日Scratch编程初中级组
[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第113讲。 蓝桥杯选拔赛现已更名为STEMA,即STEM 能力测试,是蓝桥杯大赛组委会与美国普林斯顿多…...
![](https://img-blog.csdnimg.cn/521e60d8459b40f2bd654b1a410926db.png)
程序员接私活一定要知道的事情,我走的弯路你们都别走了
文章目录前言一、程序员私活的种类1.兼职职位众包2.自由职业者驻场3.项目整包二、这3种私活可以接1.有熟人2.七分熟的项目3.需求明确的项目三、这3种私活不要接1.主动找上门的中介单2.一味强调项目简单好做3.外行人给你拉的项目四、接单的渠道1.线下渠道2.线上渠道3.比较靠谱的…...
![](https://img-blog.csdnimg.cn/f0f09e196d4b47aa8b6e1a2666fb7e1a.png)
十二届蓝桥杯省赛c++(下)
1、 拿到题目一定要读懂题意,不要看到这题目就上来模拟什么闰年,一月的天数啥的。这个题目问你当天的时间,就说明年月日跟你都没关系,直接无视就好了。 #include <iostream> #include <cstring> #include <algori…...
![](https://img-blog.csdnimg.cn/d9d6220a58f14fff852ed7aa2d9c60c6.png)
数据结构与算法——堆的基本存储
目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质: 堆中某个节点的值总是不大…...
![](https://www.ngui.cc/images/no-images.jpg)
来了来了 !!!K8s指令、yaml部署
文章目录k8s资源清单一、k8s资源指令1、基础操作2、命令手册二、资源清单1、required2、optional3、other4、资源清单格式5、常用命令三、部署实例1、nginx3、eureka部署k8s资源清单 一、k8s资源指令 1、基础操作 #创建且运行一个pod #deployment、rs、pod被自动创建 kubect…...
![](https://www.ngui.cc/images/no-images.jpg)
spring-cloud-feign实战笔记
feign 配置 针对单个feign接口进行配置feign:client:config:# feignName 注意这里与contextId一致,不能写成name(FeignClientFactoryBean#configureFeign)# 不能写成 client-b (微服务名称),否则不生效helloFeignClient: # conte…...
![](https://img-blog.csdnimg.cn/cf97e28622e5477dbb237ed847f6b861.png)
【Pytorch】利用PyTorch实现图像识别
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录使用torchvision库的datasets类加载常用的数据集或自定义数据集使用torchvision库进行数据增强和变换,自定义自己的图像分类数据集并使用torchvision库加载它们使…...
![](https://img-blog.csdnimg.cn/552f7b772d044586bd3acea451d1f0da.png)
在家查找下载最新《柳叶刀》The Lancet期刊文献的方法
《柳叶刀》The Lancet简介: 《柳叶刀》The Lancet是全球顶尖综合性医学期刊,每周都会发表来自世界各地顶尖科学家的研究精粹。是由托马斯威克利(Thomas Wakley)创办于1823年,由爱思唯尔(Elsevierÿ…...
![](https://img-blog.csdnimg.cn/img_convert/4a67301fda8cad1b9d06376acbf3f5e0.png)
当下的网络安全行业前景到底怎么样?还能否入行?
前言网络安全现在是朝阳行业,缺口是很大。不过网络安全行业就是需要技术很多的人达不到企业要求才导致人才缺口大常听到很多人不知道学习网络安全能做什么,发展前景好吗?今天我就在这里给大家介绍一下。网络安全作为目前比较火的朝阳行业&…...
![](https://img-blog.csdnimg.cn/7cc0a8fd9de54fdfbab70426b25ad80a.png#pic_center)
SpringCloud:SpringAMQP介绍
Spring AMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便。Spring AMQP官方地址 Spring AMQP提供了三个功能: 自动声明队列、交换机及其绑定关系基于注解的监听器模式,异步接收消息封…...
![](https://img-blog.csdnimg.cn/2d25a1c2aaa64dba8c2ee4d89b61dd81.png)
第十三届蓝桥杯省赛 python B组复盘
文章目录前言主要内容🦞试题 A:排列字母思路代码🦞试题 B:寻找整数思路代码🦞试题 C:纸张尺寸思路代码🦞试题 D:数位排序思路代码🦞试题 E:蜂巢思路代码&…...
![](https://img-blog.csdnimg.cn/img_convert/3c372ecd80f6ecc8ab97a1afe8c85c23.png)
SQL注入之HTTP请求头注入
Ps: 先做实验,在有操作的基础上理解原理会更清晰更深入。 一、实验 sqli-lab 1. User-Agent注入 特点:登陆后返回用户的 User-Agent --> 服务器端可能记录用户User-Agent 输入不合法数据报错 payload: and updatexml(1,concat("~&…...
![](https://www.ngui.cc/images/no-images.jpg)
Metasploit详细教程
第一步:安装和启动Metasploit 您可以从Metasploit官方网站下载适用于您操作系统的Metasploit框架。安装Metasploit框架后,您可以使用以下命令来启动Metasploit: msfconsole该命令将启动Metasploit控制台。 第二步:查找目标设备…...
![](https://img-blog.csdnimg.cn/0b1ce6de8d8d47c2822544c669229252.png#pic_center)
【ChatGPT】Notion AI 从注册到体验:如何免费使用
欢迎关注【youcans的GPT学习笔记】原创作品,火热更新中 【ChatGPT】Notion AI 从注册到体验1. Notion AI 介绍1.1 Notion AI 简介1.2 Notion AI 的核心能力1.3 Notion AI 与 ChatGPT 的比较2. Notion AI 国内用户注册2.1 PC 端用户注册2.2 移动端用户注册3. Notion …...
![](https://img-blog.csdnimg.cn/img_convert/a789be065d604c9ba9e0812f71a9a512.png)
每个开发人员都需要掌握的10 个基本 SQL 命令
SQL 是一种非常常见但功能强大的工具,它可以帮助从任何数据库中提取、转换和加载数据。数据查询的本质在于SQL。随着公司和组织发现自己处理的数据量迅速增加,开发人员越来越需要有效地使用数据库来处理这些数据。所以想要暗恋数据领域,SQL是…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue项目预渲染
前言 Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用。在一个单页应用中,往往只有一个 html 文件,然后根据访问的 url 来匹配对应的路由脚本,动态地渲染页面内容。单页应用…...
![](https://img-blog.csdnimg.cn/73f78117b887471b8faca4676b1d9396.jpeg)
可别再用BeanUtils了(性能拉胯),试试这款转换神器
老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。有的人会说,我直接使用get/set方法。没错,get/set方法的确可以解决,而且也是性能较高的处理方法,但是大家有没有想过,要…...
![](https://www.ngui.cc/images/no-images.jpg)
Transformer 杂记
Transformer输入的是token,来自语言序列的启发。卷积神经网络(CNN)是如何进行物种分类的.它实际是直接对特征进行识别,也就是卷积神经网络最基本的作用:提取图像的特征。例如:卷积神经网络判断一只狗的时候,…...
![](https://img-blog.csdnimg.cn/img_convert/51b309582bcf74f7079c27d438412cb2.png)
实现异步的8种方式
前言异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是典型的可以通…...
![](https://img-blog.csdnimg.cn/c6aacba6f52a41bb81ca5f9bbd7ada8f.png#pic_center)
Github隐藏功能显示自己的README,个人化你的Github主页
Github隐藏功能:显示自己的README 你可能还不知道,GitHub 悄悄上线了一个全新的个人页功能,显示一个自定义的 README.MD 在个人首页。要激活此功能,需要新建一个与自己 ID 同名的 Repository,新 Repo 里的README.MD将…...
![](https://img-blog.csdnimg.cn/2021021823085787.gif#pic_center)
常州网站建设推广公司/长沙网络推广网站制作
前言 前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题。 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例是如何创建,它的模式是什么样的。 在默认的情况下Servlet容器对声…...
![](/images/no-images.jpg)
广州网站建设网站/网站优化怎么操作
保留两位小数点 SELECT ROUND(CAST(field1 AS DOUBLE)/field2, 2) * 100 FROM TB; 不保留 SELECT CAST(field1 AS FLOAT)/field2 * 100 FROM TB 然後再頁面顯示時再加上“%” 转载于:https://www.cnblogs.com/MagicAsa/p/9856651.html...
![](/images/no-images.jpg)
自由策划企业网站管理系统破解版/google代理
Metasploit 之使用socket通信的webshell简单分析upload (Van Helsing) | 2013-01-08 21:530x01 前言常规的webshell都是调用该语言中常用函数来完成读取、执行等操作,从协议上来讲是采用http/https协议。但是和服务器通信还有另外一种方式:socket通信。常见的脚本语…...
![](/images/no-images.jpg)
wordpress个人简历/最大的推广平台
Nginx服务器在互联网系统架构部署中的应用nginx主要有三种应用:1.互联网系统部署时做反向代理正向代理是指:通过内网访问外网应用服务反向代理是指:通过外网访问内网应用服务nginx可以对内网服务进行反向代理,使得外网可以正常访问…...
![](https://img-blog.csdnimg.cn/img_convert/54707843503cbaa9f7b0d003a7e5c04c.png)
如何对上传的网站做代码修改/自动收录网
第一章 成局在胸一一用工具对 SQL 整体优化 第二章 风驰电掣一一有效缩短SQL 优化过程 第三章规蹈矩一一如何读懂SQL 执行计划 第四章 运筹幢幢一一左右 SQL执行计划妙招 第五章感受体系结构让SQL飞 第六章 且慢,体验逻辑结构让SQL飞 第七章探寻表的设计让SQL飞 第…...
![](/images/no-images.jpg)
青海旭云网络做网站需要多少钱/游戏推广员好做吗
到目前为止,我们仅用到两个线程:主线程和一个子线程。然而,你的程序可以创建所需的更多线程。例如,下面的程序创建了三个子线程: 1 // Create multiple threads.2 class NewThread implements Runnable {3 String …...