操作系统学习笔记 第四章:存储器管理(王道考研)

Posted Baret-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统学习笔记 第四章:存储器管理(王道考研)相关的知识,希望对你有一定的参考价值。

本文章基于网课: 2019 王道考研 操作系统
考试复习推荐资料:操作系统复习总结 - 百度文库 (baidu.com)


需要相关电子书的可以关注我的公众号BaretH后台回复操作系统
image-20210616202753852
第一章:操作系统概述
第二章:进程管理
第三章:处理机调度与死锁
后续章节陆续推出…



4.1 内存基础知识

image-20210608234018712

4.1.1 什么是内存

image-20210614142409195

内存(Memory)是计算机的重要部件之一,也称内存储器主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据,它的输入输出速度远大于硬盘。为了缓和CPU与硬盘之间的速度差异,程序执行前必须要放在内存中才能被CPU处理

image-20210608232537388

常用内存数量单位:

image-20210524102650340

4.1.2 程序运行原理

当我们编写好一个程序执行时,会经过编译链接装入三个步骤

  1. 编译就是将我们编写好的源代码文件由编译程序编译成若干目标模块,实际就是将高级语言翻译为低级语言
  2. 链接就是在编译为目标模块后,再由链接程序将其与所需的库函数链接在一起,形成一个完整的装入模块,链接后形成完整的逻辑地址
  3. 装入又称装载,就是由装入程序将装入模块加载到内存中运行,此时会完成逻辑地址到物理地址的映射

image-20210608234725478

image-20210521222523776

经历上述三个步骤后,程序会被翻译成一条一条的指令,实际运行的就是这一条条的指令,指令由操作码+操作数组成,比如下图x=x+1会被翻译成三条指令,其中第一个参数为操作码,后面两个参数为操作数地址

image-20210521222009354

上图中指令的操作数部门使用了变量x的实际物理地址,但通常指令中操作数的地址一般使用逻辑地址,而程序执行的第三步装入就是完成逻辑地址到物理地址映射的过程,逻辑地址和物理地址的描述如下图所示

image-20210521222338941

4.1.3 装入三种方式

一个程序的执行往往通过编译–》链接–》装入三个步骤,装入过程通常完成逻辑地址到物理地址的映射,通常有以下三种方式

1️⃣ 绝对装入:编程时,直接确定内存地址

image-20210523204209020

2️⃣ 静态重定位:编程时使用逻辑地址,当程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换

image-20210523204354567

3️⃣ 动态重定位:编程时使用逻辑地址,在程序真正执行过程中要访问数据时再进行地址变换(即在逐条指令执行时完成地址映射。一般为了提高效率,此工作由硬件地址映射机制来完成。硬件支持,软硬件结合完成)

image-20210523204509882

4.1.4 链接的三种方式

一个程序的执行往往通过编译–》链接–》装入三个步骤,链接过程将编译出的目标模块其与所需的库函数链接在一起,形成一个完整的装入模块,通常分为以下三种方式

1️⃣ 静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开

image-20210523204802708

2️⃣ 动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式

image-20210523204827525

3️⃣ 运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的;其优点是便于修改和更新,便于实现对目标模块的共享

image-20210523204851508



4.2 内存管理的功能

image-20210523212546098

4.2.1 内存空间的分配与回收

我们知道操作系统作为系统资源的管理者,当然也需要对内存进行管理,那么它要管些什么呢?

  1. 各种进程想要投入运行时都需要将进程所需要的数据加载到内存中,然而内存中有些区域是已经分配出去,有些区域是空闲的,那操作系统怎么管理记录哪些区域是空闲哪些是非空闲呢?
  2. 如果有新的进程想要投入内存中运行,那么该进程相关的数据需要放入内存当中,但是内存中有很地方可以进行存放,那么到底放在哪个位置呢?
  3. 如果有进程运行结束了,那么该进程占有的内存空间如何回收呢?

这些问题都是需要操作系统来负责的,因此内存管理的第一件事就是由操作系统来负责内存空间分配与回收

image-20210523210500070

4.2.1 内存空间的扩充

比如电脑里装了一个60GB的游戏,按理来说游戏程序运行之前需要把60GB的数据全部加载到内存中,但是内存只有4GB,游戏是如何运行的呢?除此之外,计算机中经常会碰到内存空间不够进程使用的问题,因此进程管理的第二件事就是操作系统需要提供某种技术从逻辑上对内存空间进行扩充,也就是虚拟技术——操作系统的虚拟性,将物理上很小的内存拓展为逻辑上很大的内存

image-20210523210427547

4.2.3 地址转换

为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而逻辑地址到物理地址的转换(这个过程称为地址重定位)应该由操作系统负责,这样就保证了程序员写程序时不需要关注物理内存的实际情况。因此内存管理的第三件事就是操作系统提供地址转换功能,负责程序的逻辑地址到物理地址的转换

实现地址转换的方法对应着三种装入方式:

  1. 绝对装入:在编译时产生绝对地址,该方式只适用于单道程序阶段(此时还没操作系统,由编译器负责)
  2. 可重定位装入:在装入时将逻辑地址转换为物理地址,由装入程序完成,装入程序是操作系统的一部分,这种方法适用于早期的多道批处理系统
  3. 动态运行装入:程序运行时才将逻辑地址转换为物理地址,此方式需要重定位寄存器,是现代操作系统采用的方式(页式存储、段式存储大量采用该方式)

image-20210608234815722

4.2.4 内存保护

投入内存中运行的进程应只能访问自己进程的内存空间,如果能随便访问其他进程的内存空间,对其数据进行修改,则会影响其他进程的运行。因此内存管理的第四件事就是操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行互不干扰,只能访问自己对应的内存空间

内存保护可以采用两种方式:

  • 方式一:在cpu中设置一对上、下限寄存器,分别用于存放进程的上下限地址。当进程1想要访问某内存单元时,CPU会根据指令当中想要访问的内存地址和上下限寄存器中的两个地址进行对比,只有在这两地址之间,才允许进程1进行访问

    image-20210523211952355

  • 方式二:采用重定位寄存器(又称基址寄存器)和届地址寄存器(又称限长寄存器)进行越界检查;重定位寄存器存放进程的起始物理地址,届地址寄存器存放进程的最大逻辑地址。进程需要访问某内存单元时,首先判断待访问单元的逻辑地址是否小于届地址寄存器中的值,是的话则合法,否则越界抛出异常;合法的话会与重定位寄存器中的值相加得到实际的物理地址然后进行访问

    image-20210608234244426



4.3 连续分配管理方式

内存管理的第一件事就是由操作系统负责内存空间的分配与回收,具体的实现分为两种方式:连续分配管理方式非连续分配管理方式,所谓连续分配就是指为用户进程分配的必须是一个连续的内存空间。

image-20210608234906661

image-20210608234517793

4.3.1 单一连续分配

image-20210614144226674 image-20210614144310774

image-20210523214256922

4.3.2 固定分区分配

image-20210614144404734 image-20210614144534196

image-20210523214419508

那么操作系统怎么记录各个分区空闲和分配的情况呢?通过需要建立一个分区说明表的数据结构,来实现各个分区的分配与回收

image-20210523214714580

4.3.3 动态分区分配

处于固定分区分配的缺点引入了动态分区分配的方式

image-20210614144601586

image-20210523214856323

但是随之而来也产生了3个问题:

  1. 系统要用什么样的数据结构记录内存的使用情况?

    image-20210523215114847

  2. 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配?

    image-20210608235447833

  3. 如何进行分区的分配与回收操作?

    系统会检查是否有空闲分区与回收区相邻,如果有,则修改空闲分区表/空闲分区链中相应的内容将他们合并

    image-20210608235500543

关于动态分区分配内存碎片的问题,动态分区分配没有内部碎片,但是有外部碎片

  • 内部碎片,分配给某进程的内存区域中,有些部分没有用上。
  • 外部碎片,是指内存中的某些空闲分区由于太小而难以利用。

image-20210523221100932



4.4 动态分区分配算法

image-20210523231844411

image-20210608235115982

4.4.1 首次适应算法

image-20210523232053324

4.4.2 最佳适应算法

image-20210523232902258

4.4.3 最坏适应算法

image-20210523232932959

4.4.4 邻近适应算法

image-20210523233135776



4.5 非连续分配管理方式

对于支持多道程序的两种连续分配方式:

  1. 固定分区分配:缺乏灵活性,会产生大量的内部碎片,内存的利用率很低
  2. 动态分区分配:会产生很多的外部碎片,虽然可用紧凑技术来解决,但是会耗费很大的时间代价

基于连续分配管理方式存在的缺点,我们能不能允许将一个进程分散的装入不相邻的分区中,这样能够更高效充分的利用内存,无需再紧凑,从而引入了非连续分配管理方式,所谓非连续就是为用户进程分配的可以是一些分散的内存空间

image-20210524000548930

非连续分配管理方式分为三种:基本分页存储管理、基本分段存储管理、段页式存储管理

image-20210524000606533

image-20210524000931015

4.5.1 分页存储管理

image-20210608235724755

image-20210524122639608

那么具体是怎么实现的呢?其中最重要的部分就是地址转换

image-20210524120958053

image-20210524121657260

那么如何计算页号和偏移量呢?对于我们而言

image-20210524123043035

而对于计算机而言,为了方便计计算,页面大小一般设置为2的整数幂

image-20210524123138506image-20210524123312829

因此计算机中的分页存储管理的逻辑地址结构是固定的,分为页号页面偏移量两部分

image-20210524123754281

现在我们知道了页号以及页面内部偏移量,那么怎么知道页号对应内存中的起始地址呢,这就引入了页表,用于记录进程页面和实际存放的内存块之间的关系

image-20210524124224158

image-20210524124434304

– 基本地址变换机构

image-20210524165042672

image-20210524164809002

例题:

image-20210524165353879

image-20210524165610735

image-20210524165617994

– 具有快表的地址变换机构

image-20210524182122499

具有块表的地址变换机构是基本地址变换机构根据局部性原理的改进版本,那么什么是局部性原理呢?

image-20210524182523209

了解完局部性原理之后,我们来看看快表的概念
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

– 两级页表

在这里插入图片描述

1️⃣ 单级页表存在的问题

在这里插入图片描述

  • 问题一:为了根据页号查询页表,页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框,比如这里需要专本给进程分配2^10连续的页框来存放页表
  • 问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面

2️⃣ 问题一解决方案:两级页表

image-20210605194029976

image-20210605194224181

image-20210605194329181

image-20210605194503815

3️⃣ 问题二解决方案

在这里插入图片描述

4️⃣ 需要注意的细节

image-20210605195000038
image-20210605195138680

4.5.2 分段存储管理

image-20210609000634903
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

image-20210605200707894

在内存的系统区当中,存在着许多用于管理软硬件系统资源的数据结构,比如PCB,当一个进程要上处理机运行之前,进程切换相关的内核程序会将进程的运行环境恢复,其中包含一个很重要的硬件寄存器——段表寄存器,其中存放段表地址和段表长度。因此段表地址和段表长度在进程还没有上处理机运行的时候存放在PCB中,被运行后存放在段表寄存器中。

当一个进程需要访问某逻辑单元的过程如下图所示:

image-20210606073457267

分页和分段的对比

两者的最大区别是分页中每个页面的长度是相同的,不需要对页面偏移量进行越界检查,而分段每个段的长度是不同的,一定要对段内偏移量与段长对比进行越界检查

image-20210606073840132

image-20210606074124044

image-20210606074226775

image-20210606074324980

4.5.3 段页式存储管理

image-20210609000831909
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

image-20210609000759482



4.6 内存空间扩充技术

操作系统内存管理的第二件事就是对内存空间进行扩充,具体有三种技术实现,分别是覆盖技术交换技术虚拟存储技术

image-20210524174651019

image-20210524181216847

4.6.1 覆盖技术

早期的计算机内存很小,比如IBM推出的第一台PC机最大只支持1MB大小的内存。因此经常会出现内存大小不够的情况。后来人们引入了覆盖技术,用来解决“程序大小超过物理内存总和”的问题

image-20210524174916962

image-20210524175030098

4.6.2 交换技术

image-20210524175224126

image-20210524175313402

随之而来有三个问题

image-20210524181106866

4.6.3 虚拟内存

image-20210609001033304

image-20210606081004286

虚拟技术的提出基于局部性原理

image-20210606081219475

image-20210606081459923image-20210606081532127

image-20210606081732416

– 请求分页管理方式

image-20210609001348563

请求分页管理方式是在基本分页管理方式基础上进行拓展而实现的虚拟内存管理技术

image-20210606081914066

image-20210609001210795

image-20210606082717223

image-20210606082826923

image-20210606082956990

image-20210606083054100
在这里插入图片描述

– 页面置换算法

image-20210606084700036

image-20210606085215851

最佳置换算法可以保证最低的缺页率,但实际上,只有在进程执行的过程中才能知道接下来会访问到的是哪个页面。操作系统无法ᨀ前预判页面访问序列。因此,最佳置换算法是无法实现的。

image-20210606085417475

image-20210606085555980
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

image-20210606090109386

– 页面分配策略

image-20210606090138113

image-20210606090821440

在这里插入图片描述

image-20210606091339471

image-20210606091513003

image-20210606091730303

image-20210606091851583

image-20210606092005827



4.7 磁盘的结构

image-20210611190822198

4.7.1 磁盘、磁道、扇区

image-20210606173239421

4.7.2 如何在磁盘中读/写数据

image-20210611191554480

4.7.3 盘面、柱面

image-20210611191455036

4.7.4 磁盘的物理地址

image-20210611191532227

4.7.5 磁盘的分类

image-20210611191635371

image-20210611191646871



4.8 磁盘调度算法

我们一般通过一次磁盘读写操作的时间衡量磁盘性能由,一次磁盘读写操作的时间由寻找(寻道)时间、延迟时间和传输时间决定

image-20210611191947991

磁盘调度算法对一次磁盘读/写操作需要的时间有很大的影响,因此要选择合适的磁盘调度算法对磁盘的整体性能有很大的影响,常见的磁盘调度算法如下图所示:

image-20210611191807483

image-20210611192756367

4.8.1 先来先服务算法(FCFS)

image-20210606175507559

4.8.2 最短寻找时间优先算法(SSTF)

image-20210606175611268

4.8.3 扫描算法(SCAN)

image-20210611192406688

4.8.4 LOOK调度算法

解决了扫描算法的第一个缺点:

image-20210606175835890

4.8.5 循环扫描算法(C-SCAN)

解决了扫描算法的第二个缺点:

image-20210611192627712

4.8.6 C-LOOK调度算法

image-20210611192718446



4.9 减少延迟时间的方法

image-20210611194348900

image-20210611193016059

4.9.1 交替编号

image-20210611193925639

4.9.2 磁盘地址结构的设计

image-20210611194015390

image-20210611194205067

image-20210611194219075

4.9.3 错位命名

image-20210611194245372

image-20210611194857040



4.10 磁盘管理

image-20210611195212882

4.10.1 磁盘初始化

image-20210606182717540

4.10.2 引导块

image-20210612091714906

image-20210612091737093

4.10.3 坏块的管理

image-20210606183137048

以上是关于操作系统学习笔记 第四章:存储器管理(王道考研)的主要内容,如果未能解决你的问题,请参考以下文章

操作系统学习笔记 第五章:文件管理(王道考研)

操作系统学习笔记 第五章:文件管理(王道考研)

操作系统学习笔记 第六章:设备管理(王道考研)

操作系统学习笔记 第六章:设备管理(王道考研)

操作系统—王道考研学习笔记 <3.1_6> 分页存储管理

操作系统学习笔记 第二章:进程管理(王道考研)