第四章 存储器管理
一、存储器的层次结构
1.1说明:
1.存储器管理的主要对象是内存,存储器的速度必须非常快,能与处理机的速度匹配。
2.存储器至少有三级:最高层为CPU寄存器,中间位主存,最底层为辅存
3.层次越高,访问速度越快,价格也越高。
4.层次图说明
5.可执行存储器
寄存器和主存储器被称为可执行存储器。
不同层次的存储介质,由操作系统统一进行管理,操作系统中的存储管理负责对可执行存储器管理的分配,回收,以及提供在存储层次间数据移动的管理机制。
6.主存储器用于保存进程运行时的程序和数据。
7.寄存器具有与处理机相同的速度,对寄存器的访问速度是最快的,完全能与CPU协调工作。
8.高速缓存:介于寄存器和存储器之间的存储器。用于备份主存中常用的数据。
降低处理机对主存储器的访问次数,
9.磁盘缓存:缓和对磁盘和对主存访问速度的不匹配,用于暂时存放频繁使用的一部分磁盘数据和信息。
二、程序的装入和链接
2.1用户程序执行的过程
1.编译:由编译程序对源程序进行编译,形成目标模块。
2.链接:由链接程序将编译后的一组目标模块以及所需要的库函数链接在一起,形成装入模块。
3.装入:由装入程序将装入模块装入内存。
2.2程序的装入方式
名称 | 适用范围 |
绝对装入方式 | 适合单用户单任务 |
可重定位装入方式 | 多用户多任务 |
动态运行时的装入方式 | 多用户多任务,物理地址的第一个装入重定位寄存器 |
2.3程序的链接方式
1.静态链接
2.装入时动态链接
3.运行时动态链接
三、连续分配存储管理方式
为用户程序分配内存,使用连续分配方式。
连续分配方式有四类:
3.1单一连续分配
用在单道批处理系统中
3.2固定分区分配
1.划分分区的方法
1.分区大小相等
2.分区大小不相等
2.内存分配
按照分区大小排序,建立分区使用表,表项包含,分区地址,大小,状态(是否已经分配)
3.3动态分区分配(可变分区分配)
1.说明:根据进程的实际需要,动态为之分配内存空间。
2.相关问题
使用的数据结构:空闲分区表,空闲分区链。
动态分区分配算法:顺序式搜索算法,索引式搜索算法
内存的分配和回收:
分配:从空闲分区中找到所需大小的分区。
回收:将进程释放的内存与相邻空闲分区进行合并。
| 算法名称 | 算法说明 | 优点 | 缺点 | 说明 |
基于顺序搜索的动态分区分配算法 | 首次适应(FF)算法 | 要求空闲分区链以地址递增的方式链接。 | 优先利用低址空闲分区,保留高址部分,为以后的大作业预留空间。 | 低址部分被划分后留下很多碎片。 从低址查找开始,增加开销。 |
|
循环首次适应(NF)算法 | 从上次找到的空闲分区的下一个空闲分区开始寻找。应该设置一个起始查找指针 | 能使内存中的空闲分区分布得更加均匀 | 会缺乏大的空闲分区 |
| |
最佳适应(BF)算法 | 每次分配作业到内存后,总是能把满足要求,又是最小的空闲分区按其容量从小到大的顺序形成一个空闲分区链 | 微观上第一次分配的内存是最佳的 | 宏观上看,每次分配内存后都会产生碎片 |
| |
最坏适应(WF)算法 | 扫描空闲分区链选出一个最大的空闲分区进行分割分配。 | 可以使剩下的空闲分区不至于太小,产生碎片的可能性小。
| 存储器中缺乏大的空闲分区 |
| |
基于索引搜索的动态分区分配算法 | 快速适应算法(分类搜索算法) | 将空闲分区根据其容量大小进行分类,对于每一类具有相同容量的所有空闲分区,单独设立一张空闲分区链表 | 1. 不会分割空闲分区, 2. 而且保证有大的空闲分区, 3. 不会产生内存碎片 4. 查找效率高 | 分配空间的算法复杂,系统开销大,一个分区只属于一个进程,存在一定的浪费。 | 以空间换时间 |
伙伴系统 | 无论空间是已分配的还是未分配的,都按照2的K次幂分配,对具有相同大小的空闲分区单独设立一个空闲分区双向链表 | 分配和回收的时间性能取决于查找空闲分区的位置和分割,合并空闲分区所花费的时间。 空间性能:减少了小的空闲分区的,提高了空闲分区的可使用率 |
| 广泛使用在多处理机中 | |
哈希算法 | 根据空闲分区在可利用空闲分区表中的分布规律,建立哈希函数,构造一张以空闲分区大小为关键字的哈希表 |
|
|
|
3.4动态可重定位分区分配
1.紧凑
移动内存中作业的位置,将原来多个分散的小分区合并成一个大分区的方法。
2.动态重定位
程序在执行时,真正访问的地址是相对地址与重定位寄存器中的地址相加而形成的。
四、分页存储管理方式
4.1 这种方式是基于离散分配方式的,无需对碎片内存进行操作,允许将一个进程直接分散地装入到许多不相邻接的分区中,便可充分利用内存空间。
根据离散分配地址空间的基本单位的不同,还可以将离散分配方式分为:
名称 | 单位 | 说明 |
分页存储管理 | 以页为单位 | 将用户程序的地址空间分为若干个固定大小的区域,称为“页”。 |
分段存储管理 | 以段为单位 | 将用户程序的地址空间分为若干个大小不同的段。(从用户的角度出发) |
段页式存储管理 | 以段和页为基本单位 | 结合以上两种的方法 |
4.2分页存储管理
1.页面和页面大小
页面:将进程的逻辑地址空间分为若干个页,并为各页加以编号。
2.页面大小通常为1KB~8KB之间
3.分页地址的地址结构
31 12 11 0
页号P | 位移量W |
说明:包含两部分:P为页号,W为页内地址
4.页号和页内地址的运算
已知一个逻辑地址空间的地址为A,页面的大小为L,页号P和页内地址d为
P= INT[A / L] d = [A]MOD L;
L 一般为1024,或者2048
1K |
2K |
3K |
5.页表:系统为每个进程创建一张页面映像表。在进程地址空间中的所有页(0~n),依次在页表中有一个页表项,记录了相应页在内存中对应的物理块号。
6.分页和分段的主要区别
分页 | 分段 |
页是信息的物理单位 | 段是信息的逻辑单位(由系统决定) |
页的大小固定且由系统决定 | 段的长度不固定,由用户程序的大小决定 |
分页的用户程序地址空间是一维的 | 用户程序的地址空间是二维的,既需要段名也需要给出段内地址。 |