王道操作系统笔记——— 内存管理的基本要求和连续分配管理方式

Posted Xiu Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道操作系统笔记——— 内存管理的基本要求和连续分配管理方式相关的知识,希望对你有一定的参考价值。

文章目录


一、内存的概念和作用

  主存储器,简称主存,又称内存储器(内存),用来存放计算机运行期间所需的程序和数据,CPU可以直接随机地对其进行访问,程序执行前需要先放到内存中才能被CPU处理,主要作用是 缓和CPU与硬盘之间的速度矛盾


  内存中有一个个的小房间,每个小房间就是一个存储单元,内存地址从 0 开始,每个地址对应一个存储单元如果计算机按字节编制,每个存储单元大小为 1 字节,即 8 个二进制;如果计算机按字编址,每个存储单元大小为 1 个字。若字长为 16 位,则每个存储单元大小为 16 个二进制。若字长为 32 位,则每个存储单元大小为 32 个二进制。

补充:几个常用的数量单位
1 1 1 B = 8 8 8 bit    2 10 2^10 210 = 1 1 1 K (千)   2 20 2^20 220 = 1 1 1 M (兆,百万)   2 30 2^30 230 = 1 1 1 G (千兆,十亿)
1 1 1 GB = 2 10 2^10 210 MB = 2 20 2^20 220 KB = 2 30 2^30 230 B = 8 8 8* 2 30 2^30 230 bit

例:一台手机/电脑 有 4 4 4GB 内存
是指该内存中可以存放 4 4 4* 2 30 2^30 230 个字节。如果是按字节编址的话,也就是有 4 4 4* 2 30 2^30 230 = 2 32 2^32 232 个小房间。这么多小房间,需要 2 32 2^32 232 个地址才能标识,所以地址需要用 32 32 32 个二进制位来表示( 0 0 0 ~ 2 32 2^32 232- 1 1 1


二、内存管理的概念

  虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有用户进程和系统所需的全部程序与数据放入内存,因此操作系统对内存空间进行合理的划分和有效的动态分配。操作系统对内存的划分和动态分配,就是内存管理的概念

操作系统作为系统资源的管理者,主要负责:
内存空间的分配与回收:OS 要怎么记录哪些内存区域已经被分配出去了,哪些又还空闲;当进程运行结束之后,如何将进程占用的内存空间回收。
内存空间的扩充:OS 利用虚拟内存技术或自动覆盖技术使得系统运行很大的程序,从逻辑上扩充内存。
地址转换:为了使编程更方便,程序员写程序时应该只需要关注指令、数据的逻辑地址。而 逻辑地址到物理地址的转换(这个过程称为地址重定位)应该由操作系统负责,其中 地址重定位有三种方式
内存保护:保证各进程在各自存储空间内运行,互不干扰。


三、进程运行的基本原理和要求

3.1 程序执行过程

创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
编译: 由编译程序将用户源代码编译成若干个目标模块,编译就是把高级语言翻译为机器语言
链接: 由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
装入(装载): 由装入程序将装入模块装入内存运行。


3.2 逻辑地址和物理地址

  编译后,每个目标模块都是从 0 号单元开始编址,这称为该目标模块的 逻辑地址 (或相对地址)。当链接程序将各个模块连接成一个完整的可执行目标程序时,链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编制的 逻辑地址空间。用户程序和程序员只需知道逻辑地址,而内存管理的具体机制则是完全透明的,只有系统编程人员才会涉及内存管理的具体机制。不同进程可以有相同的逻辑地址,因为这些相同的逻辑地址可以映射到内存的不同位置。
  物理地址空间 是指内存中物理单元的集合,它是地址转换的最终地址。进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址(动态重定位是地址转换推迟到程序真正要执行时才进行),这个过程称为 地址重定位

注:以上两段,重点在于理解


3.3 程序的链接

  1. 静态链接
    在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。

  2. 装入时动态链接
    将各 目标模块装入内存时,边装入边链接的链接方式。

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


3.4 程序的装入

  1. 绝对装入
    在编译与链接后,得到的装入模块指定 直接使用了绝对地址

  2. 静态重定位(可重定位装入)
    装入时对地址进行重定位,即将逻辑地址变换为物理地址,地址变换是在装入时一次完成的

    静态重定位的特点: 在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

  3. 动态重定位(动态运行时装入)
    装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址(装入时依然保持使用逻辑地址)而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持

    动态重定位特点: 可以将程序分配到不连续的存储区中;在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间;采用动态重定位时允许程序在内存中发生移动

注:链接的作用是形成了完整的装入模块与逻辑地址,但逻辑地址到物理地址的转换过程是重定位,而不是装入


3.5 内存保护

内存分配前,需要保护 OS 不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。用户进程可采取以下两种方法:

  1. 设置一对上下限寄存器
    在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。
  2. 利用重定位寄存器 和 界地址寄存器
    采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器 中存放的是进程的 起始物理地址界地址寄存器 中存放的是进程的 最大逻辑地址

四、覆盖与交换

在多道程序环境下用来扩充内存的两种方法:

4.1 覆盖技术

基本思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。

  内存中分为一个 固定区 和若干个 覆盖区。需要常驻内存的段放在 固定区 中,调入后就不再调出(除非运行结束)。不常用的段放在 覆盖区需要用到时调入内存,用不到时调出内存。并且 必须由程序员声明覆盖结构,操作系统完成自动覆盖。

缺点: 对用户不透明,增加了用户编程负担;覆盖技术 只用于早期的操作系统中,现在已成为历史。


4.2 交换技术

基本思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)
  中级调度(内存调度),采用的就是交换技术;暂时换出外存等待的进程状态为挂起状态(挂起态)挂起态又可以进一步细分为就绪挂起、阻塞挂起两种状态。

  1. 具有对换功能的操作系统中,通常把磁盘空间分为 文件区和对换区 两部分。 文件区 主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区 空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此 对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式。总之,对换区的I/O速度比文件区的更快
  2. 交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。
  3. 可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间。

注:PCB 会常驻内存,不会被换出外存。因为进程被换出外存后,系统需要通过PCB对进程进行管理。


下列措施中,能加快虚实地址转换的是( C )。
Ⅰ.增大快表(TLB)容量  Ⅱ.让页表常驻内存  Ⅲ.增大交换区(swap)
A.仅Ⅰ  B.仅Ⅱ  c.仅Ⅰ Ⅱ  D.仅Ⅱ Ⅲ
(来源:2014年408真题)


解析: 虚实地址转换,即逻辑地址与物理地址的转换。
增大快表容量:可增加查询快表命中的概率。
让页表常驻内存:在采用多级页表的请求分页存储管理系统中,页表常驻内存可保证在查询页表时不会发生缺页、调页的情况,从而加快地址转换。

  • 当系统有足够的交换区空间时,页面的换入换出都是通过交换区进行。
  • 当系统缺少足够的交换区空间时,不会被修改的文件直接从文件区调入,当它们需要换出时,由于未被修改因此不必换出,直接覆盖即可。可能被修改的页面,将其换出时必须调到交换区,以提升I/O速度。
  • 页表显然是可能被修改的内容,因此即使交换区空间不足,页表在换出时也必然放在交换区

因此,增大交换区对地址转换的速度无影响


五、连续分配管理方式

5.1 单一连续分配

  在单一连续分配方式中,内存被分为 系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间

优点: 实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护(eg:早期的 PC 操作系统 MS-DOS)。
缺点: 只能用于单用户、单任务的操作系统中;有内部碎片;存储器利用率极低。

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


5.2 固定分区分配

  固定分区分配是最简单的一种多道程序存储管理方式,它将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业。当有空闲分区时,便可从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。

  • 分区大小相等:用于利用一台计算机控制多个相同对象的场合,缺乏灵活性
  • 分区大小不等:划分多个小分区、适量中等分区和少量大分区,可以满足不同大小的进程需求,增加了灵活性

  为了便于内存分配,通常操作系统需要建立一个数据结构——它分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否已分配)。

优点: 实现简单,无外部碎片
缺点: 当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;
    会产生内部碎片,内存利用率低。


5.3 动态分区分配

  动态分区分配 又称为 可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此,系统分区的大小和数目是可变的。

5.3.1 空闲分区链与空闲分区表

系统中应用 空闲分区链、空闲分区表 两种数据结构记录内存的使用情况。


5.3.2 动态分区分配算法

当一个新作业装入内存时,须按照一定的 动态分区分配算法,从空闲分区表(或空闲分区链)中选出一个分区分配给该作业。

  1. 首次适应算法
    算法思想: 每次都从低地址开始查找,找到第一个能满足大小的空闲分区
    如何实现: 空闲分区以地址递增的次序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  2. 最佳适应算法
    算法思想: 优先使用更小的分区,以保留更多大分区
    如何实现: 空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  3. 最坏适应算法(最大适应算法)
    算法思想: 优先使用更大的分区,以防止产生太小的不可用的碎片
    如何实现: 空闲分区按容量递减次序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

  4. 邻近适应算法
    算法思想: 由首次适应演变而来,每次从上次查找结束位置开始查找
    如何实现: 空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。


5.3.3 四种分配算法对比(★)

算法算法思想空闲分区排列顺序优点缺点
首次适应从头到尾找适合的分区地址递增 次序排列综合性能最好;算法开销小 ,回收分区后一般不需要对空闲分区队列重新排序/
最佳适应优先使用更小的分区,以保留更多大分区容量递增 次序排列会有更多的大分区被保留下来,更能满足大进程的需求会产生很多难以利用的小碎片; 算法开销大 ,回收分区后可能需要对空闲分区队列重新排序
最坏适应优先使用更大的分区,以防止产生太小的不可用的碎片容量递减 次序排列可以减少难以利用的小碎片,更能满足小进程的需求大分区易被用完,不利于大进程; 算法开销大(原因同上)
邻近适应由首次适应演变而来,每次从上次查找结束位置开始查找地址递增 次序排列(可排列成循环链表)不用每次都从低地址的小分区开始检索;算法开销小 (原因同首次适应算法)会使高地址的大分区提前被用完

注:动态分区分配没有内部碎片,但是有外部碎片

在下列动态分区分配算法中,最容易产生内存碎片的是( C )。
A. 首次适应算法  B. 最坏适应算法  C. 最佳适应算法  D. 循环首次适应算法

解析:内存碎片包括内碎片和外碎片。
最佳适应算法总是匹配当前大小最接近的空闲分区,但是大多数情况下空闲分区的大小不可能完全和当前要求的大小相等,因此会产生很多难以利用的小碎片,所以最佳适应算法最容易产生内存碎片。
而最坏适应算法,优先使用大分区,余下的小分区,可以被分配给小进程使用,因此最坏适应算法可以减少难以利用的小碎片。
(来源:2019年408真题)

5.3.4 分区的分配与回收

回收内存分区时,有可能遇到四种情况:
① 回收区的后面有一个相邻的空闲分区。
② 回收区的前面有一个相邻的空闲分区。
③ 回收区的前、后各有一个相邻的空闲分区。
④ 回收区的前、后都没有相邻的空闲分区。

无论那种情况,都要遵循相邻的空闲分区要合并的原则

注:各表项的顺序不一定按照地址递增顺序排列,具体的排列方式需要依据动态分区分配算法来确定。


补充:紧凑技术

  外部碎片是指内存中的某些空闲分区由于太小而难以利用,但是当内存空闲分区总和可以满足当前进程时,那么可以利用紧凑技术解决该问题。如下图,进程3需要30MB,内存的空闲分区总和恰好可以满足进程3,紧凑之后,再将空闲分区分配给进程3。


  紧凑之后,需要修改各进程的起始地址,起始地址一般放在 PCB 中。当进程上 CPU 运行时,会把更新的地址信息放到重定位寄存器中,并使用动态重定位方式,对逻辑地址到物理地址的转换进行重新定位。如下图,分别表示紧凑之前与紧凑之后逻辑地址79处指令集合的内存情况。
     

以上是关于王道操作系统笔记——— 内存管理的基本要求和连续分配管理方式的主要内容,如果未能解决你的问题,请参考以下文章

操作系统笔记六 内存管理内存管理基础

王道操作系统笔记——— 内存管理的基本原理和要求

(王道408考研操作系统)第三章内存管理-第一节6-1:非连续分配管理方式之基本分页存储管理

(王道408考研操作系统)第三章内存管理-第一节6-2:非连续分配管理方式之基本分页存储管理之基本地址变换机构

(王道408考研操作系统)第三章内存管理-第一节6-4:非连续分配管理方式之基本分页存储管理之两级页表

(王道408考研操作系统)第三章内存管理-第一节6-3:非连续分配管理方式之基本分页存储管理之具有快表的地址变换机构