第四章 存储器管理
1. 存储器的层次结构
[1] 多级存储器结构
[2] 主存储器与寄存器
[3] 高速缓存和磁盘缓存
2. 程序的装入和链接
[1] 程序的装入
[2] 程序的链接
3. 连续分配方式
1. 单一连续分配
2. 固定分区分配
3. 动态分区分配
4. 伙伴系统
5. 哈希算法
6. 可重定位分区分配
7. 对换
4. 基本分页存储管理方式
[1] 页面与页表
[2] 地址变换机构
[3] 两级与多级页表
5. 基本分段存储管理方式
6. 虚拟存储器的基本概念
7. 请求分页存储管理方式
8. 页面置换算法
9. 请求分段管理方式
存储器管理的主要对象是内存,外存主要用来放文件。
一、 存储器的层次结构
1. 多级存储器结构
分为三层:CPU寄存器、主存和辅存。
寄存器和主存是操作系统管理范畴,指令访问,辅存是设备管理范畴,通过I/O设备实现。
2. 主存储器与寄存器
主存储器:即内存,保存程序和数据。CPU只能从内存中取指令和数据,但主存储器访问速度远低于CPU,所以引入寄存器和高速缓存。
寄存器:可以存放操作数等加快主存储器访问速度。
3. 高速缓存和磁盘缓存
高速缓存:容量大于寄存器,速度高于主存。程序和指令存放再贮存中,CPU访问时,临时复制到高速缓存,CPU可直接去除,避免频繁访问主存,提高执行速度。
磁盘缓存:磁盘I/O速度低于主存访问速度。利用主存中的空间,提供磁盘缓存,减少对磁盘的频繁读写,提高速度,主存也可以看做辅存的高速缓存。
二、 程序的装入和链接
在多道程序环境下,要使程序运行,需要将程序和数据加入内存,然后创建进程,
源程序变为可执行程序需要经过:
A. 编译:把源代码编译成若干目标模块。
B. 链接:将目标模块和所需库函数链接成装入模块。
C. 装入:将装入模块装入内存。
1. 程序的装入(内存)
A. 绝对装入方式
将目标模块装入内存中事先指定的位置,只适合单道程序环境,需要事先知道存放位置,且程序或数据被修改时,可能要改变所有地址。
B. 可重定位装入方式
在装入时对目标程序中的指令和数据进行修改,根据内存的情况,指定适当位置。
重定位:装入时对目标程序的修改。因为地址变换再装入时一次完成,所以是静态重定位。
C. 动态运行时装入方式
模块装入内存时,并不立即转换为绝对地址,而是等执行时再转换。为不影响指令执行速度,需要一个重定位寄存器来负责地址转换。
2. 程序的链接
A. 静态链接(事先进行链接)
程序运行之前,将目标模块和库函数连接成完整装配模块,之后不再分开。
B. 装入时动态链接
编译后的目标模块,在装入时边装入边链接。
C. 运行时动态链接
在执行过程中,若发现调入模块未装入内存,再去调用装入链接。
三、 连续分配方式
1. 单一连续分配
只能用于单用户、单任务的操作系统,把内存分为系统区和用户区,系统区让os用,放在内存的低址部分。
2. 固定分区分配
将内存分为多个固定大小区域,一个分区只能装一道作业。
内存分配:分区按大小排毒,建立一张分区使用表,包括每个分区的起始地址、大小及状态。当有程序要装入时,检索该表,分配分区。但因为大小固定,所以易造成浪费。
3. 动态分区分配
根据进程需要,动态地为之分配内存空间。
[1] 分区分配中的数据结构
空闲分区表,记录分区、序号始址及分区大小。
空闲分区链,设置前后指针,和尾部设置状态位和分区大小表目,
[2] 分区分配算法
A. 首次适应算法
空闲分区链以地址递增次序链接。优先利用低址的空闲分区,可保证之后分配大的分区,但是低址部分不断划分,易留下许多零碎分区。
B. 循环首次适应算法
从上次的空闲分区开始查找,若到结尾可返回头继续查找。要设置查询指针,能使空闲分区分布均匀,但容易缺乏大的空闲分区。
C. 最佳适应算法
每次为作业分配内存时,总把最满足要求、最小的分配给作业。分区按容量小到大顺序排列,容易留下小空闲区。
D. 最坏适应算法
分区按容量大到小排列,每次挑最大的分配,避免碎片,但容易缺乏大分区。
以上四种也称顺序搜索法。
E. 快速适应算法
也称分类搜索法,将分区按容量大小分类,相同大小建一个空闲分区链表,并为多个链表设置索引表。然后查找分配。
优点:效率高,缺点,分区归还时算法复杂。
[3] 分区分配操作
A. 分配内存,考察请求分区和空闲分区大小,做出判断。
B. 回收内存,四种情况,分别是合并和重建表。
4. 伙伴系统
是固定分区和动态分区的一种折中,既避免固定分区的进程数目限制,又避免动态分区回收时算法的复杂性。
5. 哈希算法
6. 可重定位分区分配
7. 对换
四、 基本分页存储管理方式
[4] 页面与页表
[5] 地址变换机构
[6] 两级与多级页表
五、 基本分段存储管理方式
六、 虚拟存储器的基本概念
七、 请求分页存储管理方式
八、 页面置换算法
九、 请求分段管理方式