Linux 进程:程序地址空间 与 虚拟内存
目录
- 一、程序地址空间
- 二、虚拟地址空间
- 1.虚拟内存的原理
- 2.使用虚拟内存的原因?
- 3.如何实现虚拟空间?
- 4.使用虚拟内存的好处
本文主要介绍程序地址空间和虚拟地址空间的概念,理解了虚拟地址空间,才可以更好的理解物理内存和进程pcb之间的关系。
一、程序地址空间
程序是存储在硬盘上的一堆代码指令,如果要运行程序,CPU就会从硬盘中把程序指令拿出来,加载到我们的内存中。(所以当运行的程序太多的时候,内存空间就会不足)但是程序本身是不占用内存空间的,因为不使用程序的时候,代码都存储在硬盘中,要运行程序的时候,才会将程序加载到内存。
相应的,为了更好的运行程序,内存空间被划分成了多个区域,每个区域都有其对应的作用,这里我们就需要简单的了解一下内存空间的布局。
如图,这就是内存空间(也可以叫地址空间)的布局。
用32位系统来说,32位系统对应的内存大小是4G。内存空间被分成两部分:用户空间和内核空间。其中内核空间是不可以直接访问的,必须通过系统提供的系统调用接口去访问内核的功能。内存空间的高地址处是内核空间,低地址处才是用户空间。
用户空间从低地址到高地址处,依次被划分成这几部分:代码区、初始化数据区、未初始化数据区、堆区、共享区、栈区、运行参数和环境变量。
来简单看一下这些部分的作用。
- 代码区:存储程序代码。
- 初始化数据区:存储已经初始化的数据。
- 未初始化数据区:存储未初始化的数据。
- 堆区:我们在C语言中常使用的malloc函数,就是从堆区申请的空间。
- 共享区:空间可以供多个进程一起访问。
- 栈区:运行函数时,需要对函数进行压栈,函数退出后,需要将函数出栈。
蓝色箭头就是栈的增长方向,栈从高地址向低地址增长。红色箭头是堆的增长方向,堆从低地址向高地址增长。
二、虚拟地址空间
简单了解了程序地址空间后,接下来就可以认识虚拟地址空间了,虚拟地址空间也叫虚拟内存。
Linux中:pcb是task_struck结构体,虚拟内存是mm_struct结构体。
进程就是运行中的程序,进程需要通过访问内存空间来得到它想要的数据,可是每个进程访问的内存空间其实是假的,或者说是虚拟的。
比如:进程A中有一个变量 int a,这个程序的作用是,打印出a变量的地址,打印出的结果是0x11。如果是刚开始学习的话,我会毫不犹豫地认为这就是这个变量在内存中的地址,但其实并不是。这其实是一个虚假的地址,并不一定是该变量在内存空间中的真实地址。
也就是说,进程每次访问的空间,其实都访问的是虚假的地址空间,或者叫虚拟内存更合适。示意图如下:
1.虚拟内存的原理
进程在运行时,需要访问物理内存中的数据,但进程和物理内存并没有直接进行数据交互,而是通过虚拟内存和页表进行交互。
虚拟内存是对物理内存的映射,物理内存中的地址会映射到虚拟内存中,但是物理内存映射到虚拟内存后,并不一定还是原来的位置。如图,物理空间地址为0x24的空间,映射到虚拟内存后,映射到地址为0x11的空间中。
而页表的作用就是,保存物理内存和虚拟内存的映射关系,比如物理内存中地址为0x24的空间映射到虚拟内存中是地址为0x11的空间,那么页表就会保存这个映射关系。保存了这个映射关系后,当进程访问地址为0x11的空间的数据时,系统就可以通过页表的映射关系去物理内存中找到对应的数据。
系统中每个进程都会有一个对应的虚拟内存,进程直接访问的都是虚拟内存的空间。
2.使用虚拟内存的原因?
如果不使用虚拟内存,进程直接与物理内存进行交互。那么一个进程就可能访问了其他进程的空间,就有可能去修改其他进程的数据,这样就会造成程序运行混乱。
比如:如果进程直接和物理内存交互,进程A申请并使用了地址为0x11的空间,进程B此时也访问了0x11的空间,并修改了其中的数据,那么进程A下次访问这块空间的时候,访问到的数据就不是之前的了。
3.如何实现虚拟空间?
虚拟空间其实就是一个描述。假如电脑的物理内存是4G,那么操作系统会欺骗进程,系统会告诉每个进程:这4个G的天下都是你的,你想怎么用就怎么用,爱用哪个地址就用哪个地址。注意:是每个进程都有自己的虚拟空间。
系统给每个进程都描述了一个虚拟的美景:看到你面前的江山了吗,这4个G都是你的。在Linux中,这个描述就是mm_struct结构体。做戏要做全套,欺骗也是如此。为了让自己的谎言更逼真,这个描述是十分细致的。上文中简单介绍了物理内存的划分,在虚拟内存的描述中,系统也详细的描述了一下虚拟内存的划分。比如:栈在虚拟内存的哪里?堆在虚拟内存的哪里?
如果进程此时要申请地址为0x33,大小是4字节的空间,那么虚拟内存中这块空间就会分配给进程。但实际上是在物理内存中申请了一块大小符合的空间,然后这块空间的地址就与虚拟内存的0x33这块空间建立了映射关系,这个关系被存储在页表中。如果进程要访问地址为0x33空间中的数据,系统就会查找页表,在页表中查找这个虚拟地址对应的真实的物理内存的空间是什么,进而进行数据的访问。
系统欺骗进程,告诉每个进程它们都拥有全部的4G空间,但实际上是所有进程共用这4G空间。那么就可能会有多个进程同时申请地址为0x11的空间,因为进程觉得自己拥有全部的空间,那么自己想申请哪个就申请哪个。但此时不用慌,因为进程申请的是虚拟空间的0x11,可是映射到物理内存上就是不同的空间,因此,进程有很大的自由度。解决了上文中直接使用物理内存而存在的问题。
4.使用虚拟内存的好处
(1)更好的利用了物理内存的碎片空间,进程申请了虚拟内存空间后,系统会在物理内存中找到合适的空间交给它,这样可以避免对大块空间的浪费。提高了物理内存的利用率。
(2)可以离散的存储数据。
(3)每个进程都有独自的虚拟内存,这样就不担心和其他的进程地址发生冲突。
相关文章:
Linux 进程:程序地址空间 与 虚拟内存
目录一、程序地址空间二、虚拟地址空间1.虚拟内存的原理2.使用虚拟内存的原因?3.如何实现虚拟空间?4.使用虚拟内存的好处本文主要介绍程序地址空间和虚拟地址空间的概念,理解了虚拟地址空间,才可以更好的理解物理内存和进程pcb之间…...
python 密码学编程
最近在看一本书。名字是 python密码学编程。在此做一些笔记,同时也为有需要的人提供一些参考。 ******************************************************************** * quote : "http://inventwithpython.com/" …...
【C++ | bug | 运算符重载】定义矩阵(模板)类时,使用 “友元函数” 进行 * 运算符重载时编译报错
作者:非妃是公主 专栏:《C》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐一、类的声明及函数定义二、错误信息三、问题…...
数学小课堂:无穷小(以动态的眼光看待世界,理解无限的世界)
文章目录 引言I 芝诺四个著名的悖论1.1 二分法悖论:从A点到B点是不可能的。1.2 阿喀琉斯悖论:阿喀琉斯追不上乌龟。1.3 飞箭不动悖论:射出去的箭是静止的。1.4 基本空间和相对运动悖论II 回答芝诺的悖论2.1 阿喀琉斯悖论2.2 相对运动悖论III 无穷小3.1 无穷小的定义3.1 无穷…...
leetcode 427. Construct Quad Tree(构建四叉树)
刚看到题的时候是懵的,这也太长了。到底是要表达什么呢。 不妨把这个矩阵看成一个正方形的图片,想象你在处理图片,从整体逐步到局部。 刚开始看一整张图片,如果是全0或全1,这个就是叶子节点,怎么表达叶子节…...
Spring Boot 3.0系列【2】部署篇之使用GraalVM构建原生镜像
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本2.7.0 文章目录概述JIT & AOTJIT (动态编译)AOT(静态编译)GraalVM简介运行模式Native Image(原生镜像)…...
复习知识点十之方法的重载
目录 方法的重载 练习1: 练习1: 数组遍历 练习2: 数组的最大值 练习3: 练习4: 复制数组 基本数据类型和引用数据类型 方法的重载 Java虚拟机会通过参数的不同来区分同名的方法 练习1: public class Test4 {public static void main(String[] args) {//调用方法 // …...
火爆全网的ChatGPT 和AI 可以为项目经理做什么?
作为一款人工智能聊天机器人,ChatGPT因其逼真和人性化的特性而风靡全球,无疑是当今技术的新流行。人工智能 (AI) 有可能彻底改变许多行业,包括项目管理,及时了解最新技术以及它如何影响你的工作至关重要。于是,我们与C…...
前端面试题 —— HTML
目录 一、src 和 href 的区别 二、对 HTML 语义化的理解 三、DOCTYPE(⽂档类型) 的作⽤ 四、script 标签中 defer 和 async 的区别 五、常⽤的 meta 标签有哪些? 六、HTML5 有哪些更新 八、行内元素有哪些?块级元素有哪些? 空(void)元素…...
同为(TOWE)电源线让家用电器随心放置
如今,随着科技水平的不断发展,人们工作、生活中越来越离不开各类电子设备和电器产品。当用电器数量多了以后,由于电器设备原有电线长度的限制,常常需要通过连接接线板来延长电器设备的电能传输线路。电源线虽然看着是一件不起眼的…...
2023上半年数学建模竞赛汇总(报名时间、比赛时间、难易程度、含金量、竞赛官网)
1、美国大学生数学建模竞赛等级:国家级是否可跨校:否竞赛开始时间:2月17日~2月21日综合难度:⭐⭐⭐⭐ 竞赛含金量:⭐⭐⭐⭐⭐竞赛官网:https://www.comap.com/2、MathorCup高校数学建模挑战赛---大数据竞赛…...
RK3568平台开发系列讲解(驱动基础篇)SMP(Symmetrical Multi-Processing)
🚀返回专栏总目录 文章目录 一、linux SMP 和 AMP二、linux SMP的启动流程三、CPU的描述:cpumask四、CPU之间的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 SMP(Symmetrical Multi-Processing)。 一、linux SMP 和 AMP 目前支持多核处理器的实时操…...
HIVE --- zeppelin安装
目录 把zeppelin压缩包拷贝到虚拟机里面 解压 改名 修改配置文件 编辑zeppelin-site.xml—将配置文件的ip地址和端口号进行修改 编辑 zeppelin-env.sh—添加JDK和Hadoop环境 配置环境变量 刷新环境变量 拷贝Hive文件 拷贝外部文件 启动zeppelin 启动Hadoop&Hi…...
数据分析中的变量解释
1.数值变量Numerical Variables 数值型变量(metric variable)是说明事物数字特征的一个名称,其取值是数值型数据。如“产品产量”、“商品销售额”、“零件尺寸”、“年龄”、“时间”等都是数值型变量,这些变量可以取不同的数值…...
django-博客(一)
一、 1、环境:pycharm,python3.6,django3,mysql8.0 2、创建项目 3、把html和css样式那些导入到文件夹中,然后配置这些文件夹的路径,再添加首页视图。 改成反向解析 python manage.py runserv…...
Shell高级——Linux中的文件描述符
以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 前言 Linux中一切接文件,比如 C 源文件、视频文件、Shell脚本、可执行文件等,就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上…...
洗地机哪个品牌最好用?家用洗地机十大名牌
这几年清洁类的小家电非常热门,无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷,各个品牌百花齐放。这些清洁电器,确实为家庭卫生清洁带来了很大的便捷。但要把这些产品一次性买齐是一笔不小的开销,而且需要收纳…...
java多线程(十)线程休眠
一、sleep()介绍 sleep() 定义在Thread.java中。 sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由…...
Leetcode20. 有效的括号
一、题目描述: 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确…...
Android 项目必备(四十三)-->Android 开发者的 new 电脑
前言 作为 Android 开发者,当你新入职一家公司,拿到新发的电脑,你会对电脑干点啥? 安装开发环境?装软件?你是否还会铺天盖地到处找之前电脑备份的东西?又或者还想不起来有什么上一台电脑好用的…...
如何水平和垂直居中元素
跳到主内容 我试图将我的选项卡内容垂直居中,但是当我添加 CSS 样式时display:inline-flex,水平文本对齐消失了。 如何为每个选项卡同时对齐文本 x 和 y? * { box-sizing: border-box; } #leftFrame {background-color: green;position: a…...
Rust泛型Generics
泛型 泛型(Generics)是一种程序设计风格,它允许程序员在强类型语言(例如rust,c#,c)中编写代码时使用通用类型。以rust为例,如果你想实现一个通用的add函数,让其在u8, i3…...
六、并发集合
文章目录并发集合ConcurrentHashMap存储结构存储操作put方法putVal方法-散列算法putVal方法-添加数据到数组&初始化数组putVal方法-添加数据到链表扩容操作treeifyBin方法触发扩容tryPreSize方法-针对putAll的初始化操作tryPreSize方法-计算扩容戳并且查看BUGtryPreSize方法…...
PHY调试经验
1. PHY调试过程 1.设备树中配置正确的PHY ADDR、PHY ID、clause 45或者22协议,PHY ADDR配置不正确会导致MDC/MDIO通信不正常或失败,PHY ID用于匹配PHY驱动程序。 2.通过MDC/MDIO读写PHY ID并对比datasheet中的PHY ID,确认MDC/MDIO通信是否正常…...
从Java培训班出来好找工作吗?
个人觉得这个问题要从两方面来看,首先是培训班的Java课程质量如何,是否贴合用人单位实际需求,学出来的技术能对口;其次是培训班是否保障就业,有就业机会渠道推荐,比如老学员内推、合作企业人才输送以及企业…...
第51天|LeetCode503.下一个更大元素 II、LeetCode42. 接雨水
1.题目链接:下一个更大元素 II 题目描述: 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#…...
[12]云计算概念、技术与架构Thomas Erl-第5章 云使能技术
目录 第五章 云使能技术 5.1宽带网络和Internet架构 5.1.1Internet服务提供者(ISP) 5.1.2无连接分组(数据报网络) 5.1.3基于路由器的互联 5.1.4技术和商业考量 总结 5.2数据中心技术 5.2.1虚拟化 5.2.2标准化与模块化 …...
超实用的公众号用户运营方案分享,纯干货
公众运营是以用户为主的: 但是你知道什么是用户运营吗?你的公众号有没有维护好目标用户群体呢?你知道该怎么分析你的公众号用户群体吗?你知道分析完之后具体应该怎么做用户运营吗? 接下来伯乐网络传媒就来给大家分享…...
Git ---- 国内代码托管中心-码云
Git ---- 国内代码托管中心-码云1. 简介2. 码云账号注册和登录3. 码云创建远程仓库4. IDEA 集成码云1. IDEA 安装码云插件2. IDEA 连接码云5. 码云复制 GitHub 项目1. 简介 众所周知,GitHub 服务器在国外,使用 GitHub 作为项目托管网站,如果…...
【学习笔记】NOIP爆零赛8
trash ,但不完全是trash t1t1t1考了一个神奇的结论还没有证明,t2t2t2玩了一些复杂度的花样,t3t3t3稍微阳间一点,是一个并不复杂的容斥,如果放在t1t1t1可能更合适一些,t4t4t4就是在原题的基础上改了一下然后就成了一道毒…...
江门当地的免费网站优化/百度排名点击
「范式大学」由第四范式发起,致力于成为“数据科学家”的黄埔军校,校长为第四范式首席科学家,华人界首个国际人工智能协会AAAI Fellow、唯一的AAAI 华人执委杨强教授。 [范式大学]在探索AI工业化的同时,也关…...
深圳建设工程交易服务网龙岗分中心/陕西seo主管
有关正交实验法、场景图、错误推测法,可参考文章:软件测试-黑盒测试方法(二)---正交实验法、场景图、错误推测法 一、等价类划分 使用等价类划分最主要的原因就是穷举测试不可能。 定义:…...
承接网站建设广告语/一键关键词优化
20165107 《网络对抗技术》Exp1 PC平台逆向破解 实践内容 本次实践的对象是一个名为pwn1的linux可执行文件,该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell࿰…...
制作网站公司 英语网站首页/厦门关键词优化报价
前诉:本文章的大致内容如下 二叉排序树 1、二叉排序树查的定义 二叉排序树有称为二叉搜索树,二叉查找树 二叉排序树的定义: 二叉排序树的例子 二叉排序树性质:中序遍历非空的二叉排序树所得到的数据元素序列是一个按关键字…...
太原做网站培训/文案代写收费标准
前言 : 有很多时候看一些技术文章,总是停留在看的阶段,但是知识的学习在我看来分成三个步骤:first 。 了解-主要动作也就是看,或者听,比较浅显的学习方式,遗忘速度也比较快 ; second…...
东营建设网站公司电话号码/个人网站该怎么打广告
公众号关注 「奇妙的 Linux 世界」设为「星标」,每天带你玩转 Linux !Crossplane 是一个开源的 Kubernetes 插件,通过扩展 Kubernetes API 来解决云资源的供应问题。使用 Crossplane 时,你可以用声明的方式定义需要创建哪些云资源…...