第八章 内存管理
基础知识
背景
基地址寄存器:含有最小的合法物理内存地址。
界限地址寄存器:决定了范围大小。
地址绑定(地址映射)
将指令与数据绑定到内存地址有以下几种情况:
编译时、加载时、执行时。
逻辑地址
CPU所生成的地址。
物理地址
内存单元看到的地址(即加载到内存地址寄存器中的地址)。
动态加载
一个子程序只有在调用时才被加载。目的是为了获得更好的内存空间使用率。
动态链接
类似于动态加载,只是这里不是将加载延迟到运行时,而是将链接延迟到运行时。
交换
进程需要在内存中以便执行。不过进程可以暂时从内存中交换到备份存储上,当需要再次执行时再调回到内存中。
连续内存分配
将用户区划分成多个分区,每个分区每个时刻运行一道程序。支持多道程序设计技术。
两种分区管理技术:
静态分区管理、动态分区管理。
固定分区分配
系统初始化时,系统将内存分成多个分区:
分区的数目固定,分区的大小固定,每个分区每个时刻只能运行一道程序。
固定分区表:
记录各分区的位置、大小及使用情况,用于系统对分区进行管理。
内碎片(内零头)
地址映射及存储保护:
使用Relocation register,limit register。
动态分区管理
基本思想:
系统初始化时,只划分成一个分区,内存“按需分配”。
分区表:
对已分配的分区进行管理
空闲分区表:
对空闲分区进行管理
分区分配算法:
First-fit, Best-fit, Worst-fit。
地址映射与存储保护:
使用Relocation register,limit register。
外碎片(零头外)
孔
在可变分区管理里,可用内存区域称为孔。
新的孔与其他孔相邻,那么这些孔将被合并成大孔。
从一组可用孔中选取一个空闲孔的方法:
首次适应、最佳适应、最差适应。
首次适应
分配第一个足够大的孔
最佳适应
分配最小的足够大的孔
最差适应
分配最大的孔
碎片
首次适应与最佳适应可产生外部碎片、分页可产生内部碎片
分页(超级重要哦)
将物理内存分为固定大小的块,称为帧。
将逻辑内存分为同样大小的块,成为页。
逻辑地址÷页面大小=页号……页偏移
基本思想:
内存分块(页框,frame),作业分页(page),页与页框大小相等。
内存分配以页为单位。
一个作业在内存中的各页面可以分配不相邻的页框,但一个页面在内存中是连续的(在一个页框中)。
逻辑地址的格式:页号,页内偏移量。
页表-页号与页框号的对应关系。
内碎片。
需要记录块(页框)的使用情况(已分配的、空闲的)-例如位示图。
地址变换机构(过程)。
存储保护:
页号越界检查(或设置相应的标志位(有效位))
共享页的访问权限
页面共享:
通过页表实现
转换表缓冲区(TLB)
类比cache,会同时与所有键进行比较(并行查找)。
地址越界检查
1、在页表中对应每一页设置一个valid/invalidbit,用于检测页号是否越界;
2、或者将页号(P)与页表长度(PTL)比较,如果P>=PTL,则产生地址越界中断。
<注>页内偏移量(d)不需检测是否地址越界;
共享页
如果代码是可重入代码(或称为纯代码),则可以共享。
可重入代码是不能自我修改的代码,它从不会在执行期间改变。
可共享页码代码的逻辑地址相同才能共享
页表结构
层次页表、哈希页表、反置页表
分段
分段和分页的主要区别
页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外碎片,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要;
段是信息的逻辑单位,它包含有一组其意义完整的信息。分段的目的是为了能更好地满足用户的需要。
页的大小固定且由系统决定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因为一个系统只有一种大小的页面;
段的长度不固定,决定于用户所编写的程序,通常由编译程序对源程序进行编译时,根据信息的性质来划分。
分页的作业地址空间是一维的,即单一的线性地址空间,程序员只须一个地址记忆符,即可表示一个地址;
分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
课后作业
1.
外部碎片:总内存空间存在,以满足请求,但它不是连续的。
内部碎片:分配内存可能略大于请求内存,此大小差异是内存内部的分区,不被使用。
3.
首次适应算法:212K放到500K里,417K放到600K里,112K放到288K(500-212),426K等待。
最佳适应算法:212K放到300K里,417K放到500K里,112K放到200K,426K放到600K。
最差适应算法:212K放到600K里,417K放到500K里,112K放到388K(600-212),426K等待。
最佳适应算法内存利用率最高。
4.
a.连续内存分配:当没有足够的空间给程序去扩大它已分配的内存空间时,将要求重新分配整个程序。
b.纯分段:当没有足够的空间给程序去扩大它已分配的内存空间时,将要求重新分配整个程序。
c.纯分页:在没有要求程序地址空间再分配的方案下,新页增加的分配是可能的。
5.
连续内存分配会产生外部碎片,因为地址空间是被连续分配的,当旧进程结束,新进程初始化的时候,洞会扩大。连续内存分配也不允许进程共享代码,因为一个进程的虚拟内存段是不被允许闯入不连续的段的。
纯段式分配也会产生外部碎片,因为在物理内存中,一个进程的段是被连续放置的,以及当死进程的段被新进程的段所替代时,碎片也将会产生。然而,段式分配可以使进程共享代码;比如,两个不同的进程可以共享一个代码段,但是有不同的数据段。
纯页式分配不会产生外部碎片,但会产生内部碎片。如果一页没有被完全利用,它就会产生内部碎片并且会产生空间浪费。页式分配也允许进程共享代码。
6.
地址在页式分配系统上是一个逻辑页号和一个偏移量。在逻辑页号的基础上产生一个物理页号,物理页通过搜索表被找到。因为操作系统控制这张表的内容,只有在这些物理页被分配到进程中时,它可以限制一个进程的进入。一个进程想要分配一个它所不拥有的页是不可能的,因为这一页在页表中不存在。为了允许这样的进入,操作系统只简单的需要准许入口给无进程内存被加到进程页表中。当两个或多个进程需要交换数据时,这是十分有用的。——它们只是读和写相同的物理地址(可能在多样的物理地址中)。在进程内通信时,这是十分高效的。
9.
a.400毫秒:200毫秒访问页表,200毫秒访问内存。
b.0.75×200+0.25×400=250毫秒
12.
a.0430+219=649
b.2300+10=2310
c.500>100非法地址
d.1327+400=1727
e.122>96非法地址
13.
在某些情况下,分页的页表可以变得足够大,可以简化内存分配问题(确保全部可以分
配固定大小的页,而不是可变大小的块),确保当前未使用的部分页表可以交换。
思考题
1、几个地址及相应的地址空间概念
逻辑地址(相对地址、虚地址):编译及动态链接时使用的地址
物理地址(绝对地址、实地址):实际运行时使用的内存地址
2、静态链接与动态链接
静态链接:
运行之前完成连接,将所有的程序模块链接起来,形成一个可执行文件, 运行时直接装入内存;
链接及装入过程费时,有些用不到的模块不需要链接及装入;
不便于模块的升级;
运行速度快;
动态链接:
运行时仅链接所需要的模块;
运行调用时进行链接;
减少了链接需要的时间;
节省内存空间;
便于模块的升级、共享;
3、静态装入与动态装入
静态装入:
运行前装入所有模块;
装入时费时,浪费内存;
但管理简单,运行时速度快
动态装入:
运行时可只装入主控模块;
其他模块被调用时再装入,提高了内存的利用率,只有需要的模块才被 装入;
管理复杂,运行时速度降低
4、分区管理中的几个分区算法
静态分区管理
固定分区:数目固定、大小固定
动态分区管理
首次适应(first-fit):
分配第一个足够大的孔。查找可以从头开始,也可以从上次首次适 应结束时开始。一旦找到足够大的空闲孔,就可以停止。
最佳适应(best-fit):
分配最小的足够大的孔。必须查找整个列表,除非列表按大小排序。 这种方法可以产生最小剩余孔。(升序)
最差适应(worst-fit):
分配最大的孔。同样,必须查找整个列表,除非列表按大小排序。 这种方法可以产生最大剩余孔,该孔可能比最佳适应发放产生的较 小剩余孔更为有用。(降序)
5、Fragmentation
外碎片:内存空间被分为小片段,但不连续,无法分配
内碎片:分配内存大于使用内存,未被使用
6、分页、分段管理的基本思想
分页:
l 内存分块(页框,frame),作业分页(page),页与页框大小相等
内存分配以页为单位
l 一个作业在内存中的各页面可以分配不相邻的页框,但一个页面在内存中是连续的(在一个页框中)
l 逻辑地址的格式:页号,页内偏移量
l 页表-页号与页框号的对应关系
l 内碎片
l 需要记录块(页框)的使用情况(已分配的、空闲的)
分段:
l 作业分段,内存按动态分区管理
l 内存分配以段为单位
l 每个段都有一个段名和长度
l 一个作业在内存中可以不连续,但在一个段内是连续的
l 逻辑地址的格式:段号 ,段内偏移量
l 段表-段与段所在内存位置的对应关系
l 外碎片
7、分页、分段管理的地址变换过程;变换工作中硬件与软件的分工
分页:
l 当进程要访问某个逻辑地址中的数据或指令时,MMU中的分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。
l 查找操作由硬件执行。
l 在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间,产生地址越界。
l 若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入MAR中的高位部分,再将逻辑地址中页内偏移量送入MAR的低位部分。这样便完成了从逻辑地址到物理地址的变换。(或者将帧号与页内偏移量拼接后形成物理地址,再送入MAR)
OS与cpu的分工
(1)根据当前执行的进程的PCB保存的进程页表设置系统的PTBR及PTLR的内容;(软件)
(2)CPU对执行的指令进行解析,分离出欲访问存储单元的逻辑地址;(硬件)
(3)MMU将逻辑地址根据规定的页面大小分成页号(P)与页内偏移量(d)两部分;(MMU,硬件)
(4)根据页号P进行地址越界检查(MMU,硬件),如果产生地址越界,则对越界进行处理(软件)
(5)如果没有产生地址越界,则依据页号P查找页表,得到页号P所对应的物理帧号f;(MMU,硬件)
(5)将帧号f作为物理地址的高位部分,页内偏移量d作为物理地址的低位部分,形成逻辑地址所对应的物理地址,送入MAR;(硬件)
分段:
8、分页、分段管理的存储保护方法
分页:
l 页号越界检查(或设置相应的标志位(有效位))
l 共享页的访问权限
分段:
l 段号、段内偏移量的越界检查,段的访问权限
9、分页、分段管理的内存共享(方法、条件)
分页:
l 通过页表实现
分段:
l 共享段,相同段号
10、Structure of the Page Table(页表结构)
l Hierarchical Paging(层次页表)
l Hashed Page Tables (哈希页表)
l Inverted Page Tables (反置页表)