虚拟存储管理
前面介绍的存储管理方案要求作业全部装入内存才可运行。但这会出现两种情况:
- 有的作业因太大,内存装不下而无法运行。
- 系统中作业数太多,因系统容量有限只能让少数作业先运行。
1 局部性原理
定义:
- 程序执行时,大多数情况下是顺序执行的。
- 过程调用会使程序的执行轨迹从一部分内存区域转至另一部分区域,但过程调用的深度不会超过5。
- 程序中有许多循环语句,这些语句会重复多次执行。
- 程序中对数据结构的操作,往往局限在很小的范围内。
局限性的表现:
时间局限性: 程序中的的某条指令一旦执行,不久后会再次执行。
空间局限性: 程序一旦访问某存储单元,不久后会访问其附近的存储单元。
2 虚拟存储器的定义
所谓虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量进行扩充的一种存储器系统。
虚拟存储器的特征:
离散性:作业不装入连续的存储空间,内存分配采用离散分配方
多次性:一个作业被分割,被多次调入内存。
对换性:作业在运行过程中换进、换出内存。
虚拟性:从逻辑上扩充了内存的容量。虚拟存储器的特征
3 请求页式存储管理
状态位P:记录该页是否在内存。P=1该页在内存;P=0该页不在内存。
访问字段A:记录该页在一段时间内被访问的次数。
修改位M:记录该页在内存期间是否被修改过。M=1该页调入内存后被修改过;M=0该页调入内存后未被修改过。
外存地址:该页在外存的地址
缺页中断: 在指令执行期间产生和处理中断信号(指令执行1次即缺页1次)。一条指令执行期间,可能产生多次缺页中断。
驻留集:
- 保证进程正常运行所需的最少物理块数是多少?
- 为每个进程分配物理块时,其数目是固定的、还是可变的?
- 如何为进程置换物理块,是局部置换?还是全局置换?
进程正常运行最少需要物理块数:
- 物理块越多越好!——虚拟?
- 随着为进程分配的物理块数目的减少,将使进程执行中的缺页率提高,从而降低进程的执行速度。
- 能保证进程正常运行所需的最小物理块数是多少?这与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。
驻留集管理:
固定分配、局部置换
- 为每个进程分配固定页数的内存空间、且运行过程中不变。
- 当进程缺页时,只能从该进程在内存的几个页面中选出一页换出,然后再调入一页,保证进程的页数不变。
可变分配、全局置换
- 系统开始先为每个进程分配一定数目的物理块。整个系统有一空闲物理块链,当某进程缺页时,系统从空闲链中选出一块分配给进程。
- 空闲链为空时,OS从所有进程的页面中权衡选择一页换出。
可变分配、局部置换
- 分配同上,但进程缺页时,只能从该进程在内存的页面中选出一页换出。
调入策略:
何时调入页面:预调,请调。
从何处调入:进程的所有页面都放在对换区。只将修改过的页面放在对换区,未改的放在文件区。
UNIX系统方式,首次从文件区调入,换出时放在对换区,以后从对换区调入
4 请求页式存储管理的页面置换算法
4.1 最佳置换算法OPT
结论: 先置换最早不再使用或最长时间不使用的页面。理想性的置换算法,目前无法实现。
4.2 先进先出置换算法FIFO
结论: 先置换最早进入的页面。
4.3 最近最久未使用置换算法LRU
结论: 先置换最久未使用的页面。
4.4 CLOCK置换算法
LRU性能较好,但实现困难!因此可用CLOCK算法。为每页设一访问位,再将内存中的所有页面链接成一循环队列。
- 当某页被访问时,其访问位置1。
- 置换算法在选择一页淘汰时,只需检查其访问位。(如果是0,就选择该页换出;–如果是1,则重新将其置为0,暂不换出。)
CLOCK页面置换算法:
除了考虑页面的使用情况外,还要考虑该页是否被修改过。
由访问位A和修改位M组合成下面四种情况的组合:
<1>A=0,M=0该页既未被访问过、又未被修改过,是最佳淘汰页。
<2>A=0,M=1该页最近未被访问、但已被修改,可以被淘汰。
<3>A=1,M=0最近已被访问,但未被修改,该页有可能再被访问。
<4>A=1,M=1最近已被访问且被修改,该页可能再被访问。
CLOCK算法执行过程:
1>从当前位置扫描循环队列,寻找〈1〉类页面。
2>若1>失败,开始第二轮扫描,寻找<2>类页面,并将所经过的页面的访问位置0。
3>若2>也失败,返回到开始位置,将所有的访问位复0,goto 1>。
4.5 驻留集
即在某段时间间隔内,进程实际要访问的页面的集合。
正确选择驻留集窗口大小:
- 窗口大小Δ选择得过小,频繁产生缺页中断。
- 窗口大小Δ选择得很大,失去了虚拟存储器的意义。
4.6 缺页率与物理块数的关系
为进程分配的物理块数达到一定值图中拐点处,缺页率保持在上下限之间。
4.7 CPU的利用率与多道程序数的关系
抖动的产生:
- 在多道程序环境下,并不是“多道程序的度越高,系统吞吐量越大。”
- 当CPU的利用率达到某一峰值后,若继续增加多道程度,将产生抖动。
抖动预防方法:
- 加载控制
- L=S准则(产生缺页的平均时间L等于系统处理缺页的平均时间S)
- 采用局部置换
- 挂起若干进程
5 请求段式存储管理
除段号、段长和段始址这些段式系统已有的基本表项之外,增加了以下表项:
- 存取方式:用于标识本段的存取属性是只执行、只读,还是允许读/写。
- 状态位:指示该段是否已进驻内存。
- 访问字段:用于记录本段有多长时间没有被访问。置换算法在选择换出段时参考。
- 修改位:表示该段调入内存后是否被修改过。
- 增补位:这是请求段式存储管理系统中特有的字段,用于表示本段在运行过程中是否进行过动态增长。
- 外存地址:用于指出该段在外存的地址,供调入该段时使用。
动态链接