Linux 内存 pt.1

news2025/2/23 6:58:06

哈喽大家好,我是咸鱼

今天我们来学习一下 Linux 操作系统核心之一:内存

跟 CPU 一样,内存也是操作系统最核心的功能之一,内存主要用来存储系统和程序的指令、数据、缓存等

关于内存的学习,我会尽量以通俗易懂的方式且分成多篇文章去讲解

那么今天在 pt.1 文章中,我们来学习一下 Linux 中的虚拟内存、物理内存和内存映射

在这里插入图片描述
只有内核才可以直接访问物理内存,进程是无法直接访问物理内存的

  • 那么进程是如何访问物理内存?

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个空间是连续的,这样进程就可以很方便的访问到内存,准确来说是访问到虚拟内存

又因为这个虚拟地址空间(虚拟内存)与物理内存相关联,进程则是通过虚拟内存去访问物理内存的

在这里插入图片描述
虚拟地址空间又被分成内核空间用户空间,进程在用户态时只能访问虚拟用户空间地址,在内核态可以访问虚拟内核空间地址

对于不同位数字长(单个 CPU 指令可以处理数据的最大长度)的处理器(32位系统、64位系统),地址空间的范围也不同

在这里插入图片描述
由上图可以看到,32 位系统的内核空间占 1G,位于最高处;剩下的 3G 是用户空间

而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的

虽然每个进程都有虚拟内核空间,但每个进程的虚拟内核空间内存关联的都是相同的物理内存,方便进程切换到内核态后去访问物理内存

在这里插入图片描述
物理地址空间是物理内存的范围,虚拟地址空间是虚拟内存的范围,物理地址空间中的每个物理地址都是实打实地指向了具体的存储单元

虚拟地址空间中每个虚拟地址指向哪里有 3 种情况:

  • 未分配,这个虚拟地址仅仅是个数字而已,没有任何指向

  • 未缓冲,这个虚拟地址指向了磁盘的某个字节存储单元,里面存储了指令或者数据

  • 已缓冲,这个虚拟地址指向了物理内存的某个字节存储单元,里面存储了指令或者数据。

  • 虚拟内存的好处:

    • 避免用户直接访问物理内存,防止一些破坏性操作,保护操作系统
    • 每个进程都被分配了 4GB 的 虚拟地址空间,用户可使用比实力物理内存更大的地址空间(用的时候才分配)

在这里插入图片描述
那么当进程实际使用的时候,进程的虚拟内存是怎么分配到物理内存的呢?

1.内存映射

并不是所有的虚拟内存都会被分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的

内存映射,其实就是将虚拟内存地址映射到物理内存地址

为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

页表实际上存储在 CPU 的内存管理单元 MMU 中。这样,正常情况下,CPU 就可以直接通过硬件,找出要访问的内存

在这里插入图片描述
这张页表里面有很多页表项,每个页表项的大小为 4KB。当进程访问的虚拟内存被分配了物理内存之后,系统就会更新页表,在页表项中添加虚拟内存与物理内存的映射关系

  • 缺页异常

如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

MMU 中有一个高速缓存 TLB((Translation Lookaside Buffer,转译后备缓冲器),TLB 访问速度要比 MMU 快得多

通过提高 TLB 缓存使用率,可以提高 CPU 的内存访问性能

总结

  • 在 Linux 中,为了提高内存利用率和系统可靠性,同时也为了不同进程之间的内存隔离,进程不能直接访问到物理内存

  • Linux 为每一个进程都分配了一个虚拟内存,当进程实际使用的时候,虚拟内存才会被分配物理内存

  • Linux 通过内存映射的方式来实现通过虚拟内存去访问物理内存,为了完成内存映射,内核为每个进程都维护了一张页表,用来记录虚拟内存与物理内存的映射关系

  • 如果进程要访问的虚拟内存没有被分配物理内存(即在页表中找不到映射关系),就会产生一个缺页异常中断

  • 这时候系统会进入内核空间分配物理内存、然后更新进程页表,最后再返回用户空间,恢复进程的运行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/470310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言的基本数学运算

目录 一、对象命名原则 二、基本数学运算 2.1 四则运算 2.2 余数和整除 2.3 次方或平方根 2.4 绝对值 2.5 exp()与对数 2.6 科学符号e 2.7 圆周率与三角函数 2.8 四舍五入函数 2.9 近似函数 2.10 阶乘 三、R语言控制运算的优先级 四、无限大 五、非数字&#xf…

OpenCV 实战3 对图像画框、获取图像像素位置

一、函数介绍 opencv中进行鼠标操作主要用到setMouseCallback这个函数,如下: void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata 0); winname:窗口名称 onMouse:鼠标响应函数&#x…

直击德国PLS展,联诚发倾力打造沉浸式视觉盛宴!

当地时间4月25-28日,备受关注的2023德国法兰克福国际专业灯光音响展ProlightSound(以下简称“PLS展”)在德国法兰克福盛大召开。联诚发携多款创新产品及多领域的应用解决方案精彩亮相,为全球客户打造沉浸式视觉盛宴,展…

HNU-计算机系统-实验1-PrototypeSystemLab

《计算机系统》 原型机实验报告 班级:计科21XX 学号:20210801XXXX 姓名:wolf 目录 1 实验项目一 1.1项目名称 1.2实验目的 1.3实验资源 2 实验任务 2.1原型机I 2.1.1练习内容 2.1.2思考问题 2.2原型机II-扩充指令集 2.2.1…

《编程思维与实践》1040.字符串消除

《编程思维与实践》1040.字符串消除 题目 思路 每次消除都可能会受到第一次插入字符的影响,所以难以直接判断在哪个位置插入哪个字符后消除的字符数最多. 因此考虑暴力枚举: 在每个位置依此插入A,B,C 对所有情况消除的字符数进行比较,求出最大值. 对于字符串的插入可以利用str…

这个看过吗

el-upload调两个接口&#xff0c;获取二进制文件 &#xff0c;并且上传后不立即执行&#xff0c;通过 this.$refs.upload.submit();触发提交&#xff0c;直接调两个接口&#xff0c;获取到二进制文件后传输 <el-upload:auto-upload"false":data"{report…

springboot+vue在线动漫信息平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线动漫信息平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

TPS和QPS的区别与联系

今天在工作中遇到了两个指标&#xff0c;将这两个指标作以解析。 1、TPS&#xff1a; Transactions Per Second&#xff0c;意思是每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程&#xff0c;具体的事务定义&#xff0c;可以是一个接口、多个接口、…

IDEA中application.yaml文件无法自动提示

问题描述&#xff1a; 在IDEA中application.properties可以自动提示&#xff0c;但是application.yml/application.yaml文件却不可以实现关键词提示和代码跳转 甚至&#xff0c;在Modules模块中都无法识别到application.yml文件&#xff01;&#xff01; 总感觉这个yml文件图标…

【C++学习】类和对象--继承

基本语法 继承是面向对象三大特性之一&#xff0c;有些类和类之间存在特殊关系。 下级别成员除了拥有上一级的共性还有自己的特点。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码。 基本语法&#xff1a;class 子类 &#xff1a;继承方式 父类 子类也称为…

【HTML 标签详解】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

MySQL(三)-数据类型

MYSQL数据类型 1 整数类型2 浮点数类型和定点数类型3 日期与时间类型4 文本字符串类型5 二进制字符串类型6 数据类型的选择 表是由多列字段组成&#xff0c;每一个字段会有不同的数据类型&#xff0c;不同的数据类型决定了字段包含的数据内容。不同的数据类型也决定了mysql在使…

SpringBoot项目结构及依赖技术栈

目录 1、pom.xml文件配置说明 2、SpringBoot项目结构说明 3、入门案例关键配置说明 &#x1f308; 前面我们学习了SpringBoot快速入门案例&#xff0c;本节我们通过POM文件和项目结构分析两部分内容了解下关于SpringBoot的一些配置说明&#xff0c;以便全面了解SpringBoot项…

Javaweb | 转发、重定向

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 转发 转发与页面跳转 转发 转发的作用在服务器端&#xff0c;将请求发送给服务器上的其他资源&#xff0c;以共同完成一次请求的处理 页面跳转 使用forward跳转时&am…

MySQL(七)-日期和时间函数的使用解析

日期和时间函数的使用解析 1 获取当前日期的函数和获取当前时间的函数2 获取当前日期和时间的函数3 UNIX时间戳函数4 返回UTC日期的函数和返 UTC 时间的函数5 获取月份的函数MONTH(date)和 MONTHNAME(date)6 获取星期的函数DAYNAME(d)DAYOFWEEK(d)和WEEKDAY(d)7 获取星期数的函…

芯片封装基本流程及失效分析处理方法

芯片封装 芯片封装的目的在于对芯片进行保护与支撑作用、形成良好的散热与隔绝层、保证芯片的可靠性&#xff0c;使其在应用过程中高效稳定地发挥功效。 工艺流程 硅片减薄 使用物理手段&#xff0c;如磨削、研磨等&#xff1b;或者化学手段&#xff0c;如电化学腐蚀、湿法腐蚀…

2023-04-24:用go语言重写ffmpeg的muxing.c示例。

2023-04-24&#xff1a;用go语言重写ffmpeg的muxing.c示例。 答案2022-04-24&#xff1a; 本程序的大体过程如下&#xff1a; 打开输出文件并写入头部信息。 添加音频和视频流&#xff0c;并为每个流创建 AVCodecContext 对象&#xff0c;根据输入格式设置编码器参数&#x…

springboot 整合itext 实现pdf下载

一 itext介绍 1.1 核心组件介绍 Text中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。 1.文本块(Chunk)是处理文本的最小单位&#xff0c;有一串带格式&#xff08;包括字体、颜色、大小&#xff09;的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为…

【OAI】UERANSIM容器与OAI核心网分立部署及测试

说明启动核心网&#xff1a;启动基站&#xff1a;功能测试ueransim测试1&#xff1a;通过12.1.1.x ping192.168.70.1ueransim测试2&#xff1a; 通过nr-binder绑定自定义TCP程序传数据到核心网ueransim测试3&#xff1a;多ueransim启动 结论附录基站配置文件&#xff1a;TCP通信…

HCIA-RS实验-路由配置-静态路由缺省路由

在计算机网络中&#xff0c;路由器是实现数据包转发的重要设备。它通过查找路由表中的路由信息&#xff0c;将数据包从源地址转发到目标地址。而静态路由和缺省路由则是路由表中的两种重要信息&#xff0c;下面我们来详细了解一下它们的概念、特点和应用。 目录 简述 一、静态…