页式段式等各种内存管理策略是为了将多个进程保存在内存中以便允许多道程序设计,它们都具有以下两个共同的特征:
作业必须一次性全部被装入内存后,方能开始运行。
(1)当作业很大时,将使该作业无法运行。
(2)当大量作业要求运行时,由于内存不足以容纳所有内存,只能使少数作业先运行,导致多道程序度的下降。
作业被装入内存后,就一直驻留在内存中,其任何部分都不会被换出,直至作业运行结束。
虚拟内存技术实际上就是建立了一个“内存-外存“的两级存储器的结构,利用局部性原理实现高速缓存。
虚拟存储器特征:
(1)多次性
是指无需在作业运行时一次性地全部装入内存,而是允许被分成多次掉入了内存运行。
(2)对换性
无需在作业运行时一直常驻内存,而是允许在作业的运行过程中,进行换进和换出。
(3)虚拟性
是指从逻辑上扩充内存的容量,使用户所看到的内存容量,远大于实际的内存容量。
虚拟内存中,允许将一个作业分多次调入内存,采用连续分配方式时,会使相当一部分内存空间都处于暂时或“永久”的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量,因此,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。
虚拟内存的实现有以下三种方式:
请求分页系统建立在基本分页系统的基础上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种虚拟存储器方法。
请求分页系统
在基本分页系统基础上增加了四个字段
页号|物理块号|状态位P|访问字段A|修改位M|外存地址
(1) 状态位P:用于指示该页是否已调入内存,供程序訪问时參考。
(2) 访问字段A:用于记录本页在一段时间内被訪问的次数,或记录本页近期已有多长时间未被訪问,供选择换出页面时參考。
(3) 改动位M:表示该页在调入内存后是否被改动过。因为内存中的每一页都在外存上保留一份副本,因此,若未被改动,在置换该页时就不需再将该页写回到外存上,以降低系统的开销和启动磁盘的次数;若已被改动,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本 。简言之,M位供置换页面时參考。
(4) 外存地址:用于指出该页在外存上的地址,一般是物理块号,供调入该页时參考。
在请求分页系统中,每当所要访问的页面不在内存时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞(调页完成唤醒),如果内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中相应页表项,若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
缺页中断作为中断同样要经历,诸如保护CPU环境、分析中断原因、转入缺页中断处理程序、恢复CPU环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别:
相对于分页系统主要增加了关于状态位P的操作。
页面置换算法
只有FIFO算法可能会出现Belady异常,而LRU和OPT算法永远不会出现Belady异常。
FIFO的性能较差,因为较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出,并且有Belady现象。所谓Belady现象是指:采用FIFO算法时,如果对—个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
LRU性能较好,但需要寄存器和栈的硬件支持。LRU是堆栈类算法,理论上可以证明,堆栈类算法不可能出现Belady异常。
LRU算法的性能接近OPT,但是实现起来比较困难,且开销较大,FIFO算法实现简单,但性能差,所以操作系统的设计者尝试了很多算法,试图用比较小的开销接近LRU的性能,这类算法都是CLOCK算法的变体,因为算法要循环扫描缓冲区像时钟一样转动。所以叫clock算法。
改进型的Clock算法需要综合考虑某一内存页面的访问位和修改位来判断是否置换该页面。在实际编写算法过程中,同样可以用一个等长的整型数组来标识每个内存块的修改状态。访问位A和修改位M可以组成一下四种类型的页面。
1类(A =0, M = 0):表示该页面最近既未被访问,又未被修改,是最佳淘汰页。
2类(A =0, M = 1):表示该页面最近未被访问,但已被修改,并不是很好的淘汰页。
3类(A =1, M = 0):表示该页面最近已被访问,但未被修改,该页有可能再被访问。
4类(A =1, M = 1):表示该页最近已被访问且被修改,该页可能再被访问。
1.驻留集大小
(1)分配给一个进程的存储量越小,在任何时候驻留在主存中的进程数就越多,从而可以提高处理机的时间利用率。
(2)如果一个进程在主存的页数过少,尽管有局部性原理,页错误率仍然会相对较高
(3)如果页数过多,由于局部性原理,给特定进程分配更多的主存空间对该进程的错误率没有明显影响。
目前预调页成功率约50%
一般情况下,两种调页策略会同时使用。
请求分页系统中外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。对换区通常是采用连续分配方式,而文件区采用离散分配方式,故对换区的磁盘I/O速度比文件区的更快。
(1)系统拥有足够的对换区空间:可以全部从对换区调入所需页面,以提高调页速度,为此,在进程运行前,虚将与该进程有关的文件从文件区复制到对换区。
(2)系统缺少足够的对换区空间:凡不会被修改的文件都直接从文件区调入,而当换出这些页面时,由于它们未被修改而不必再将它们换出。但对于那些可能被修改的部分,在将它们换出时须调到对换区,以后需要时再从对换区调入。
(3)UNIX方式:与进程有关的文件都放在文件区,故未运行的页面,都应从文件区调入。曾经运行过但又被换出的页面,由于是被放在对换区,因此下次调入时应从对换区调入。进程请求的共享页面若被其他进程调入内存,则无需再从对换区调入。
频繁的页面调度行为称为抖动,或颠簸
工作集
原理:让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。如果还有空闲物理块,则可以再调一个进程到内存以增加多道程序数。如果所有工作集之和增加以至于超过了可用物理块的总数,那么操作系统会暂停一个进程,将其页面调出并且将其物理块分配给其他进程,防止出现抖动。
1.虚拟存储只能基于非连续分配技术。
2.虚拟存储器容量既不受外存容量限制,也不受内存容量限制,而是由CPU的寻址范围决定的。
3.在请求分页存储器中,由于页面尺寸增大,存放程序需要的页数就会减少,因此缺页中断的次数也会减少。
4.进程在执行中发生了缺页中断,经操作系统处理后,应让其执行被中断的那一条指令,缺页中断是访存指令引起的,说明所要访问的页面不在内存中,在进行缺页中断处理后,调入所要访问的页面后,访存指令显然应该重新执行。
5.缺页中断调入新页面,肯定要修改页表项和分配页框,同时内存没有页面,需要从外存读入,会发生磁盘I/O。
6.虚拟存储技术是基于程序的局部性原理,局部性越好虚拟存储系统越能更好地发挥其作用。
7.无论采用什么算法,每种页面第一次访问时不可能在内存中,必然发生缺页,所以缺页次数大于程序所需要的页数。
8.LRU算法需要对所有的页最近被访问的时间进行记录,查找时间最久的进行替换,这涉及排序,对置换算法而言,开销太大。
9.页表项中合法位信息显示着本页面是否在内存中,也即决定了是否会发生页面故障。
10.虚拟存储扩充内存的基本方法是将一些页或段从内存中调入,调出,而调入,调出的基本手段是覆盖与交换。
11.请求分页存储管理的主要特点是扩充了内存。
12.页式虚拟存储管理的特点是不要求将作业同时全部装入到连续区域,一般只装入10%~30%,不要求将作业装入主存连续区域是所有离散式存储管理(包括页式存储管理)的特点,页式虚拟存储管理需要进行中断处理和页面置换。
13.快表在计算机系统中是用于地址变换。
14.覆盖技术与虚拟存储技术最本质的不同在于覆盖程序段的最大长度要受内存容量大小的限制,而虚拟存储器中的程序最大长度不受内存容量的限制,只受计算机地址结构的限制。另外,覆盖技术中的覆盖段由程序设计,且要求覆盖段中的各个覆盖具有相对独立性,不存在直接联系或相互交叉访问,而虚拟存储技术对用户的程序段之间没有这种要求。
15.交换技术与虚存技术相同点是都要在内存与外存之间交换信息,交换技术与虚存中使用的调入/调出技术主要的区别是:交换技术调入/调出整个进程,因此一个进程大小要受内存容量大小的限制,而虚存中使用的调入/调出技术在内存和外存之间来回传递的是页面或分段,而不是整个进程,从而使得进程的地址映射具有了更大的灵活性,且允许进程的大小比可用的内存空间大。
1.已知系统为32位实地址,采用48位虚地址,页面大小为4KB,页表项大小为8B,假设系统使用纯页式存储,则采用(4)级页表,页内偏移地址(12)位。
页面大小为4KB,故页内偏移为12位,系统采用48位虚拟地址,故虚页号48-12=36位。采用多级页表时,最高级页表不能超出一页大小,每页能容纳页表项数位:4KB/8B=512=2^9,36/9=4,故采用4级页表。