第四节 虚拟页式存储管理方案
分区方式管理内存:每道程序都占用内存的一个或几个连续的存储空间。当内存中无足够大的连续空间时,程序就无法装入,必须移动已在内存中的某些程序后才能再装入新的程序
如何解决程序规模大于内存的问题?
覆盖技术是由程序员指定,系统辅助完成的,对程序员的要求甚高,而且容易出错
将这类工作全部交给操作系统完成。这就产生了虚拟存储技术
一、虚拟存储技术
虚拟存储技术的基本思想:利用大容量的外存来扩充内存,产生一个比有限的实际内存空间大得多的、逻辑的虚拟内存空间,简称虚存,以便能够有效的支持多道程序系统的实现和大型程序运行的需要,从而增强系统的处理能力
实现虚拟存储器需要以下的硬件支持
1)系统有容量足够大的外存
2)系统有一定容量的内存
3)最主要的是,硬件提供实现虚--实地址映射的机制
虚拟存储器的工作原理:

交换技术:交换到外存上的对象一般都是进程,也就是说交换技术是以进程为单位进行的。
虚拟存储技术:一般是以页为单位
二、虚拟页式存储管理

页式存储器提供编程使用的虚拟地址由两部分组成
虚拟页号
页内地址
页式存储的地址结构确定了物理页面的大小
用户编辑时无需考虑如何分页的问题,仍使用连续的虚拟地址即可
三、页式存储管理中物理内存的分配与回收
内存分配表中具有三种标识:已分配、未分配、剩余空间物理页面数
简单的内存分配表可以用一张“位实图”构成。
假设内存的可分配区域被分成256个物理页面,则可用字长为32位的8个字作为“位实图”。位实图中的每一位与一个物理页面对应,每一位的值可以是0或1,0表示对应的物理页面为空闲,1表示已占用。
内存分配方案:

内存的归还:
1)根据归还的物理页面号计算出该物理页面在位实图对应的位置
2)将占用标志修改成0
3)再把回收的物理页面数加入到空闲物理页面数中
假定归还块的块号为,则在位示图中对应的位置为:
字号=【I/字长】,位号=i mod 字长
1、页式存储管理的地址转换
页表控制寄存器(页表始址寄存器、页表长度寄存器)+高速缓冲存储器的支持
1)页表始址寄存器,用于保存正在运行进程的页表在内存的首地址
2)页表长度寄存器,用于保存正在运行进程的页表的长度
物理地址的计算公式为:
物理地址=物理页面号*块长+业内地址
需要强调的是,物理页面号又称为页帧和页框号
2、页表项
在虚拟页存储管理中,页表项的设计如下
物理页面号:页面在内存中时所对应的物理页面号
有效位:又称驻留位、存在位,表示该页实在内存还是在磁盘
访问位:访问位表示该页在内存期间是否被访问过
修改位:修改位表示该页在内存中是否被修改过
保护位:是否能读/写
其中访问位和修改位可以用来置换哪个页面,具体由页面置换算法决定
3、页表
(1)多级页表
大多数操作系统中采用二级页表,即由表页和页目录一起构成进程页表
第一级表示页目录,保存页表页的地址
第二级表示页表页,保存物理页面号
(2)散列页表
当地址空间大于32位时,一种常见的方法是使用以页号为散列值的散列页表
其中每个表项都包含一个链表,该链表中元素的散列值都指向同一个位置。
散列页表中的每个表项都包含三个字段
(a)虚拟页号
(b)所映射的页框号
(c)指向链表中下一个元素的指针
(3)反置页表
每个物理页框对应一个表项。每个表项包含与该页框项对应的虚拟页面地址,以及拥有该页面进程的信息
特点:
1)整个系统只存在一个页表,并且每个页框对应其中一个表项
2)需要在反置页表中存放地址空间标识符
4、转换检测缓冲区(TLB)
给指定的虚拟地址进行续写时,必须访问两次内存
第一次按页号读出页表中对应的块号
第二次按计算出来的绝对地址进行读写
两次访问内存显然延长了指令的执行周期,降低了执行速度
四、虚拟页式存储地址转换过程
为了提高存取速度,有两种方法
1)在地址映射机制中增加一组高速寄存器保存页表。需要硬件支持,经济上不可行
2)在地址映射机制中增加一个小容量的联想寄存器(相联存储器),它由高速缓冲存储器组成
假定访问内存的时间是200毫微米,访问高速缓冲存储器的时间为40毫微米,高速缓冲存储器为16个单元,查TLB的命中率为90%
按虚拟地址转换成绝对地址进行存取的平均访问时间为:
(200+40)*90%+(200+200)*10%=256(毫微米)
不使用TLB需要两次访问内存的时间:200*2=400毫微米。可见使用TLB访问时间下降了36%
5、缺页异常处理
若在页表中发现所要访问的页面不在内存,则产生缺页异常
1)操作系统必须在内存中选择一个页面将其移出内存
2)页面在内存期间已经被修改过,就必须把它写回磁盘
3)该页没有被修改过,不需要写回,调入的页直接覆盖被淘汰的页
整个缺页处理过程简单阐述如下
1)根据当前执行指令中的逻辑地址查页表的有效位,判断该页是否在内存
2)该页标志为0,形成缺页异常。保留现场
3)操作系统处理缺页异常,寻找一个空闲的页面
4)若有空闲页,则把磁盘上读出的信息装入该页面中
5)修改页表及内存分配表,表示该页已在内存
6)如果内存中无空闲页,则按某种算法选择一个已在内存的页面,把它暂时调出内存
7)恢复现场,重新执行被中断的指令
6、页面调度策略
虚拟存储器系统通常定义三种策略来规定如何(或何时)进行页面调度:调入策略、置业策略和置换策略
(1)调入策略
虚拟存储器的调入策略决定了什么时候将一个页由外存调入内存之中
- 请求调页(demand paging) :只调入发生缺页时所需的页面
优点:实现简单
缺点:容易产生较多的缺页,造成对外存I/O 次数多,时间开销过大,容易产生颠簸现象
2、预调页(prepaging):在发生缺页需要调入某页时,一次调入该页以及相邻的几个页。
优点:提高了调页的I\O效率,减少了I\O次数
缺点:造成浪费,这种方式长用在程序装入时使用
关于调入页面来源,通常有以下两种做法
1)进程装入时,将其全部页面复制到交换区,以后总是从交换区调入
2)凡是未被修改的页面,都直接从文件去读入,而被置换时不需调出;已被修改的页面,被置换时需调出到交换区,以后从交换区调入
(2)置页策略
当线程产生缺页时,内存管理器还必须确定将调入的虚拟页放在物理内存的何处。用于确定最佳位置的一组规则称为“置页策略”
(3)置换策略

7.页面置换算法
如果刚被调出的页面又立即要用,因而又要把它装入,而装入不久又被选中调出,调出不久又被装入,如此反复,使调度非常频繁。这种现象称为抖动或称颠簸
常用的页面置换算法:


(4)时钟页面置换算法(clock)
一个更好的办法是把所有的页面都保存在一个类似时钟面的环形链表中,一个表针指向最老的页面。当发生缺页时,算法首先检查表针指向的页面,如果他的R位是0就置换该页面,并把新的页面插入这个位置,然后把表针前移一个位置,如果R位就是1就清楚R位并把表针前移一个位置,重复这个过程直到找到了一个R位为0的页面为止。由算法。于这个算法的工作方式,就将它称为时钟算法
(5)最近最少使用页面置换算法
在缺页发生时,首先淘汰掉最长时间未被使用过的页面。这个策略称为LRU页面置换算法。最近最少使用页面置换算法总是选择距离现在最长时间内没有被访问过的页面先调出。这种实现方法必须对每一页的访问情况时时刻刻的加以记录和更新,实现起来开销比较大,但LRU算法是在效果上最接近OPT算法的算法。
8、缺页率
假定一个程序共有n页,系统分配给它的物理页面是M个(m.n均为正整数,且1<=m<=n)
因此,该程序最多有m页可同时被装入内存。如果程序执行中访问页面的总次数为A,其中有F次访问的页面尚未装入内存,故产生了F次缺页异常
现定义:f=F/A,把f页称为缺页率
显然,缺页率与缺页异常的次数有关
影响缺页率的因素如下(4点)
(1)分配给程序的物理页面多,则同时装入内存的页面数就多,故减少了缺页异常的次数,也就降低了缺页率。反之,缺页率就高
(2)页面的大小
虚拟页面的大小取决于物理页面的大小,物理页面大则虚拟页面也大,每个页面大了则程序的页面数就少。装入程序时是按页存储在内存中的,因此,装入一页的信息量就大,就减少了缺页异常大的次数,降低了缺页率。反之,若页面小缺页率就高
(3)程序编制方法
怎样编制程序也是值得探讨的,程序编制的方法不同,对缺页异常的次数有很大影响
(4)页面调度算法
页面调度算法对缺页率的影响也很大,调度不好就会出现颠簸
理想的调度算法(OPT)能使缺页率最低,采用FIFO调度算法产生的缺页率约为最佳算法的3倍
五、虚拟页式存储管理的优缺点
优点:由于它不要求进程的程序段和数据在内存中连续存放,从而有效的解决了碎片问题,这既提高了内存的利用率,又有利于组织多道程序执行
缺点:存在页面空间的浪费问题。这是由于各种程序代码的长度是各不相同的,但页面的大小是固定的,所以在每个程序的最后一页内总有一部分空间得不到利用。如果页面较大,则由此引起的存储空间的损失仍然较大
六、虚拟页式存储管理的性能问题
引入虚拟存储管理,把内存和外存统一管理,其真正目的是把那些访问概率非常高的页放入内存,减少内外存交换的次数。在虚存中,页面可能在内存与外存之间频繁的调度,又可能出现抖动或颠簸
抖动或颠簸的原因:
1)颠簸是由于缺页率高而引起的
2)分配给一个进程的内存物理页面数太少
采用工作集模型,可以解决颠簸的问题
对于给定的进程访页序列,从时刻(t-△)到时刻f之间所访问页面的集合,称为该进程的工作集
其中,△称为工作集窗口
工作集是随时间而变化的,工作集大小与工作集窗口尺寸密切相关

浙公网安备 33010602011771号