4. 存储管理
4.1 工作原理
链接程序(linker)的作用是把多个目标模块链接成一个完整的可重定位程序,
分为动态链接(程序装载时)和运行时链接(函数或模块执行时)
现代操作系统都支持和采用动态链接系统库(Dynamic Link Library)及运行时装载
地址重定位:
- 静态地址重定位:进程执行前一次完成,无需硬件支持
- 动态地址重定位:由装入程序实现装载代码模块的加载,把它装入分配给进程的主存指定区域,但对程序的逻辑地址则不做任何修改,程序主存起始地址被置入硬件专用寄存器—重定位寄存器。程序执行过程中,每当CPU引用主存地址时,由硬件截取此逻辑地址,并在它被发送到主存储器之前加上重定位寄存器的值,实现动态地址转换。地址转换在进程执行时才进行。进程切换时,重定位寄存器的值需要保存。为了加快地址转换过程,动态重定位是由硬件实现的——存储管理单元(Memory Management Unit,MMU)。MMU不仅实现重定位,而且实现存储保护等其他管理功能
- 运行时链接地址重定位
4.2 连续存储管理
固定分区存储管理
在系统启动时,主存空间被分成数目固定不变的分区,各分区的大小不等,每个分区只装入一个作业
优点
- 支持多道程序
- 实现简单
缺点
- 大作业可能无法装入
- 主存空间利用率不高,会出现(分区内的)碎片
- 扩充困难
- 限制多道运行程序的个数
可变分区存储管理
可变分区存储管理是按作业的实际大小来划分分区,且分区个数也是随机的。
固定:内部;可变:外部。
内存不足的存储管理技术
1 移动技术 不可行
2 对换技术;将阻塞的程序换出到磁盘中,将磁盘中的进程换入主存
解决什么问题?可行性?如果不可行,怎么办?
多道程序,内存不够用;可行
3 覆盖技术 不可行
4.3 分页存储管理
进程的页表是放在内存中的,并需要知道其基址
快表
反置页表
4.4 分段存储管理
进程的逻辑地址空间由若干在逻辑上具有完整独立意义的单位组成,每个单位称为段(Segmentation)。系统为每个段建立独立的地址空间,每个段对应一个段号,一个段的地址空间从0开始编号。分段支持二维的内存管理方案。
4.5 虚拟存储管理
请求分页虚拟存储管理
硬件支撑:存储管理部件(MMU)
功能:
(1)管理硬件页表基址寄存器
进程切换时
(2)分解逻辑地址
分解为页号和页内位移
(3)管理快表TLB
查表、修改、清空(?)
(4)访问页表
根据页号查询页表
(5)发出中断
发出缺页中断,并将控制权交给内核存储管理处理。
(6)管理标志位
检查和设置页表中各个标志位,例如P、R/W等。
分页虚存管理不把作业信息(程序和数据)全部装入主存,仅装入立即使用的页面,在执行过程中访问到不在主存的页面时,产生缺页中断,再从磁盘动态地装入 。
怎样才能发现页面不在主存中呢? 如何查找页面对应的磁盘地址呢?扩充页表的内容,增加P标志位。页表增加项,记录页面所在的磁盘物理地址。
缺页中断率: 访问页面时,页面不在内存中(产生缺页中断)的概率。
(1)主存页框数(体会?)
(2)页面大小
(3)页面分配机制,替换算法(抖动)
(4)程序的局部性(见后面的例子)
缺页中断率小,(硬件)成本低,(计算)开销小。
抖动:刚被淘汰的页面马上又要用到,调用不久又被淘汰,如此反复,使得系统的页面调度十分频繁,以致于大部分时间都花在来回调度页面上
全局页面替换算法
- 最佳页面替换算法 OPT:调入一页而必须淘汰一个旧页时,所淘汰的页应该是以后不再访问的页或距现在最长时间后再访问的页(无法实现,衡量标准)
- 先进先出页面替换算法 FIFO 淘汰最先调入的;产生Belady异常:缺页中断率随着所分配的页框数增加而增加的现象
- 最近最少使用页面替换算法 LRU
- 第二次机会页面替换算法 SCR:FIFO改进:最先进入主存的页面,如果最近还在被使用的话,仍然有机会作为像一个新调入页面一样留在主存中。检查FIFO中的队首页面(最早进入主存页面),如果它的R位是0,这个页面既老又没有用,选择该页面淘汰; 如果R位是1,说明它进入主存较早,但最近仍在使用。把它的R位清0,并把这个页面移到队尾,把它看作是一个新调入的页。
- 时钟页面替换算法 Clock:循环队列;
》一个页面首次装入主存,其R位置1 ;
》主存中的任何页面被访问时, R位置1;
》淘汰页面时,从指针当前指向的页面开始扫描循环队列,把遇到的R位是1的页面的R位清0,跳过这个页面; 把所遇到的R位是0的页面淘汰掉,指针推进一步。