一、虚拟内存管理
(一)虚拟内存概念
1、局部性原理
大多数程序执行时,在一个较短时间内仅使用程序代码的一部分,相应地,程序所访问的存储空间也局限于某个区域,这就是程序执行的局部性原理。
时间局部性。一条指令的一次执行和下次执行,一个数据的一次访问和下次访问,都集中在一个较短的时间内。
空间局部性。当前指令和邻近的几条指令,当前访问的数据和邻近的数据,都集中在一个较小的区域内。
2、虚拟内存定义
在程序装入时,一方面可以将程序的一部分放入内存,而将其余部分放在外存,然后启动程序(部分装入)。在程序执行过程中,当所访问的信息不在内存中时,再由操作系统将所需的部分调入内存(请求调入)。另一方面,操作系统将内存中暂时不适用的内容置换到外存上,从而腾出空间存放将要调入内存的信息(置换功能)。这种从逻辑上扩充内存容量的存储器系统成为虚拟存储器(简称虚存)。
3、虚拟内存特征
虚拟内存的意义是让程序存在的地址空间与运行时的存储空间分开,程序员可以完全不考虑实际内存的大小,而在地址空间内编写程序,虚拟存储器的容量由计算机的地址结构决定,并不是无限大。虚拟内存具有如下特征:
离散性。程序在内存中离散存储。(离散性并不是虚拟内存特有的特征,基本分页和分段也具有离散性)。
多次性。一个作业可以多次调入内存。
对换性(交换性)作业在运行过程中可以换入、换出。
虚拟性。从逻辑上扩充内存容量,用户可以使用的空间可以远大于实际内存容量。
4、虚拟内存的软硬件支持
1、要有相当数量的外存,足以存放多个用户程序。
2、要有一定容量的内存,在处理器上运行的程序必须有一部分信息存放在内存。
3、中断机构,当用户访问的部分不在内存中时中断程序运行。
4、地址变换机构,以动态实现虚地址到实地址的地址变换。
5、相关数据结构,段表或页表。
(二)请求分页存储管理方式
1、请求分页原理
在分页存储管理系统的基础上,通过增加请求调页功能、页面置换功能所形成的一种虚拟存储系统。在请求分页存储管理中,作业运行前,只要将当前需要的一部分页面装入内存,便可以启动作业运行。在作业运行过程中,若所要访问的页面不在内存中,则通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面置换到外存上,以便腾出内存空间。
可以说,请求分页 = 基本分页 + 请求调页功能 + 页面置换功能。
2、页表结构
1、页号和物理块号。这两个字段在分页存储管理系统中已经定义过,是进行地址变换所必需的。
2、状态位(存在位)。用于判断页面是否在内存中,每当进行内存访问时,根据该位判断要访问的页面是否在内存中,若不在内存中,则产生缺页中断。
3、访问字段。用户记录页面在一段时间内被访问的次数,或最近已有多久未被访问,以供置换算法在选择换出页面时参考。
4、修改位。用户表示页面调入内存后是否被修改过,当处理器以写方式访问页面时,系统将设置该页面的修改位。由于内存中的页面在外存上都有副本,因此,若页面未被修改,则在该页面置换出时不需要将页面写到外存,以减少磁盘写的次数;若页面被修改,则必须将页面重新写到外存。
5、外存地址。用户指出页面在外存上的存放地址,供调入页面时使用。
3、缺页中断与地址变换
在请求分页存储管理系统中,若所访问的页面在内存中,其地址变换过程与分页存储管理系统相同;若访问的页面不在内存,则应先将该页面调入内存,再按照基本分页存储管理系统相同的方式进行地址变换。
若系统发现所要访问的页面不在内存中,便产生一个缺页中断信号,此时用户程序被中断,控制转到操作系统的缺页中断处理程序。缺页中断处理程序根据该页在外存的位置将其调入内存。在调页过程中,若内存中有空闲空间,则缺页中断处理程序只需要把缺页装入 任何一个空闲存储块中,再对页表的相应表项进行修改(如填写物理块号、修改状态位、设置访问字段及修改位初始值等)即可;若内存中没有空闲空间,则必须先淘汰内存中的某些页面,若被淘汰的页面曾被修改过,则要将其写回外存。
4、请求分页管理方式的优缺点
优点。①可以离散存储程序,降低了碎片数量;②提供虚拟存储器,提高了内存利用率,有利于多道程序运行,方便用户。
缺点。①必须有硬件支持;②有些情况下系统会产生抖动现象;③程序最后一页仍然存在未被利用的部分空间。
(三)请求分段存储管理方式
1、请求分段原理
在请求分段存储管理系统中,作业运行前,只要将当前需要的若干段装入内存,便可以启动作业运行。在作业运行过程中,若要访问的分段不在内存中,则通过调段功能将其调入,同时还可以通过置换功能将暂时不用的分段置换到外存上,以便腾出内存空间。
2、段表结构
段号、段长与内存起始地址这三个信息是进行地址变换所必需的,其他字段含义与请求分页存储管理相同。
3、缺段中断与地址变换
当段在内存中时,地址变换过程与分段存储管理相同;当段不在内存中时,应先将该段调入内存,然后再进行地址变换。当被访问的段不在内存中,将产生一个缺段中断信号。操作系统处理该中断时,在内存中查找是否有足够大的分区存放该段。若没有这样的分区,则检查空闲分区容量总和,确定是否需要对分区进行拼接,或者调出一个或几个段后再装入所需段。
(四)页面置换算法
1、最佳置换(OPT)算法
在预知一个进程的页面引用串的情况下,每次都淘汰以后不再使用的或以后最迟再被使用的页面。
OPT是最优的,具有最低的缺页率。但由于实际操作中往往无法事先知道以后会引用到的所有页面的信息,因此最佳置换算法无法实现,只能作为一个标准来衡量其他置换算法的优劣。
2、先进先出(FIFO)算法
每次总是淘汰最先进入内存的页面,即淘汰在内存中停留时间最长的页面。该算法实现简单,但可能会产生Belady异常(缺页此时随着分配的物理块号的增加而增加)。由于FIFO忽略了一种现象,就是最早调入的页面往往是使用最频繁的页面,因此FIFO算法与进程实际运行规律不符,可能选择淘汰的页面是程序经常使用的页面,实际效果不好。
3、最近最少使用(LRU)算法
选择最近最长时间没有被使用的页面予以淘汰。常用的页面置换算法中,LRU算法最接近最佳置换算法。
4、时钟置换(CLOCK)算法
时钟置换算法也称最近未使用(NRU)算法,是LRU和FIFO的折中。CLOCK算法给每个页面设置了一个访问位,用以标识该页最近有没有被访问过。CLOCK维护一个内存中所有页面的循环链表,当程序需要访问链表中存在的页面时,该页面的访问位就被置为1;否则,若程序要访问的页面没有在链表中,那就需要淘汰一个内存中的页面,于是一个指针就从上次被淘汰页面的下一个位置开始顺序地去遍历这个循环链表,当这个指针指向的页面的访问位为1时,就把该访问位清零,指针再向下移动,当指针指向的页面的访问位为0时,就选择淘汰掉这一页面,若遍历一遍仍没有找到可以淘汰的页面,就继续遍历下去。
还有一种改进型CLOCK算法,它考虑了页面载入内存后是否被修改过的问题,增加了修改位。在访问位同为0的进程间优先淘汰没有修改过的页面,因为没有修改过的页面可以被直接淘汰,而修改过的页面还需要写回外存。与简单CLOCK相比,减少了磁盘I/O次数,但会增加扫描次数。
5、最不常用置换(LFU)算法
选择到当前时间为止访问次数最少的页面淘汰。该算法要求为每一页设置一个访问计数器,每当页面被访问时,该页的访问计数器加1。发生缺页中断时,淘汰计数值最小的页面,并将所有计数器清零。
6、页面缓冲(PBA)算法
PBA算法用FIFO算法选择被置换页,选择出的页面不是立即换出,而是放入两个链表之中。如果页面未被修改,就将其归入到空闲页面链表末尾,否则将其归入到已修改页面链表末尾。这些空闲页面和已修改页面会在内存中停留一段时间。如果这些页面再次被访问,只需要将其从相应的链表中移出,就可以返回给进程,从而减少了一个磁盘I/O。需要调入新的物理页时,将新页面都入到空闲页面链表的第一个页面中,然后将其从该链表中移出。当已修改页达到一定数目后,再将其一起写入磁盘,然后将它们归入空闲页面链表。这样能大大减少I/O操作次数。
(五)抖动现象与缺页率
1、Belady异常
FIFO算法的缺页率会随着分配的物理块号的增加而增加,这种现象就是Belady异常。产生的原因就是FIFO算法的置换特征与进程访问内存的动态特征相矛盾,即被置换的页面并不是进程不会访问的页面。
FIFO算法可能会出现Belady异常现象,但是LRU算法和最佳置换算法永远不会出现Belady异常现象,被归类为堆栈算法的页面置换算法也不可能出现Belady异常现象。
2、抖动现象
所谓抖动现象就是:刚被淘汰的页面过后不久又要访问,并且调入不久后又调出,如此反复,使得系统把大部分时间用在了页面的调入调出上,而几乎不能完成任何有效工作。产生 抖动现象的原因是在请求分页存储管理系统中的每个进程只能分配到所需全部内存空间的一部分。
3、缺页率
假定一个作业共有n页,系统分配给作业m页的空间(m<=n)。如果该作业在运行过程中共需要访问A次页面(即引用串长度为A),其中所要访问页面不在内存,需要将其所需页调入内存的次数为F,则缺页率定义为f=F/A,命中率即为1-f。
缺页率是衡量页面置换算法的重要指标,通常缺页率会受置换算法、分配的页面数量、页面大小等因素的影响。缺页率对于请求分页存储管理系统很重要,如果缺页率过高,会直接导致读取页面的平均时间增加,会使进程执行速度显著降低。
二、内存管理方式之间的比较
表 3种离散分配方式的比较
对比及联系 内存管理方式 |
分页存储管理 |
分段存储管理 |
段页式存储管理 |
有无外部碎片 |
无 |
有 |
无 |
有无内部碎片 |
有 |
无 |
有 |
优点 |
内存利用率高,基本解决了内存零头问题 |
段拥有逻辑意义,便于共享、保护和动态链接 |
兼有两者优点 |
缺点 |
页缺乏逻辑意义,不能很好地满足用户 |
内存利用率不高,难以找到连续的空闲区放入整个段 |
多访问一次内存 |
表 几种内存管理方式之间的比较
比较的方面 |
单一连续分配 |
分区 |
分页 |
基本分段 |
基本段页式 |
||
固定分区 |
可变分区 |
基本分页 |
请求分页 |
||||
内存块的分配 |
连续 |
连续 |
离散 |
离散 |
离散 |
||
适用环境 |
单道 |
多道 |
多道 |
多道 |
多道 |
||
地址维数 |
一维 |
一维 |
一维 |
二维 |
二维 |
||
是否需要全部程序在内存 |
是 |
是 |
是 |
否 |
是 |
是 |
|
扩展内存 |
交换 |
交换 |
交换 |
虚拟存储器 |
交换 |
交换 |
|
内存分配单位 |
整个内存的用户可用区 |
分区 |
页 |
段 |
页 |
||
地址重定位 |
静态 |
静态 |
动态 |
静态 |
动态 |
静态 |
静态 |
重定位机构 |
装入程序 |
装入程序 |
重定位寄存器 |
页表 页表控制寄存器 加法器 |
段表 段表控制寄存器 加法器 |
段表 页表 段表控制寄存器 加法器 |
|
信息共享 |
不能 |
不能 |
可以,但限制多 |
可以 |
可以 |