一、虚拟内存的基本概念
1.传统存储管理方式的特征
(1)一次性:作业必须一次性装入内存后,方能开始运行。这会导致
*作业很大以致不能全部装入内存时,改作业无法运行
*大量作业要求运行时,内存不足容纳所有,只能少部分先,多道程序度下降
(2)驻留性:作业装入内存后,一直驻留在内存中,其任何部分都不会换出,直至运行over
由以上可知,许多在程序运行中不用或暂时不用的程序(数据)占据了大量空间。浪费了内存资源。
2.局部性原理
要理解虚拟内存技术的思想,首先必须了解局部性原理。快表、页高速缓存以及虚拟内存技术从广义上讲都属于高速缓存技术。这个技术所依赖的原理就是局部性原理。
局部性原理表现在以下两个方面:
(1)时间局部性:某条指令一旦执行,不久后该指令可能再次执行;如果数据被访问过,不久后该数据可能再次被访问。产生时间局部性的典型原因是由于程序中存在着大量的循环操作。
(2)空间局部性:一旦程序访问了某个存储单元,不久后,其附近的存储单元也将被访问,集中在那一定范围内。
时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。
3.虚拟存储器的定义和特征
基于局部性原理,程序装入时可以将程序的一部分装入内存,而将其余部分留在外存,就可以启动程序执行。程序执行过程中,当所访问的信息不再内存时,由操作系统将所需要的部分调入内存,然后继续执行。额外的,操作系统还可以将内存中暂时不用的内容换到外存,腾出空间。这样,系统好像为用户提供了一个比实际大的多的存储器,称为,虚拟存储器。
特征:
(1)多次性,无需作业运行时一次性装入内存。
(2)对换性,允许作业运行过程中,进行换入和换出。
(3)虚拟性,从逻辑上扩充内存的容量,使用户看到的内存容量,远大于实际的内存容量。
4.虚拟内存技术的实现
虚拟内存技术建立在离散(即非连续)分配的内存管理方式之上。
虚拟内存的实现有三种方式:
(1)请求分页存储管理
(2)请求分段存储管理
(3)请求段页式存储管理
二、请求分页管理方式
建立在基本分页系统基础之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。
1.页表机制
请求分页系统在一个作业运行之前不要求全部一次性调入内存,因此在作业的运行过程中,必然会出现要访问的页面不在内存的情况,如何发现和处理这种情况是请求分页系统必须解决的两个基本问题。
请求分页系统中的页表项
2.缺页中断机构
请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。
缺页中断与一般的中断相比,它有以下两个明显的区别:
*在指令执行期间产生和处理中断信号,而非一条指令执行完成后,属于内部中断。
*一条指令在执行期间,可能产生多次缺页中断
3.地址变换机构
如图3-25所示,在进行地址变换时,先检索快表:
- 若找到要访问的页,便修改页表项中的访问位(写指令则还须重置修改位),然后利用页表项中给出的物理块号和页内地址形成物理地址。
- 若未找到该页的页表项,应到内存中去查找页表,再对比页表项中的状态位P,看该页是否已调入内存,未调入则产生缺页中断,请求从外存把该页调入内存
三、页面置换算法
进程运行时,若访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的兑换区。
而选择调出页面的算法就称为页面置换算法。常见的置换算法有以下四种。
1.最佳置换(OPT)算法
最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但因为无法预知,因此该算法无法实现。但可以用来评价其它算法。
2.先进先出(FIFO)算法
优先淘汰最早进入内存的页面,也就是在内存中驻留时间最久的页面。
FIFO算法还会产生当所分配的物理块数增大而页故障数不减反增的异常现象,称为“Belady”异常。
3.最近最久未使用(LRU)算法
选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问的页面,在最近的将来可能也不会被访问。
4.时钟(CLOCK)算法
LRU算法性能接近OPT但实现困难,且开销大;FIFO算法实现简单,但性能差。试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体。因为算法要扫描缓冲区,像时钟的针一样的转动,所以叫CLOCK算法。
工作集理论
- 引入:工作集是基于局部性原理的假设的。如果能预知程序在某段时间间隔内要访问哪些页面,并能提前将它们调入内存,将会大大降低缺页率,从而减少置换工作,提高* * 用率。
- 定义:工作集是最近* 内存访问的页面的集合,数字* 称为工作集窗口,也就是工作集的大小。
- 原理:让操作系统监视各个工作集的大小,若有空闲的物理块,则可以再调一个进程到内存以增加多道的程度;若工作集的大小总和增加超过了所有可用物理块的数量总和,那么操作系统可以选择一个内存中的进程对换到磁盘中去,以减少内存中的进程数量来防止抖动的发生。
页面分配策略
- 固定分配局部置换:为每个进程分配一定数目的物理块,这个数目是确定的,进程运行期间都不会改变。
- 可变分配全局置换:操作系统维护一个空闲物理块队列,每次有进程缺页时都从空闲物理块队列上取下一个分配给它,若系统中已经没有空闲的物理块了,那么系统将有可能调出任何进程中的其中一页。
页面调入策略
- 请求调页策略:一个页面只有在被用到时才被调入到内存中,否则就放在外存中。这种调页方式容易产生较多的缺页中断,时间开销大,容易产生抖动现象。
- 预调页策略:是指将预计不久之后会被用到的页面一并调入到内存,尽管暂时它们还没被用到。这是一种基于局部性原理的预测,通常用于程序的首次调入。
从何处调入页面
- 系统拥有足够的对换区空间:这时可以全部从对换区调入所需页面,以提高调页速度。
- 系统缺少足够的对换区空间:这时凡是不会被修改的文件,都直接从文件区调入;而当置换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时,便需调到对换区,以后需要时再从对换区调入。
- 方式:由于与进程有关的文件都放在文件区,因此凡是未运行过的页面都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。
Belady异常
- 定义:FIFO置换算法的缺页率可能会随着所分配的物理块数的增加而增加,这种奇怪的现象就是Belady 异常。
- 原因:FIFO算法的置换特征与进程访问内存的动态特征相矛盾,即被置换的页面并不是进程不会访问的。
- 注意:FIFO法和最佳置换算法永远不会出现Belady异常,被归类为堆栈算法的页面置换算法也不可能出现Belady异常。
抖动现象
- 定义:若选用的页面置换算法不合适,可能会出现抖动现象:刚被淘汰的页面,过后不久又要访问,并且调入不久后又调出,如此反复,使得系统把大部分时间用在了页面的调入调出上,而几乎不能完成任何有效的工作,这种现象称为抖动(或颠簸)。
- 原因:在请求分页系统中每个进程只能分配到所需全部内存空间的一部分。
缺页率
- 定义:假定一个作业共有* ,系统分配给该作业m的空间m<=n。如果该作业在运行*需要访问* 页面(即引用串长度为* ,其中所要访问页面不在内存,需要将所需页调入内存的次数为F 则缺页率定义为f=F/A命中率即为1-f
- 缺页率会受置换算法、分配的页面数量、页面大小等因素的影响。
- 缺页率对于请求分页管理系统是很重要的,如果缺页率过高,会直接导致读取页面的平均时间增加,会使进程执行速度显著降低。因此,如何降低缺页率是一项非常重要的工作。
地址进制之间的转换
通常题目给出的地址形式分为两种:十进制与其他进制(通常是十六进制、八进制或二进制)。当题目中给出的地址是十进制时,通常地址是不会特别说明或者不带后缀的,例如“访问7105号单元”;而当给出的地址是其他进制时,通常会特别说明或者用符号后缀,十六进制、八进制与二进制对应的后缀分别为字母H、O、B,例如“访问1A79H号单元”就是十六进制地址,其中字母H表示该地址是以十六进制给出的。而在答题过程中,通常会进行进制之间的转换,在转换之后可以将转换后的地址加括号并加注下标来表明转换后的进制,例如将17ACH(十六进制)转化为二进制,则可以表示为17A* = 17A* = 00* 01* 10* 1100
逻辑地址转换为物理地址的过程
- 将其他进制转化为二进制,方便处理。
- 求出页号,页号为逻辑地址与页面大小的商,二进制下为地址高位。
- 求出页内位移,页内位移为逻辑地址与页面大小的余数,二进制下为地址低位。
- 根据题意产生页表,通过查找页表得到对应页的内存块号或页框号(页框号为把物理块地址除去页内位移若干位后剩下的地址高位,也可以简单理解为“物理地址的页号”)。
- 如果给出的是内存块号,则用内存块号乘以块大小,加上基址,再加上页内位移得到 物理地址(给出这种条件的题目通常会给出物理地址的基址或者起始地址)。
- 如果给出的是页框号,则用页框号与页内位移进行拼接(页框号依然是高位,页内位移是低位,与逻辑地址的页号和页内位移构成类似),得到物理地址。
- 将二进制表示的物理地址根据题目要求转换为十六进制或者十进制。
一次地址访问的过程
首先程序内部的地址访问通过分段查LDT表项,得到虚拟地址,虚拟地址通过MMU查页表转换为物理地址