【3. 操作系统—物理内存管理】

简介: 简介: 本专栏主要讲解操作系统的相关知识,包括内存管理、虚拟内存、IO多路复用、进线程、死锁、磁盘调度 本节主要讲解 操作系统—物理内存管理

1660983156887.png

🎉作者简介:👓:{博主在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容}
📃个人主页: 小呆鸟
🔎支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦,👍就是给予我最大的支持!🎁
💛本文摘要💛

本专栏主要讲解操作系统的相关知识,包括内存管理、虚拟内存、IO多路复用、进线程、死锁、磁盘调度 本节主要讲解 操作系统概述

💝操作系统物理内存管理

  • 计算机体系结构/内存分层体系
  • 地址空间&地址生成
  • 连续内存分配

🎍1. 计算机体系结构/内存分层体系

🎉1.1 计算机体系结构

  • CPU
  • 内存
  • IO

1660983194920.png

🎉1.2 内存层次结构

  • 内存层次结构:CPU访问内存的指令或数据所处的具体位置。

1660983210545.png

从CPU寄存器到磁盘,读写速度不断降低,存储数据容量大小不断增大。
  • 运行内存(主存):主存是在程序运行时所需要保存的数据空间
  • 磁盘(虚拟内存):用于持久化数据保存的空间
  • CPU可以访问的内存包括两大类 : 寄存器 / cache(L1缓存 / L2缓存) (操作系统不可以访问这俩部分)

CPU访问的层次
|___CPU寄存器/L1缓存
|___L2缓存
|___主存(程序访问)
|___磁盘(程序访问)

🎉1.2 内存管理目标

  • 抽象:逻辑地址空间
  • 保护:独立地址空间
  • 共享:访问相同内存
  • 虚拟:更多的地址空间

有俩个地址空间:物理空间和逻辑空间
主存是一种物理地**址空间,程序是一种逻辑地址空间

1660983264588.png

🎉1.3 内存管理方法

  • 程序重定位
  • 分段
  • 分页
  • 虚拟内存
  • 按需分页虚拟内存

实现高度依赖于硬件

  • 内存结构
  • MMU(内存管理单元):硬件组件负责处理CPU的内存访问要求
操作系统是一个软件,在完成上述功能时,同时需要依赖硬件

🎍2. 地址空间 & 地址生成

  • 地址空间定义
  • 地址生成
  • 地址安全检查

🎉2.1 地址空间的定义

  • 物理地址空间:硬件支持的地址空间,包括主存和硬盘(虚拟内存)
  • 逻辑地址空间:一个运行在程序所拥有的的内存范围,地址空间是一维的
  • 逻辑地址空间和物理地址空间有映射关系,这是靠OS来维持的,每一个逻辑空间都有对应的物理地址空间,可能对应内存也可能对应硬盘

1660983324908.png

逻辑地址生成
1660983350802.png

  • 逻辑地址生成,.c程序经过编译得到.s文件,再经过汇编得到.o文件,此时变量名和函数名都会转换成从0开始的连续地址空间,然后再经过链接把多个.o文件生成.exe文件,此时因为链接了其他函数库,所以地址会产生偏移,从图中可以看到程序地址从0-75变成了0-175。链接产生的地址0-175就是逻辑地址。
  • 然后loader程序会把硬盘中的.exe文件加载到内存中运行。但是问题在于,假设另外一个程序的地址为0-200,那这两个程序因为地址冲突就不能一起执行了,为了解决这个问题,MMU会对程序的逻辑地址进行映射,转换成对应的物理地址。这样子,两个不同程序会映射到不同的物理地址上,避免冲突。所以程序加载时候会对逻辑地址进行重定位,转换成物理地址。

逻辑地址如何对应到物理地址

1660983393421.png

  1. 当CPU执行某条指令,它的ALU需要这个程序的内容,带着参数(逻辑地址)
  2. CPU会查找这个逻辑地址的映射表MMU,是否存在对应的物理地址,如果没有就会到内存中的map中找
  3. 找到后,他会给主存发送请求,请求该物理地址的内容
  4. 主存灰浆内容通过总线传到CPU,然后CPU执行指令。

操作系统在此之前,需要建立逻辑地址和物理地址的映射关系,这个关系可以放到CPU,由内存缓存,加快访问过程

安全检查(程序之间不能干扰,确保程序访问合法)

  • 操作系统确保每一个程序有效访问的地址空间(起始地址+偏移量)
  • CPU执行指令会查找MAP,MAP会指出访问的逻辑地址,看逻辑地址是否满足该限制(当超出该长度,就是不合法访问,这是OS来维护的),当不满足CPU就会产生一个系统异常,让OS进一步处理

1660983446098.png

🎍3. 连续内存分配

  • 内存碎片问题
  • 分区的动态分配

    • 第一适配
    • 最佳适配
    • 最差适配
  • 压缩式碎片整理
  • 交换式碎片整理

🎉3.1 内存碎片问题

  • 内存碎片:给运行程序分配一块空间后,会出现一部分无法利用的空间。
  • 内存碎片分为:外部碎片内部碎片

    • 外部碎片:在分配单元之间无法使用的内存
    • 内部碎片:已经分配给了应用程序,但是它无法使用,单元分配之内,无法使用

1660983469342.png

🎉3.2 分区的动态分配

  • 程序从硬盘加载到内存,需要为他分配一块连续的空间
  • 程序在运行过程中需要访问数据,为他的数据分配内存

1660983537990.png

🔔3.2.1 首次适配

  • 在内存中找到第一个比需求大的空闲块, 分配给应用程序

1660983559147.png

🔔3.2.2 最优适配

  • 寻找整个空间块中,最适合满足需求的空间块(在内存中找到最小的空闲块, 分配给应用程序)

相比首次适配

  1. 为了避免份分割大的空间块
  2. 为了最小化外部碎片产生的尺寸

1660983575142.png

🔔3.2.3 最差适配

  • 在内存中找到最大的空闲块, 分配给应用程序

为了避免太多的微小的碎片
1660983600178.png

🔔3.2.4 3种分配策略区别

分配方式 第一匹配分配 最优适配分配 最差适配分配
分配方式实现需求 1. 按地址排序的空闲块列表 2. 分配需要寻找一个合适的分区 3. 重分配需要检查是否可以合并相邻空闲分区 1. 按尺寸排序的空闲块列表 2. 分配需要寻找一个合适的分区 3. 重分配需要检查是否可以合并相邻空闲分区 1. 按尺寸排序的空闲块列表 2. 分配最大的分区 3. 重分配需要检查是否可以合并相邻空闲分区
优势 简单 / 易于产生更大空闲块 比较简单 / 大部分分配是小尺寸时高效 分配很快 / 大部分分配是中尺寸时高效
劣势 产生外部碎片 / 不确定性 产生外部碎片 / 重分配慢 / 产生很多没用的微小碎片 产生外部碎片 / 重分配慢 / 易于破碎大的空闲块以致大分区无法被分配
这三种都是一些简单的内存管理算法,没有优劣,因为操作系统的分配是随机的。

🎉3.3 压缩式碎片整理

将运行程序所在的内存,在内存中移来移去,使得空闲的块变得连续

  1. 压缩式碎片整理

    • 重置程序以合并碎片
    • 要求所有程序是动态可重置的
    • 问题 :

      • 何时将程序重置 ? (在程序处于等待状态时才可以重置)
      • 需要考虑内存拷贝的开销

主要是利用软件,来进行程序重置
1660983624177.png

🎉3.4 交换式碎片整理

把当前没有运行的程序,把它所占的空间放在硬盘上,从而空出更多的空闲空间

  • 运行程序需要更多的内存时,抢占等待的程序并且回收它们的内存
  • 问题 :

    • 哪些程序应该被换入换出 ?
    • 什么时候进行换入和换出
    • 而且换入换出是以单个程序的大小为力度,此时开销大

1660983646984.png

目录
相关文章
|
1月前
|
存储 Linux 调度
深入理解操作系统:从进程管理到内存分配
【8月更文挑战第44天】本文将带你深入操作系统的核心,探索其背后的原理和机制。我们将从进程管理开始,理解如何创建、调度和管理进程。然后,我们将探讨内存分配,了解操作系统如何管理计算机的内存资源。最后,我们将通过一些代码示例,展示这些概念是如何在实际操作系统中实现的。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
|
2月前
|
安全 索引
操作系统中的内存管理策略
【8月更文挑战第23天】
70 1
|
6天前
|
分布式计算 算法 大数据
探索操作系统的核心:调度与内存管理机制
【10月更文挑战第11天】 本文深入探讨了操作系统中两大核心功能——调度与内存管理机制。通过分析调度算法、进程状态转换及内存分配策略等关键方面,揭示了它们如何共同维护系统性能和稳定性。旨在为读者提供对操作系统内部运作的深刻理解,同时引起对优化策略的思考。
22 5
|
15天前
|
算法
深入理解操作系统:内存管理机制的探索之旅
【10月更文挑战第2天】在数字世界的浩瀚海洋中,操作系统犹如一艘精密的航船,承载着软件与硬件的和谐共舞。本文将揭开内存管理的神秘面纱,从基础概念到高级策略,引领读者领略操作系统内存分配的智慧。通过深入浅出的解释和生动的比喻,我们一同遨游在内存的江河之中,感受操作系统如何巧妙地协调资源,确保数据的有序流动。让我们跟随内存的脚步,探索那些隐藏在每次点击、每次命令背后的奥秘。
|
15天前
|
监控 开发者
深入理解操作系统:内存管理的艺术
【10月更文挑战第2天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将深入探索操作系统的心脏——内存管理,揭示它是如何协调和管理计算机的宝贵资源。通过浅显易懂的语言和生活化的比喻,我们将一起走进内存管理的奥秘世界,了解它的原理、机制以及为何对整个系统的性能和稳定性有着不可替代的影响。无论你是技术新手还是资深开发者,这篇文章都将为你打开新的视角,让你对日常使用的设备有更深层次的认识和尊重。
|
16天前
|
缓存 算法 调度
深入浅出操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅。我们将从进程管理的基本概念出发,逐步深入到内存管理的复杂世界,最终探索如何通过实践技巧来优化系统性能。文章将结合理论与实践,通过代码示例,帮助读者更好地理解操作系统的核心机制及其在日常技术工作中的重要性。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往操作系统深层次理解的大门。
|
18天前
|
存储 算法 C语言
MacOS环境-手写操作系统-17-内存管理算法实现
MacOS环境-手写操作系统-17-内存管理算法实现
27 0
|
18天前
|
Java C语言 iOS开发
MacOS环境-手写操作系统-16-内存管理 解析内存状态
MacOS环境-手写操作系统-16-内存管理 解析内存状态
23 0
|
18天前
|
存储 算法 C语言
MacOS环境-手写操作系统-15-内核管理 检测可用内存
MacOS环境-手写操作系统-15-内核管理 检测可用内存
27 0
|
1月前
|
Python
python对电脑的操作,获取几核,获取操作系统,获取内存
python对电脑的操作,获取几核,获取操作系统,获取内存