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 开发者,当你新入职一家公司,拿到新发的电脑,你会对电脑干点啥? 安装开发环境?装软件?你是否还会铺天盖地到处找之前电脑备份的东西?又或者还想不起来有什么上一台电脑好用的…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
