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

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,可是映射到物理内存上就是不同的空间,因此,进程有很大的自由度。解决了上文中直接使用物理内存而存在的问题。

同时申请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 开发者,当你新入职一家公司,拿到新发的电脑,你会对电脑干点啥? 安装开发环境?装软件?你是否还会铺天盖地到处找之前电脑备份的东西?又或者还想不起来有什么上一台电脑好用的…...

<6>-MySQL表的增删查改

目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表&#xf…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: ​onCreate()​​ ​调用时机​:Activity 首次创建时调用。​…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...