文章目录
【第五章】存储器管理
| 本章概念
1.存储器的层次结构
- 存储层次:CPU寄存器、主存:高速缓存、主存储器、磁盘缓存、辅存:固定磁盘、可移动介质
- 寄存器:访问速度最快,与CPU协调工作,价格贵
- 主存储器:内存或主存。
- 高速缓存:介于寄存器和存储器之间;备份主存主常用数据,减少对主存储器的访问次数;缓和内存与处理机之间的矛盾。
- 磁盘缓存:暂时存放频繁使用的一部分磁盘数据和信息;缓和主存和I/O设备在速度上的不匹配;利用主存的部分空间,主存可看成辅存的高速缓存
- 层次越高,访问速度越快,价格也越高,存储容量也最小
- 寄存器和主存掉电后存储的信息不再存在,辅存的信息长期保存
2.程序的装入和链接
-
程序的运行步骤
- 编译:由编译程序(Compiler)对源程序进行编译,形成若干个目标模块
- 链接:由链接程序(Linker)将目标模块和它们所需要的库函数链接在一 起,形成一个完整的装入模块
- 装入:由装入程序(Loader)将装入模块装入内存
-
物理地址和逻辑地址
- 物理地址(绝对地址):内存以字节为单位编址
- 物理地址空间:所有物理地址的集合
- 逻辑地址(虚拟地址、相对地址):由CPU产生的地址,即程序编译后使用的相对于0字节的地址
- 逻辑地址空间:由程序所生成的所有逻辑地址的集合
-
地址的翻译:翻译规则取决于虚拟内存采用的组织机制,包括:分段机制和分页机制
-
内存保护
- 目的:保护OS不被用户访问,保护用户进程不会相互影响
- 实现:硬件判断“基地址≤物理地址<(基地址 +界限地址)”是否成立。
-
程序的装入
- 绝对装入方式:编译时产生的地址使用绝对地址,程序或数据被修改时,需要重新编译程序
- 可重定位装入方式:编译后的目标模块使用相对地址、在装入时完成重定位(静态重定位)、需硬件支持
- 动态运行时装入方式:编译后目标模块使用相对地址、在运行时程序在内存中的位置不固定,需要完成重定位;地址变换推迟到程序真正要执行时才进行
-
程序的链接
- 静态链接:在程序运行前,将各目标模块及它们所需的库函数链接成一个完整的装配模块,以后不再拆开;对相对地址进行修改;变换外部调用符号
- 装入时动态链接:在装入内存时,采用边装入边链接的链接方式;便于修改和更新、实现对目标模块的共享
- 运行时动态链接:将某些目标模块的链接推迟到执行时才执行,加快装入过程,节省大量的内存空间
3.对换
-
为什么要有对换?
- 内存中某些进程由于某事件尚未发生而被阻塞运行,却占用了大量的内存空间,甚至可能出现在内存中所有进程都被阻塞而迫使CPU停止下来等待的情况
- 另一方面,却又有着许多作业在外存上等待,因无内存而不能进入内存运行的情况。
- 浪费资源,降低系统吞吐量
-
什么是对换?
- 首先,把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上,以便腾出足够的内存空间。
- 然后,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。
- 对换是提高内存利用率的有效措施,广泛应用于OS中
-
对换的类型
-
整体对换:对换以整个进程为单位,也称为进程对换。被广泛应用于多道程序系统,并作为处理机中级调度
为了实现进程对换,系统必须能实现三方面的功能:对换空间的管理、进程的换出、进程的换入
-
页面(分段)对换:对换是以“页”或“段”为单位进行的,又统称为 “部分对换”。目的是为了支持虚拟存储系统
-
-
对换区的管理
- 主要目标:提高进程换入和换出的速度、提高文件存储空间的利用率、应采用连续分配方式,很少考虑碎片问题
- 盘块管理中的数据结构:记录外存对换区中的空闲盘块的使用情况
-
进程的换出
- 对换进程在实现进程换出时,是将内存中的某些进程调出至对换区,以便腾出内存空间。
- 分为两步:选择被换出的进程(阻塞状态或睡眠状态的进程,低优先级的进程)、进程换出过程(先申请兑换区 → 启动磁盘 → 直到无阻塞进程)
-
进程的换入
- 首先查看PCB集合中所有进程的状态, 从中找出“就绪”状态但已换出的进程
- 有许多这样的进程时,它将选择 其中已换出到磁盘上时间最久的进程作为换入进 程,为它申请内存
- 如果申请成功,可直接将进程从外存调入内存;
- 如果失败,则需先将内存中的某些进程换出,腾出足够的内存空间后,再将进程调 入
4.覆盖
- 解决的问题:程序大小超过物理内存总和
- 程序执行时:只在内存中保留那些在任何时间都需要的指令和数据;程序的不同部分在内存中相互替换。
- 由程序员声明覆盖结构,不需要操作系统的特别支持
- 覆盖结构的程序设计很复杂
- 应用于早期的操作系统
5.连续分配存储管理方式相关概念
在【3.对换】中,我们提到了对换区的管理的主要目标是提高进程换入和换出的速度、提高文件存储空间的利用率、应采用连续分配方式
因此,本节介绍一下主要的连续分配方式的算法
单一连续分配、固定分区分配
动态分配 —— 基于顺序搜索(掌握!)
- 依次搜索空闲分区链上的空闲分区,寻找一个其大小能够满足要求的分区
- 分类:首次适应算法(FF)、循环首次适应算法(NF)、最佳适应算法(BF)、最坏适应算法(WF)
- 具体算法过程请参考【基于顺序搜索的连续分配算法】
动态分配 —— 基于索引搜索(了解)
- 提高搜索空闲分区的速度,在大、中型系统中采用
- 快速适应算法、伙伴系统和哈希算法
- 快速适应算法:
- 将空闲分区按其 容量大小进行分类,具有相同容 量的所有空闲分区设有一个空闲分区链表
- 系统设有一张管理索引表,每一项对应一个空闲分区类型
- 分配时,根据进程长度,从索引表中寻找到能容纳它的最小空闲分区链表; 从链表中取下第一块进行分配
- 优点:不分割分区,不产生碎片,查找效率高;缺点:分区归还主存时算法复杂,系统开销较大,存在浪费
- 伙伴系统:
- 内存按2的幂的大小来分配,即4KB 、8KB 等
- 满足要求是以2的幂为单位的
- 如果请求不为2的幂,则需要调整到下一个更大的2的幂,然后再判断。
- 当分配需求小于现在可用内存时,当前段就分为两个更小的2的幂段,然后再判断。
- 哈希算法:
- 建立哈希函数,构造一张以空闲分区大小为关键字的哈希表,该表的每一个 表项对应于一个空闲分区链表的头指针。
- 进行分配时,根据空闲区大小,通过计算哈希函数,得到在哈希表中的位置, 找到对应的空闲分区链表。
- 优点:查找快速!
动态分配 —— 重定位分区分配
- 连续分配方式存在的问题:碎片:不能被利用的小分区
- 解决方案:通过移动内存中的作业位置,以把原来多个分散的小分区拼接成一个大分区。即:紧凑
- 动态重定位:在指令运行时,实现地址转换(相对地址转换为绝对地址)
紧凑的示例:
动态重定位示例:
动态分区分配算法流程图:
6.分页存储管理方式相关概念
-
把物理内存分成大小固定的块,称为物理块(frame)。(大小为2的幂, 通常为1KB~8KB)
-
把逻辑内存也分成固定大小的块,称为页(page)
-
运行一个有N页大小的程序,需要找到N个空的页框来装入程序
-
存在页内碎片:进程最后一页经常装不满,而形成不可利用的碎片
-
页的地址结构为:页号P、位移量W(页内地址)
-
页表:
- 系统为每个进程建立了一张页表
- 逻辑地址空间内的所有页,依次 在页表中有一表项,记录相应页 在内存中对应的物理块号
- 页表的作用:实现从页号到块号的地址映射。
-
页表结构:
- 现代的大多数计算机系统,都支持非常大的逻辑地址空间。在这样的环 境下,页表就变得非常大,要占用相当大的内存空间
- 解决办法:对页表所需要的内存空间,采用离散分配方式,部分页表调入内存
- 页表结构的类型:两级页表、多级页表、反置页表
7.分段存储管理方式相关概念
-
分段方式的引入的必要性:
- 方便编程:作业按照逻辑关系划分为若干个段,每个段都是从0开始编址, 并有自己的名字和长度。访问的逻辑地址是由段号和段内偏移量(段内地址)决定
- 信息共享:在实现对程序和数据的共享时,是以信息的逻辑单位为基础的(分页系统中的 “页”只是存放信息的物理单位,并无完整的意义,不便于实现共享,然而段却是信息的逻辑单位。)
- 信息保护:信息保护同样是对信息的逻辑单位进行保护
- 动态链接
- 动态增长
-
分段的基本原理
- 在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定 义了一组逻辑信息。
- 每个段都有自己的名字,通常用一个段号来代替段名,每个段都从0开始 编址,并存储在一段连续的地址空间内
- 段的长度由相应的逻辑信息组的长度决定,因此各段长度不等。
-
段表
- 类似于分页系统,在系统中为每个进程建立一张段映射表(段表),用于实现从逻辑段到物理内存区的映射。
- 每个段在表中占有一个表项, 记录了该段在内存中的起始地 址(基址)和段的长度。
-
分段系统的变址过程
分段 VS 分页 -
分段的一个突出优点,是易于实现段的共享,即允许若干个进程共享一个 或多个分段,且对段的保护也十分简单易行。
-
在分页系统中,虽然也能实现程序和数据的共享,但远不如分段系统来得 方便。
-
可重入代码(纯代码):一种允许多个进程同时访问的代码。
-
可重入代码的示例(信息共享,一个共享段的例子):
8.段页式存储管理方式
- 基本原理:分段和分页原理的结合,即先将用户程序分成若干段,再把每个段分成 若干个页,并为每个段赋予一个段名。
- 优点:既有分段系统的便于实现、可共享、易于保护、可动态链接;又能像分页系统,很好地解决内存的外部碎片问题。
- 地址结构如下:
| 本章算法
1.基于顺序搜索的连续分配 FF BF NF WF
FF首次适应算法
定义:从 链首 开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存空间,分配给请求者, 余下的空闲分区仍留在空闲链中。
缺点:低址部分留下许多小碎片
BF最佳适应算法
定义:搜索整个序列,找到适合条件的 最小 的分区进行分配
NF循环首次适应算法
定义:从 上次找到的空闲分区的下一个空闲分区开始 查找,直到找到一个能满足要求的空闲分区
BF最坏适应算法
定义:搜索整个序列,寻找 最大 的分区进行分配
- 例题
某系统采用动态分区分配方式管理内存,内存空间为640KB,高端40KB用来存放OS。在分配内存时,系统优先使用空闲区低端的空间。
对下列的请求序列: 作业1申请130KB、作业2申请60KB、作业3申请100KB、作业2释放60KB、作业 4申请200KB、作业3释放100KB、作业1释放130KB、作业5申请140KB、作业6 申请60KB、作业7申请50KB、作业6释放60KB,
请分别画图表示出使用 FF 和 BF进行内存分配和回收后,内存的实际使用情况。
需要注意:
①从上到下,上面是空闲区低端,下面是空闲区高端!
②每一次申请后,都需要重新排序空间的大小
答案如下:
2.内存分配流程
流程图(重点)
例题
3.页地址结构的相关计算
给出页结构,计算每页的大小和地址空间最多允许的页数
上述页地址展示的为:地址空间最多允许有1M(2^20)页;每页大小为4KB (2^12)
最多允许的页数 = 2^页号的个数
每页的大小 = 2^页内地址对应的个数
给出逻辑地址空间中的地址A,页面的大小L,求页号P和页内地址d
P = A / L
d = A % L
例如:系统页面大小为1KB,设A=5168B,则P=5,d=48
4.页表与快表【有效访问时间】计算
普通的地址变换机构
具有快表的地址变换机构
引入快表后的有效访问时间EAT
λ:查找快表需要的时间为
t:访问内存一次需要的时间
a:命中率
EAT = t + t = 2t (基本分页存储系统中)
EAT = 2 * t + λ - a * t(引入快表的有效访问时间)
例题
例题2
5.逻辑地址 通过页表 转换为物理地址 的计算
例题1
在一个分页存储管理系统中,页面大小为4KB,系统中的地址占24位,给定 页面变换表如下表所示。
(1)计算逻辑地址(页号为3,页内地址为100)的物理地址。
(2)说明地址变换过程。
(1)逻辑地址(页号3,页内地址100)的物理地址为: 7×4KB+100=28KB+100=28772
(2)先将逻辑地址分解成页号P和页内地址W两部分 → 查页表可得页号P对应的物理块号B → 物理地址 = 页号对应的块号 × 页面大小 + 页内地址
例题2(课后例题)
解题步骤如下:
①先根据十进制的逻辑地址,利用 A / L 计算出页号,然后 A % L 计算出页内地址。
②通过计算出的页号,查找内存块号
③通过公式 物理地址 = 页号对应的块号 × 页面大小 + 页内地址 计算出物理地址
6.页表与物理块的相关计算
第一题补充解析:
32个页面,因为2^5=32,所以页号需要的是2的幂的位数,也就是15到11
页数可以从0开始,所以不要把这个页数理所当然地认为从1开始。
每页2kb,表中以B为单位,则2kb = 2048b = 2 * 2^10 b = 2^11 b 因此从0-11
第二题补充解析:拥有逻辑空间32页,就相当于这个进程最多可以有32页。
结合页表相关知识,则这个进程的所有页汇总成的页表有32项
即:进程的页表有32项。
物理空间1MB=1024K,每页为2KB,则每页分得的物理块的个数为1024 / 2 = 2^9 b
即:每一页有9块内存块
第三题补充解析:物理空间减少一半后:512KB,
此时每页可以分得的内存块为 512k / 2K = 2^8 即每一页8块内存块
又因为逻辑空间不变,所以页表项数不变。
即:页表项数不变,但是每一项的内存块 -1,即每项的长度减少1位
| 课后简答题
1.存储器管理的基本任务,是为多道程序的并发执行提供良好的存储器环境。请问:“良好的存储器环境”应包含哪几个方面?
①让每道程序“各得其所”,在不受干扰的环境中运行
②向用户提供更大的存储空间,使更多的作业能同时运行
③为用户在信息的访问、保护、共享以及动态链接等方面提供方便
④使存储器有较高的利用率。
2.内存保护是否可以完全由软件实现?为什么?
内存保护的主要任务,是确保每道程序都只能在自己的内存区中运行,要求系统能对每条指令所访问的地址是否超出自己内存区的范围进行越界检查。
越界检查通常由硬件实现,以使指令能够与越界检查并行执行
内存保护是由硬件和软件协同完成的
3.(考研真题)请解释什么是重定位?为什么要重定位?
①将用户程序的相对地址(逻辑地址)转换为绝对地址(物理地址)的过程称为重定位。
采用重定位,可根据内存的当前地址使用情况,将装入模块装入内存的适当位置,并确定装入的物理地址,以保证程序运行时存取指令或数据地址的正确
4.动态重定位的实现方式有哪几种?
连续分配方式下的动态重定位。当CPU要存取指令或数据时,硬件地址转换机构会自动将逻辑地址与重定位寄存器的值相加形成指令或数据的物理地址。
离散分配方式下的动态重定位。
①系统首先必须为每个作业配置一张页(段)表、用来记录作业的每个页(段)对应的内存块号(内存起始地址和段长),页(段)表被存放在内存中:
②整个系统须设置一个面(段)表控制寄存器,用来存放正在执行的作业的页(段)表起始地址和长度
③当CPU要存取指令或数据时,硬件的地址转换机构会自动将逻辑地址分成页号和页内地址两部分
5.可采用哪几种方式将程序装入内存?它们分别适用于何种场合?
绝对装入方式、重定位装入方式、动态运行时装入方式。
绝对装入方式适用于单道程序环境中,
重定位装入方式和动态运行时装入方式适用于多道程序环境中。
6.何谓静态链接?静态链接时需要解决哪两个问题?
静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的装入模块,以后不再拆开的链接方式
须解决以下2个问题:
(1)修改相对地址,将除了第一个模块外的相对地址修改为装入模块中相应的相对地址
(2)变换外部调用符号,即将每个模块中所用的外部调用符号变换为相对地址
7.(考研真题)编写程序时,源代码必须经过编译和链接生成目标代码,请问什么是链接?链接主要解决了什么问题?简述链接的主要类型及其优缺点。
链接是指由链接程序将编译后形成的一组目标模块以及所需库函数链接在一脱。讲而形成个完整的装入模块。
链接主要有3种类型。
(1)静态链接。优点:适用范围广;缺点:不可修改,无法实现对目标模块的共享
(2)装入时动态链接。优点:便于修改和更新,便于实现对目标模块的共享
(3)运行时动态链接。优点:能加快程序的装入过程,还能大大节约内存空间
8.为什么要引入对换?对换可分为哪几种类型?
在多道程序环墙下、一方面,在内存中的某些讲程会因某事件尚未发生而阻塞,但此时它占用了大量的内存空间,这样,内存中的所有进程都有可能被阻塞,进而发生迫使CPU停止下来等待的情况,另一方面,有许多作业因内存空间不足会一直驻留在外存上,而不能进入内存运行。这不仅浪费系统资源,而且会降低系统吞吐量。为了解决这一问题,在OS中引入了对换(也称交换)技术。
对换可分为整体对换和部分对换两种类型。