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,一经查实,立即删除!

相关文章

「工具|数据接口」免费公开的REST API 如何借助github搭建自己的fake API接口

本文主要介绍日常开发、测试、教学或者分享中,可能遇到的模拟数据问题。分享免费开发的测试数据接口,以及如何利用github快速搭建定制化的接口数据,避免使用真实数据的风险以及自己现编数据的麻烦。 文章目录 一、场景说明二、免费公开的Fak…

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

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

Vite 完整版详解

1. 打包构建: Vite 使用 Rollup 作为默认的构建工具。通过运行 npm run build 命令,Vite 会将应用程序的源代码打包成一个或多个优化的静态文件,以便在生产环境中进行部署。Vite 的构建过程会根据需要进行代码拆分、压缩和优化,以…

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个学生对…

Rust更换Cargo国内源,镜像了寂寞

换皮不换身 换了国内源&#xff0c;构建时该卡还会卡。因为它所谓的换源&#xff0c;只是更换crates.io“索引”的源&#xff0c;而不是package“内容”的源。换了国内源后&#xff0c;在国内编译时访问 crates.io-index 自然会快很多&#xff0c;可是crates.io-index里面的信…

【LeetCode与《代码随想录》】贪心算法篇:做题笔记与总结-JavaScript版

代码随想录 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 文章目录 455. 分发饼干376. 摆动序列53. 最大子数组和122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II1005. K 次取反后最大化的数组和134. 加油站135. 分发糖果&#xff08;困难&#…

string的使用和模拟实现

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

iisfastchi漏洞复现

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

SideBar 侧边导航与内容区域交互重写【Ant Design Mobile】

需求&#xff1a;SideBar 侧边导航与内容区域交互 点击侧边栏某一项时&#xff0c;相对应内容区域滚动到视口顶部滚动视口区域&#xff0c;到某一项内容区域&#xff0c;侧边栏选中状态也会跟着变化 const SideBarAgain: React.FC<PopupProps> (props) > {// 父组件…

可扩展性表设计方案

文章目录 1 使用预留字段2 使用JSON字段3 使用单表继承4 构建属性表5 直接构建新表6 适当冗余 1 使用预留字段 在表设计初期&#xff0c;可以预留一些命名通用的备用字段&#xff0c;例如field1、field2、field3。当业务需要增加新字段时&#xff0c;就直接使用这些预留字段,无…

Xilinx FPGA 7系列 GTX/GTH Transceivers (1)

初识Xlilix GTX 1概述 Xilinx 7系列FPGA全系所支持的GT,GT资源是Xilinx系列FPGA的重要卖点,也是做高速接口的基础,GT的意思是Gigabyte Transceiver,G比特收发器。不管是PCIE、SATA、MAC等,都需要用到GT资源来做数据高速串化和解串处理,Xilinx不同的FPGA系列拥有不同的G…

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.添加层之…

SpringBoot-RabbitMQ

RabbitMQ 是一个开源的消息中间件&#xff0c;它实现了 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;并提供了可靠的消息传递机制。 Spring Boot 中使用 RabbitMQ 实现异步消息的发送和接收。 使用 Spring Boot 提供的 AmqpTemplate 和 Rab…

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