Linux操作系统(四):内存管理组件

该部分的学习框架如下:

  1. 了解基本内存管理概念:物理内存、虚拟内存、地址空间等。
  2. 学习虚拟内存的概念、作用和原理。了解虚拟内存是如何将物理内存和进程的地址空间分开管理的,以及它如何提供了更大的地址空间和更好的内存管理。
  3. 内存分段:学习内存分段的概念和实现。了解如何将进程的地址空间分成多个段,每个段用于存储不同类型的数据。了解段表、段选择子等相关概念。
  4. 内存分页:探索内存分页的概念和机制。学习将进程的虚拟地址空间分成固定大小的页面,以便更灵活地管理内存。了解页表、页表项等相关内容。
  5. 段页式内存管理:了解段页式内存管理是如何将分段和分页结合起来的。掌握它的优点以及如何实现段页式的内存管理模式。
  6. Linux内存管理:了解Linux如何管理进程的虚拟内存,包括页面置换算法、内存映射、页面分配等。
  7. 内存管理之间的关联:探索虚拟内存、内存分段、内存分页和段页式内存管理之间的关系。理解它们的优劣势,以及不同操作系统如何在不同场景中选择适当的内存管理策略。

目录

  • 1. 内存管理基本概念
  • 2. 虚拟内存的概念、作用和原理
  • 3. 内存分段和内存分页
  • 4. 实际中Linux 采用了哪种方式来管理内存
  • 5. 总结

1. 内存管理基本概念

  注意在Linux操作系统(一):详解CPU中1.1.4节介绍了存储设备的结构。
  内存是一种有限资源。内存管理的主要目标是优化内存的使用,使多个进程能够同时运行,提供良好的性能和用户体验。

名称定义
物理内存(Physical Memory)计算机硬件中实际存在的内存,也称为主存(Main Memory)。由DRAM(动态随机存取存储器)等硬件组件组成,用于存储正在运行的程序和数据。操作系统将程序的指令和数据加载到物理内存中,以供CPU访问。
虚拟内存(Virtual Memory)扩展了计算机系统的地址空间。每个进程都有自己的虚拟地址空间,在虚拟内存的概念下,操作系统通过使用一种叫做“页表”的数据结构,将进程的虚拟地址映射到物理内存中的实际地址。虚拟内存使得操作系统能够将进程的部分数据和指令存储在物理内存中,而不是完全加载进物理内存,从而允许更多的进程在有限的物理内存中并发运行。
地址空间(Address Space)地址空间是一个进程在其虚拟内存中的所有可能地址的集合。每个进程都有自己的地址空间,它由多个不同的区域组成,如代码段、数据段、堆、栈等。每个区域用于存储不同类型的数据和指令。

2. 虚拟内存的概念、作用和原理

背景:
  单片机没有操作系统,每次写完代码都需要借助工具把程序烧录进去。其CPU直接操作内存的物理地址。在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行这两个程序会立刻崩溃。

两个程序都引用了绝对物理地址,导致进程冲突

操作系统针对绝对物理地址冲突的解决办法:
  为每个进程分配独立的一套「虚拟地址」,大家玩自己的地址就行,互不干涉。但前提每个进程都不能访问物理地址,至于虚拟地址最终怎么落到物理内存里,进程们不用理会,让操作系统安排,操作系统自会将不同进程的虚拟地址和不同内存的物理地址映射起来。
在这里插入图片描述
操作系统是如何管理虚拟地址与物理地址之间的关系?在3. 内存分段和4. 内存分页中介绍。

3. 内存分段和内存分页

目的:操作系统想要管理虚拟地址与物理地址之间的映射关系。
思想:

  • 内存分段:通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址。

    内存碎片的问题。

    假设有 1G 的物理内存,游戏占用了 512MB 内存,浏览器占用了 128MB 内存,音乐占用了 256 MB 内存。关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB。
    为了解决内存碎片问题引入了内存交换

    内存交换的效率低的问题。

    对于多进程的系统来说,用分段的方式,外部内存碎片是很容易产生的,产生了外部内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。因为硬盘的访问速度要比内存慢太多了,每一次内存交换,我们都需要把一大段连续的内存数据写到硬盘上。

  • 内存分页:把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫页(Page)。在 Linux 下,每一页的大小为 4KB。虚拟地址与物理地址之间通过页表来映射

  这里用一个笔试题来学习页表分页:

  若页式虚拟存储管理系统(请求分页系统)采用最佳置换算法,初始时页表为空。当该进程的访问页面顺序为4、3、2、1、4、3、5、4、3、2、1、5,当分配给该作业的物理块数M为3时,试计算在访问过程中所发生的缺页次数和缺页率。

  1. 页式虚拟存储管理系统的页面置换算法

    作用:在程序执行过程中所访问的信息不在内存时需要将所需信息从外存调入内存【操作系统要提供请求调页功能,将缺失页面从外存调入内存】,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存【操作系统要提供页面置换的功能,将暂时用不到的页面换出外存】。

    在这里插入图片描述
    最佳置换算法性能最好,但无法实现;先进先出置换算法实现简单,但算法性能差;最近最久未使用置换算法性能好,是最接近OPT算法性能的,但是实现起来需要专门的硬件支持,算法开销大。时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,NotRecently Used)。

  2. 最佳置换算法

    思想:每次选择淘汰的页面将是以后最长时间内不再被访问的页面,这样可以保证最低的缺页率。

    在这里插入图片描述
    页面置换1:当进程访问页面1时,将会产生页面置换,4 3 2进行淘汰,往远处(右)观察,页面2最远,则淘汰页面2。
    页面置换2:当进程访问页面5时,将会产生页面置换,4 3 1进行淘汰,往远处(右)观察,页面1最远,则淘汰页面1。
    页面置换3:当进程访问页面2时,将会产生页面置换,4 3 5进行淘汰,往远处(右)观察,看出5还会用到,但是4和3已经没用了,再往前放(左)观察,4更新的最晚,将4淘汰。
    页面置换4:当进程访问页面1时,将会产生页面置换,2 3 5进行淘汰,往远处(右)观察,看出5还会用到,但是2和3已经没用了,再往前放(左)观察,3更新的最晚,将3淘汰。

  3. 缺页次数(缺页中断)

    缺页中断:要访问的页不在主存
    缺页率:发生缺页次数/总共的页面数
    缺页次数:7
    缺页率:7/12

4. 实际中Linux 采用了哪种方式来管理内存

  Linux 系统主要采用了分页管理,但是由于 Intel 处理器的发展史,Linux 系统无法避免分段管理。 于是 Linux 就把所有段的基地址设为 0,也就意味着所有程序的地址空间都是线性地址空间(虚拟地址),相当于屏蔽了 CPU 逻辑地址的概念,所以段只被用于访问控制和内存保护。

  另外,Linux 系统中虚拟空间分布可分为用户态和内核态两部分,其中用户态的分布:代码段、全局变量、BSS、函数栈、堆内存、映射区。

5. 总结

  1. 虚拟内存有什么作用?

    • 虚拟内存可以使得进程对运行内存超过物理内存大小(扩展物理内存),因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。
    • 由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题
    • 页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。
  2. 系统内存紧张时(满了),会发生什么?

    • 是物理内存满了还是虚拟内存满了?如果是虚拟内存满了,就是应用程序读写某块虚拟内存时,CPU 会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,进程会从用户态切换到内核态,并将缺页中断交给内核的 Page Fault Handler (缺页中断函数)处理。缺页中断处理函数会看是否有空闲的物理内存,如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系。如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作,回收的方式主要是两种:直接内存回收和后台内存回收。如果直接内存回收后,空闲的物理内存仍然无法满足此次物理内存的申请,那么内核就会放最后的大招了 ——触发 OOM (Out of Memory)机制。
  3. 在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

    • 32 位系统(最高寻址4GB)的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间;32 位操作系统,进程最多只能申请 3 GB 大小的虚拟内存空间,所以进程申请 8GB 内存的话,在申请虚拟内存阶段就会失败。
    • 64 位系统的内核空间和用户空间都是 128T。64 位操作系统,进程可以使用 128 TB 大小的虚拟内存空间,所以进程申请 8GB 内存是没问题的,因为进程申请内存是申请虚拟内存,只要不读写这个虚拟内存,操作系统就不会分配物理内存。如果申请物理内存大小超过了空闲物理内存大小,就要看操作系统有没有开启 Swap 机制:
      • 如果没有开启 Swap 机制,程序就会直接 OOM;
      • 如果有开启 Swap 机制,程序可以正常运行。
  4. Linux的页面请求管理采用什么LRU算法

    • 传统LRU算法问题:
      1. 「预读失效」导致缓存命中率下降:操作系统在读磁盘时会额外多读一些到内存,但这些数据可能至始至终也没有被用到。
      2. 「缓存污染」导致缓存命中率下降:批量读取时可能把热点页也给切出去。
    • MySQL 和 Linux 操作系统是通过改进 LRU 算法来避免「预读失效和缓存污染」而导致缓存命中率下降的问题。
      1. Linux 操作系统实现两个了 LRU 链表:活跃 LRU 链表(active list)和非活跃 LRU 链表(inactive list)。
      2. MySQL Innodb 存储引擎是在一个 LRU 链表上划分来 2 个区域:young 区域 和 old 区域。

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

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

相关文章

基于虚拟仿真技术的汽车燃油泵控制

在当前激烈的竞争环境下,汽车行业正在加速产业和技术更迭,整车厂对大型ECU嵌入式控制系统和软件的需求迫在眉睫。 然而,复杂而庞大的汽车系统往往由多个物理系统组成,系统所对应的模型都需要在不同的领域实现:发动机、…

JAVA黑马程序员day12--集合进阶(下部--双列集合)

Map HashMap 练习一 需提前定义学生类&#xff0c;并重写HashMap方法&#xff08;不然无法覆盖&#xff09; public class MapDemo4 {public static void main(String[] args) {//1.创建HashMap对象HashMap<Student,String> hmnew HashMap<>();//2、创建3个学生对…

string的使用和模拟实现

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; C&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大…

iisfastchi漏洞复现

1.查看版本 2.在路径中写入 php脚本 发现使用不了 3.环境搭建 结局打开 把限制打开

Kafka中Consumer源码解读

Consumer源码解读 本课程的核心技术点如下&#xff1a; 1、consumer初始化 2、如何选举Consumer Leader 3、Consumer Leader是如何制定分区方案 4、Consumer如何拉取数据 5、Consumer的自动偏移量提交 Consumer初始化 从KafkaConsumer的构造方法出发&#xff0c;我们跟踪到…

前端JavaScript中异步的终极解决方案:async/await

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 1. 背景 在深入讨论 async/await 之前&#xff0c;我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是…

AD22使用笔记+积累库

一、前言 使用AD9习惯了&#xff0c;但是需求逐渐上来了就不够用了&#xff0c;好多快捷的新功能要新版本软件才能用&#xff0c;所以升级使用AD22 目录 1.添加层之后中间层无法布线 2.新增快捷方式CtrlW布线&#xff0c;不用点图标了 二、环境 AD22 三、正文 1.添加层之…

Redis Part1

单体架构&#xff1a;一台Web服务器、一台数据库服务器。 1.了解NoSql 什么是Nosql&#xff1f; NoSQL&#xff0c;即Not-Only-SQL&#xff0c;意思就是我们干事情不能只用SQL&#xff0c;泛指非关系型的数据库&#xff01;NoSQL定位&#xff1a;作为关系型数据库的补充&am…

小米OPPO三星一加红魔全机型解锁BL详细教程合集-ROOT刷机必要操作

解锁BL一个熟悉又陌生的词汇&#xff0c;只要你刷机root过&#xff0c;你肯定都解锁BL成功过。我们简单的描述下BL是什么&#xff1f;BL全名bootloader&#xff0c;目前市面上全部机型&#xff0c;基本出厂全部BL处于锁定的状态锁定的BL机型&#xff0c;不支持刷入非官方固件或…

性能测试 —— Jmeter事务控制器

事务&#xff1a; 性能测试中&#xff0c;事务指的是从端到端&#xff0c;一个完整的操作过程&#xff0c;比如一次登录、一次 筛选条件查询&#xff0c;一次支付等&#xff1b;技术上讲&#xff1a;事务就是由1个或多个请求组成的 事务控制器 事务控制器类似简单控制器&…

广州口腔医院种植牙-广东省爱牙工程公益种牙,获湾区群众点赞

广州种植牙价格表-自2017年成立以来,广东省爱牙工程一直坚持以公益惠民为宗旨、公益种牙为服务方向,针对群众普遍存在的口腔健康问题,开展形式多样的公益性口腔医疗惠民活动。 广州种植牙费用表-日前,广东省爱牙工程“种植牙惠民行动”第二十季已正式启动。据广东省爱牙工程官方…

基于ntchat的微信群聊同步机器人

微信群有500人上限的限制&#xff0c;建立多个群的话又有信息无法互通的不便&#xff0c;此机器人通过自动将消息转发到同一个同步组内的所有群&#xff0c;消除这一不便性&#xff0c;间接达成扩大群成员数的目的。 效果演示&#xff1a; 项目地址&#xff1a; https://gith…

为何红黑树在B/B+树之上仍然占据重要地位?

为何红黑树在B/B树之上仍然占据重要地位&#xff1f; 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 &#x1f4a1;一个热爱分享高性能服…

Vue echarts 饼图 引导线加小圆点,文字分行展示

需求 重点代码 完整代码 initChart() {// 创建 echarts 实例。var myChartOne this.$echarts.init(this.$refs.Echart);myChartOne.setOption({tooltip: {trigger: "item",},title: {top: center,text: [{name| this.chartTitle.name },{value| this.chartTitle.…

ROS学习笔记(四)---使用 VScode 启动launch文件运行多个节点

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 一、什么是launch文件 虽然说Terminator终端是能够比较方便直观的看运行的节点…

2.10 PE结构:重建重定位表结构

Relocation&#xff08;重定位&#xff09;是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中&#xff0c;由于程序中使用了各种全局变量和函数&#xff0c;这些变量和函数的地址还没有确定&#xff0c;因此它们的地址只能暂时使用一个相对地址。当…

虚幻动画系统概述

本文主要整理一下高层次的概述&#xff0c;方便后续查阅 1.动画流程 DCC产出动画文件 -> UE动画导入 -> 动画蓝图驱动&#xff08;类似unity的动画状态机&#xff09; ->动画后处理蓝图驱动&#xff08;例如修型骨&#xff0c;骨骼矫正等后期处理&#xff09; 2.动…

数据结构与算法:树

目录 树 定义 结构 二叉树 定义 结构 形式 满二叉树 完全二叉树 存储 链式存储结构 数组 孩子节点 父节点 应用 查找 维持相对顺序 遍历 深度优先遍历 前序遍历 中序遍历 后序遍历 广度优先遍历 层序遍历 二叉堆 定义 自我调整 操作 插入加点 删…

左神算法之中级提升班(9)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析 平凡解技巧 从业务中分析终止条件 重点】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【动态规划代码】…