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

news2024/9/22 15:35:15

该部分的学习框架如下:

  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.coloradmin.cn/o/1013414.html

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

相关文章

管理方法论:4. 一对一沟通——了解真实情况

团队人越多,管理者了解真实情况就越困难,为什么? 缺乏安静的、可以专注于沟通的环境。有些话不能跟太多人说,尤其是负面的想法和意见。有些人本来就内向、被动,其他人说话时,自己往往习惯于听,…

java和fastjson

1.java是如何跨平台通信的 java--->class字节码--->jvm虚拟机运行 2.使因为jvm只会读文件名 如果不一致 则无法找到文件 3.main 函数说明java代码的接口 被使用 4.java和class后缀的区别 java是当前编写的代码文件 class是编译后的文件 5.void 没有返回值 这…

报警icon图闪动效果实现css动画

<div class"right-content" style"padding-left:10px; padding-top: 10px;"><div class"text-nowrap">离线摄像仪</div><div class"number-all" :style"{ color: cameraOffline > 0 ? red : #e7b215 }&…

许可分析 license分析 第六章

许可分析是指对软件许可证进行详细的分析和评估&#xff0c;以了解组织内部对软件许可的需求和使用情况。通过许可分析&#xff0c;可以帮助组织更好地管理和优化软件许可证的使用。以下是一些可能的许可分析方法和步骤&#xff1a; 软件许可证变更管理&#xff1a;建立合适的软…

使用TreeMap数据结构解决独特的搜索需求

TreeMap是Java集合&#xff0c;它以有序的键及其相应的值的形式组织数据。它自JDK 1.2以来就已经存在。在内部&#xff0c;TreeMap使用红黑树来组织数据&#xff0c;这是一种自平衡二叉树。TreeMap中的键是唯一的标识符&#xff0c;默认情况下&#xff0c;TreeMap会根据键的自然…

医院如何提升设备维护效率?智能工单管理系统有什么用?

目前&#xff0c;许多大型医院楼宇面积庞大&#xff0c;人员流动频繁&#xff0c;各科室医疗设备繁多&#xff1b;不管是基础硬件设施、还是暖通、电力系统&#xff0c;日常都处于高频使用、运转状态。维修、维护需求多、压力大&#xff0c;存在以下诸多的问题。 1、报修难点  …

使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

1. 介绍 SAM9X60 处理器有部分OTP&#xff08;One Time Programming&#xff09; Aera 可用于存储user data&#xff0c;这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中。 为什么要使用 OTP 区域存储MAC地址和序列号呢&#xff1f;答案是为了省钱…

C++内存池(1)理论基础及简单实现

一、内存池原理 1、我们先用生活中的例子来解释什么是内存池&#xff1a; &#xff08;1&#xff09;每个月月底钱花完时&#xff0c;或者急需要用钱时&#xff0c;你就打电话给你父母要钱&#xff0c;然后父母把钱通过微信或支付宝转给你。这种方式&#xff0c;每次要用钱…

如何在谷某地球飞行模拟中导入简单飞机开发的飞机模型

如何在谷某地球飞行模拟中导入简单飞机开发的飞机模型 简飞的飞友们&#xff01;我并没有弃坑&#xff0c;只不过我不是你们想象的那样设计飞机。我之前写过一篇图文讲解如何在谷某地球里规划飞行航线&#xff1a; 手把手教你驾驶西锐SR-22小飞机在美国大峡谷中穿行https://b…

Docker 恶意挖矿镜像应急实例

01、概述 当网络流量监控发现某台运行多个docker容器的主机主动连接到一个疑似挖矿矿池的地址时&#xff0c;需要快速响应和排查&#xff0c;以阻止进一步的损害。 面对docker容器的场景下&#xff0c;如何快速分析和识别恶意挖矿容器?本文将分享一种应急响应思路&#xff0c;…

【基础篇】三、SpringBoot基础配置

文章目录 0、模块的复制1、配置文件格式2、yaml语法3、yaml数据读取方式4、关于封装自定义对象来读取yaml配置的思考4、多环境启动5、配置文件分类 0、模块的复制 平时要大量创建模块时&#xff0c;可以直接复制模块&#xff0c;打开project的目录&#xff1a; 复制粘贴&#…

LeetCode142.环形链表-II

这道题和上一道题几乎没有任何区别啊&#xff0c;为什么还是中等难度&#xff0c;我用上一道题的解法一分钟就写出来了&#xff0c;只不过返回的不是true和false而是节点&#xff0c;以下是我的代码&#xff1a; public class Solution {public ListNode detectCycle(ListNode…

接口自动化测试推荐用什么框架?

在推荐接口自动化测试框架时&#xff0c;需要考虑多个因素&#xff0c;包括项目需求、技术栈、团队经验和个人偏好。 以下是几个常用的接口自动化测试框架供你参考&#xff1a; Postman&#xff1a; Postman是一个功能强大且易于上手的接口测试工具&#xff0c;它提供了许多…

卡尔曼滤波应用在数据处理方面的应用

卡尔曼滤波应用到交通领域 滤波器介绍核心思想核心公式一维卡尔曼滤波器示例导入所需的库 滤波器介绍 卡尔曼滤波器是一种用于估计系统状态的数学方法&#xff0c;它以卡尔曼核心思想为基础&#xff0c;广泛应用于估计动态系统的状态和滤除测量中的噪声。以下是卡尔曼滤波器的核…

学Python的漫画漫步进阶 -- 第十步

学Python的漫画漫步进阶 -- 第十步 十、异常处理10.1 第一个异常——除零异常10.2 捕获异常10.2.1 try-except语句10.2.2 多个except代码块10.2.3 多重异常捕获10.2.4 try-except语句嵌套 10.3 使用finally代码块释放资源10.4 自定义异常类10.5 动动手——手动引发异常10.6 练一…

安卓可视大屏寻呼台 兼容标准sip协议

SV-A32i 安卓可视大屏寻呼台 兼容标准sip协议 A32i 是专门针对行业用户需求研发的一款可视大屏寻呼台产品&#xff0c;配备鹅颈麦克风&#xff0c;支持高清免提通话。基于 Android 9.0 系统&#xff0c;可支持第三方Android 应用安装使用&#xff0c;界面使用便捷。采用 10.1 英…

大模型与数据库:AI 时代的双向助推力

随着 AIGC 的时代到来&#xff0c;以 GPT 为首的大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;已经成为当今人工智能领域最热门的话题之一。这些强大的模型不仅在内容创意生成、语言翻译和代码辅助等任务中表现出色&#xff0c;还对数据库的发展带…

DatenLord前沿技术分享 NO.35

达坦科技专注于打造新一代开源跨云存储平台DatenLord&#xff0c;通过软硬件深度融合的方式打通云云壁垒&#xff0c;致力于解决多云架构、多数据中心场景下异构存储、数据统一管理需求等问题&#xff0c;以满足不同行业客户对海量数据跨云、跨数据中心高性能访问的需求。在本周…

通过机器视觉对硬盘容器上盖的字符进行视觉识别,判断是否混料

 客户的需求  检测内容 硬盘容器上盖字符识别&#xff0c;以判断是否有混料。  检测要求 利用硬盘容器上盖表面字符&#xff0c;来判断是否有混料的情况发生&#xff0c;先识别全部字符。  视觉可行性分析 对贵司的样品进行了光学实验&#xff0c;并进行…

【操作系统】进程,线程和协程的哪些事儿

进程&#xff0c;线程和协程的哪些事儿 进程什么是进程?进程的状态进程的控制结构 线程为什么使用线程&#xff1f;什么是线程&#xff1f;线程与进程的比较线程的实现用户级线程内核级线程轻量级进程 协程协程是什么&#xff1f;协程的优势 区别进程与线程的区别协程与线程的…