虚拟存储器的基本概念
请求分页存储管理方式
页面置换算法
请求分段存储管理方式
虚拟存储器的基本概念
前面所介绍的各种存储器管理方式有一个共同的特点,即它们都要求将一个作业全部装入内存后方能运行,于是,出现了下面这样两种情况:
(1) 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行。
(2) 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业 装入内存让它们先运行,而将其它大量的作业留在外存上等待。
(1) 有的作业很大,其所要求的内存空间超过了内存总容量,作业不能全部被装入内存,致使该作业无法运行。
(2) 有大量作业要求运行,但由于内存容量不足以容纳所有这些作业,只能将少数作业 装入内存让它们先运行,而将其它大量的作业留在外存上等待。
虚拟存储器的引入
常规存储器管理方式的特征
(1) 一次性。在前面所介绍的几种存储管理方式中,都要求将作业全部装入内存后方能运行,即作业在运行前需一次性地全部装入内存,而正是这一特征导致了上述两种情况的发生。此外,还有许多作业在每次运行时,并非其全部程序和数据都要用到。如果一次性地装入其全部程序,也是一种对内存空间的浪费。
(2) 驻留性。作业装入内存后,便一直驻留在内存中,直至作业运行结束。尽管运行中的进程会因I/O而长期等待,或有的程序模块在运行过一次后就不再需要(运行)了,但它们都仍将继续占用宝贵的内存资源。
由此可以看出,上述的一次性及驻留性,使许多在程序运行中不用或暂不用的程序(数据)占据了大量的内存空间,使得一些需要运行的作业无法装入运行。现在要研究的问题是:一次性及驻留性在程序运行时是否是必需的。
由此可以看出,上述的一次性及驻留性,使许多在程序运行中不用或暂不用的程序(数据)占据了大量的内存空间,使得一些需要运行的作业无法装入运行。现在要研究的问题是:一次性及驻留性在程序运行时是否是必需的。
局部性原理
早在1968年,Denning.P就曾指出:程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分;相应地,它所访问的存储空间也局限于某个区域。他提出了下述几个论点:
(1) 程序执行时,除了少部分的转移和过程调用指令外,在大多数情况下仍是顺序执行的。该论点也在后来的许多学者对高级程序设计语言(如FORTRAN语言、PASCAL语言)及C语言规律的研究中被证实。
(2) 过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域,但经研究看出,过程调用的深度在大多数情况下都不超过5。这就是说,程序将会在一段时间内都局限在这些过程的范围内运行。
(3) 程序中存在许多循环结构,这些虽然只由少数指令构成,但是它们将多次执行。
(4) 程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。
(3) 程序中存在许多循环结构,这些虽然只由少数指令构成,但是它们将多次执行。
(4) 程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。
局限性还表现在下述两个方面:
(1) 时间局限性。如果程序中的某条指令一旦执行,则不久以后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。产生时间局限性的典型原因是由于在程序中存在着大量的循环操作。
(2) 空间局限性。一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行。
(1) 时间局限性。如果程序中的某条指令一旦执行,则不久以后该指令可能再次执行;如果某数据被访问过,则不久以后该数据可能再次被访问。产生时间局限性的典型原因是由于在程序中存在着大量的循环操作。
(2) 空间局限性。一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行。
虚拟存储器的定义
基于局部性原理,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。程序在运行时,如果它所要访问的页(段)已调入内存,便可继续执行下去;但如果程序所要访问的页(段)尚未调入内存(称为缺页或缺段),此时程序应利用OS所提供的请求调页(段)功能,将它们调入内存,以使进程能继续执行下去。如果此时内存已满,无法再装入新的页(段),则还须再利用页(段)的置换功能,将内存中暂时不用的页(段)调至盘上,腾出足够的内存空间后,再将要访问的页(段)调入内存,使程序继续执行下去。
虚拟存储器的实现方法
分页请求系统
这是在分页系统的基础上,
增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。它允许只装入少数页面的程序(及数据),便启动运行。以后,再通过调页功能及页面置换功能,陆续地把即将要运行的页面调入内存,同时把暂不运行的页面换出到外存上。置换时以页面为单位。为了能实现请求调页和置换功能,系统必须提供必要的硬件支持和相应的软件。
1)硬件支持
主要的硬件支持有:
① 请求分页的页表机制。它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构;
② 缺页中断机构。即每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,以请求OS将所缺的页调入内存;
③ 地址变换机构。它同样是在纯分页地址变换机构的基础上发展形成的。
① 请求分页的页表机制。它是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构;
② 缺页中断机构。即每当用户程序要访问的页面尚未调入内存时,便产生一缺页中断,以请求OS将所缺的页调入内存;
③ 地址变换机构。它同样是在纯分页地址变换机构的基础上发展形成的。
2)实现请求分页的软件
这里包括有用于实现请求调页的软件和实现页面置换的软件。它们在硬件的支持下,将程序正在运行时所需的页面(尚未在内存中的)调入内存,再将内存中暂时不用的页面从内存置换到磁盘上。请求分段系统
这是在分段系统的基础上,
增加了请求调段及分段置换功能后所形成的段式虚拟存储系统。它允许只装入少数段(而非所有的段)的用户程序和数据,即可启动运行。以后再通过调段功能和段的置换功能将暂不运行的段调出,同时调入即将运行的段。置换是以段为单位进行的。
为了实现请求分段,系统同样需要必要的硬件支持。一般需要下列支持:
(1) 请求分段的段表机制。这是在纯分段的段表机制基础上增加若干项而形成的。
(2) 缺段中断机构。每当用户程序所要访问的段尚未调入内存时,产生一个缺段中断,请求OS将所缺的段调入内存。
(3) 地址变换机构。
(1) 请求分段的段表机制。这是在纯分段的段表机制基础上增加若干项而形成的。
(2) 缺段中断机构。每当用户程序所要访问的段尚未调入内存时,产生一个缺段中断,请求OS将所缺的段调入内存。
(3) 地址变换机构。
虚拟存储器的特征
1.多次性
多次性是指一个作业被分成多次调入内存运行,亦即在作业运行时没有必要将其全部装入,只需将当前要运行的那部分程序和数据装入内存即可;以后每当要运行到尚未调入的那部分程序时,再将它调入。多次性是虚拟存储器最重要的特征,任何其它的存储管理方式都不具有这一特征。因此,我们也可以认为虚拟存储器是具有多次性特征的存储器系统。
2.对换性
对换性是指允许在作业的运行过程中进行换进、换出,亦即,在进程运行期间,允许将那些暂不使用的程序和数据,从内存调至外存的对换区(换出),待以后需要时再将它们从外存调至内存(换进);甚至还允许将暂时不运行的进程调至外存,待它们重又具备运行条件时再调入内存。换进和换出能有效地提高内存利用率。可见,虚拟存储器具有对换性特征。
3.虚拟性
虚拟性是指能够从逻辑上扩充内存容量,使用户所看到的内存容量远大于实际内存容量。这是虚拟存储器所表现出来的最重要的特征,也是实现虚拟存储器的最重要的目标。
值得说明的是,虚拟性是以多次性和对换性为基础的,或者说,仅当系统允许将作业分多次调入内存,并能将内存中暂时不运行的程序和数据换至盘上时,才有可能实现虚拟存储器;而多次性和对换性又必须建立在离散分配的基础上。
值得说明的是,虚拟性是以多次性和对换性为基础的,或者说,仅当系统允许将作业分多次调入内存,并能将内存中暂时不运行的程序和数据换至盘上时,才有可能实现虚拟存储器;而多次性和对换性又必须建立在离散分配的基础上。
请求分页存储管理方式
请求分页要解决的问题:
数据结构:进程页表中要表现该页
- 是否在内存?
- 是否允许读写?
- 内存没空是否将该页淘汰?
- 一旦淘汰是否写回外存?
- 该页的外存地址是什么?
解决上述问题,需在页表中增设以下项目:
![](https://img-my.csdn.net/uploads/201208/05/1344128800_5555.png)
硬件要有:发现缺页、发现越界、发现访问非法、做地址转换等功能,这些功能是在每条指令的译码过程中实现。
OS要有:缺页处理、非法访问处理、淘汰处理等例程。
请求分页中的硬件支持
1.页表机制
在请求分页系统中所需要的主要数据结构是页表。其基本作用仍然是将用户地址空间中的逻辑地址变换为内存空间中的物理地址。由于只将应用程序的一部分调入内存,还有一部分仍在盘上,故须在页表中再增加若干项,供程序(数据)在换进、换出时参考。在请求分页系统中的每个页表项如下所示:
![](https://img-my.csdn.net/uploads/201208/05/1344129322_6413.png)
现对其中各字段说明如下:
(1) 状态位P:用于指示该页是否已调入内存,供程序访问时参考。
(2) 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。
(1) 状态位P:用于指示该页是否已调入内存,供程序访问时参考。
(2) 访问字段A:用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。
(3) 修改位M:表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新副本。简言之,M位供置换页面时参考。
(4) 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
(4) 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。
2.缺页中断机构
在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺之页调入内存。缺页中断作为中断,它们同样需要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理、恢复CPU环境等几个步骤。但缺页中断又是一种特殊的中断,它与一般的中断相比,有着明显的区别,主要表现在下面两个方面:
(1) 在指令执行期间产生和处理中断信号。通常,CPU都是在一条指令执行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不在内存时所产生和处理的。
(1) 在指令执行期间产生和处理中断信号。通常,CPU都是在一条指令执行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不在内存时所产生和处理的。
(2) 一条指令在执行期间,可能产生多次缺页中断。在图4-24中示出了一个例子。如在执行一条指令COPY A TO B时,可能要产生6次缺页中断,其中指令本身跨了两个页面,A和B又分别各是一个数据块,也都跨了两个页面。基于这些特征,系统中的硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处继续执行。
![](https://img-my.csdn.net/uploads/201208/05/1344129730_2029.png)
3.地址变换机构
请求分页系统中的地址变换机构,是在分页系统地址变换机构的基础上,再为实现虚拟存储器而增加了某些功能而形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等。图4-25示出了请求分页系统中的地址变换过程。在进行地址变换时,首先去检索快表,试图从中找出所要访问的页。若找到,便修改页表项中的访问位。对于写指令,还须将修改位置成“1”,然后利用页表项中给出的物理块号和页内地址形成物理地址。地址变换过程到此结束。
![](https://img-my.csdn.net/uploads/201208/05/1344129835_4512.png)
如果在快表中未找到该页的页表项时,应到内存中去查找页表,再从找到的页表项中的状态位P,来了解该页是否已调入内存。若该页已调入内存,这时应将此页的页表项写入快表,当快表已满时,应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项;若该页尚未调入内存,这时应产生缺页中断,请求OS从外存把该页调入内存。
![](https://img-my.csdn.net/uploads/201208/05/1344130329_3410.png)
内存分配策略和分配算法
1.最小物理块数的确定
这里所说的最小物理块数,是指能保证进程正常运行所需的最小物理块数。当系统为进程分配的物理块数少于此值时,进程将无法运行。进程应获得的最少物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。对于某些简单的机器,若是单地址指令且采用直接寻址方式,则所需的最少物理块数为2。其中,一块是用于存放指令的页面,另一块则是用于存放数据的页面。
如果该机器允许间接寻址时,则至少要求有三个物理块。对于某些功能较强的机器,其指令长度可能是两个或多于两个字节,因而其指令本身有可能跨两个页面,且源地址和目标地址所涉及的区域也都可能跨两个页面。正如前面所介绍的在缺页中断机构中要发生6次中断的情况一样,对于这种机器,至少要为每个进程分配6个物理块,以装入6个页面。
2.物理块的分配策略
1) 固定分配局部置换(Fixed Allocation,Local Replacement)
这是指基于进程的类型(交互型或批处理型等),或根据程序员、程序管理员的建议,为每个进程分配一定数目的物理块,在整个运行期间都不再改变。采用该策略时,如果进程在运行中发现缺页,则只能从该进程在内存的n个页面中选出一个页换出,然后再调入一页,以保证分配给该进程的内存空间不变。实现这种策略的困难在于:应为每个进程分配多少个物理块难以确定。若太少,会频繁地出现缺页中断,降低了系统的吞吐量;若太多,又必然使内存中驻留的进程数目减少,进而可能造成CPU空闲或其它资源空闲的情况,而且在实现进程对换时,会花费更多的时间。2) 可变分配全局置换(Variable Allocation,Global Replacement)
这可能是最易于实现的一种物理块分配和置换策略,已用于若干个OS中。在采用这种策略时,先为系统中的每个进程分配一定数目的物理块,而OS自身也保持一个空闲物理块队列。当某进程发现缺页时,由系统从空闲物理块队列中取出一个物理块分配给该进程,并将欲调入的(缺)页装入其中。这样,凡产生缺页(中断)的进程,都将获得新的物理块。仅当空闲物理块队列中的物理块用完时,OS才能从内存中选择一页调出,该页可能是系统中任一进程的页,这样,自然又会使那个进程的物理块减少,进而使其缺页率增加。3) 可变分配局部置换(Variable Allocation,Local Replacement)
这同样是基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块,但当某进程发现缺页时,只允许从该进程在内存的页面中选出一页换出,这样就不会影响其它进程的运行。如果进程在运行中频繁地发生缺页中断,则系统须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到适当程度为止;反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数,但不应引起其缺页率的明显增加。3.物理块分配算法
1) 平均分配算法
这是将系统中所有可供分配的物理块平均分配给各个进程。例如,当系统中有100个物理块,有5个进程在运行时,每个进程可分得20个物理块。这种方式貌似公平,但实际上是不公平的,因为它未考虑到各进程本身的大小。如有一个进程其大小为200页,只分配给它20个块,这样,它必然会有很高的缺页率;而另一个进程只有10页,却有10个物理块闲置未用。2) 按比例分配算法
这是根据进程的大小按比例分配物理块的算法。如果系统中共有n个进程,每个进程的页面数为Si,则系统中各进程页面数的总和为:![](https://img-my.csdn.net/uploads/201208/05/1344131112_1111.png)
又假定系统中可用的物理块总数为m,则每个进程所能分到的物理块数为bi,将有:
![](https://img-my.csdn.net/uploads/201208/05/1344131178_8927.png)
b应该取整,它必须大于最小物理块数。
3) 考虑优先权的分配算法
在实际应用中,为了照顾到重要的、紧迫的作业能尽快地完成,应为它分配较多的内存空间。通常采取的方法是把内存中可供分配的所有物理块分成两部分:一部分按比例地分配给各进程;另一部分则根据各进程的优先权,适当地增加其相应份额后,分配给各进程。在有的系统中,如重要的实时控制系统,则可能是完全按优先权来为各进程分配其物理块的。调页策略
1.调入页面的时机
1)预调页策略
如果进程的许多页是存放在外存的一个连续区域中,则一次调入若干个相邻的页,会比一次调入一页更高效些。但如果调入的一批页面中的大多数都未被访问,则又是低效的。可采用一种以预测为基础的预调页策略,将那些预计在不久之后便会被访问的页面预先调入内存。如果预测较准确,那么,这种策略显然是很有吸引力的。但遗憾的是,目前预调页的成功率仅约50%。故这种策略主要用于进程的首次调入时,由程序员指出应该先调入哪些页。
2) 请求调页策略
当进程在运行中需要访问某部分程序和数据时,若发现其所在的页面不在内存,便立即提出请求,由OS将其所需页面调入内存。由请求调页策略所确定调入的页,是一定会被访问的,再加之请求调页策略比较易于实现,故在目前的虚拟存储器中大多采用此策略。但这种策略每次仅调入一页,故须花费较大的系统开销,增加了磁盘I/O的启动频率。2.确定从何处调入页面
在请求分页系统中的外存分为两部分:用于存放文件的文件区和用于存放对换页面的对换区。通常,由于对换区是采用连续分配方式,而文件区是采用离散分配方式,故对换区的磁盘I/O速度比文件区的高。这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况:(1) 系统拥有足够的对换区空间,这时可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件从文件区拷贝到对换区。
(2) 系统缺少足够的对换区空间,这时凡是不会被修改的文件都直接从文件区调入;而当换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时,便须调到对换区,以后需要时,再从对换区调入。
(3) UNIX方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。由于UNIX系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无须再从对换区调入。
(3) UNIX方式。由于与进程有关的文件都放在文件区,故凡是未运行过的页面,都应从文件区调入。而对于曾经运行过但又被换出的页面,由于是被放在对换区,因此在下次调入时,应从对换区调入。由于UNIX系统允许页面共享,因此,某进程所请求的页面有可能已被其它进程调入内存,此时也就无须再从对换区调入。
3.页面调入过程
每当程序所要访问的页面未在内存时,便向CPU发出一缺页中断,中断处理程序首先保留CPU环境,分析中断原因后转入缺页中断处理程序。该程序通过查找页表,得到该页在外存的物理块后,如果此时内存能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须先按照某种置换算法从内存中选出一页准备换出;如果该页未被修改过,可不必将该页写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。在缺页调入内存后,利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。页面置换算法
最佳置换算法和先进先出置换算法
1.最佳(Optimal)置换算法
最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。但由于人们目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。现举例说明如下。
假定系统为某进程分配了三个物理块,并考虑有以下的页面号引用串:
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
进程运行时,先将7,0,1三个页面装入内存。以后,当进程要访问页面2时,将会产生缺页中断。此时OS根据最佳置换算法,将选择页面7予以淘汰。这是因为页面0将作为第5个被访问的页面,页面1是第14个被访问的页面,而页面7则要在第18次页面访问时才需调入。下次访问页面0时,因它已在内存而不必产生缺页中断。当进程访问页面3时,又将引起页面1被淘汰;因为,它在现有的1,2,0三个页面中,将是以后最晚才被访问的。图4-26示出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了6次页面置换。
7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
进程运行时,先将7,0,1三个页面装入内存。以后,当进程要访问页面2时,将会产生缺页中断。此时OS根据最佳置换算法,将选择页面7予以淘汰。这是因为页面0将作为第5个被访问的页面,页面1是第14个被访问的页面,而页面7则要在第18次页面访问时才需调入。下次访问页面0时,因它已在内存而不必产生缺页中断。当进程访问页面3时,又将引起页面1被淘汰;因为,它在现有的1,2,0三个页面中,将是以后最晚才被访问的。图4-26示出了采用最佳置换算法时的置换图。由图可看出,采用最佳置换算法发生了6次页面置换。
![](https://img-my.csdn.net/uploads/201208/05/1344132381_6108.png)
2.先进先出(FIFO)页面置换算法
这是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。该算法实现简单,只需把一个进程已调入内存的页面,按先后次序链接成一个队列,并设置一个指针,称为替换指针,使它总是指向最老的页面。但该算法与进程实际运行的规律不相适应,因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO算法并不能保证这些页面不被淘汰。
这里,我们仍用上面的例子,但采用FIFO算法进行页面置换(图4-27)。当进程第一次访问页面2时,将把第7页换出,因为它是最先被调入内存的;在第一次访问页面3时,又将把第0页换出,因为它在现有的2,0,1 三个页面中是最老的页。由图4-27 可以看出,利用FIFO算法时进行了12次页面置换,比最佳置换算法正好多一倍。
![](https://img-my.csdn.net/uploads/201208/05/1344132497_7404.png)
最近最久未使用(LRU)置换算法
1.LRU(Least Recently Used)置换算法的描述
FIFO置换算法性能之所以较差,是因为它所依据的条件是各个页面调入内存的时间,而页面调入的先后并不能反映页面的使用情况。最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰。
利用LRU算法对上例进行页面置换的结果如图4-28 所示。当进程第一次对页面2进行访问时,由于页面7是最近最久未被访问的,故将它置换出去。当进程第一次对页面3进行访问时,第1页成为最近最久未使用的页,将它换出。由图可以看出,前5个时间的图像与最佳置换算法时的相同,但这并非是必然的结果。因为,最佳置换算法是从“向后看”的观点出发的,即它是依据以后各页的使用情况;而LRU算法则是“向前看”的,即根据各页以前的使用情况来判断,而页面过去和未来的走向之间并无必然的联系。
![](https://img-my.csdn.net/uploads/201208/05/1344132913_2357.png)
2.LRU置换算法的硬件支持
LRU置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件。为了了解一个进程在内存中的各个页面各有多少时间未被进程访问,以及如何快速地知道哪一页是最近最久未使用的页面,须有两类硬件之一的支持:寄存器或栈。1) 寄存器
为了记录某进程在内存中各页的使用情况,须为每个在内存中的页面配置一个移位寄存器,可表示为![](https://img-my.csdn.net/uploads/201208/05/1344133281_7180.png)
当进程访问某物理块时,要将相应寄存器的Rn-1位置成1。此时,定时信号将每隔一定时间(例如100 ms)将寄存器右移一位。如果我们把n位寄存器的数看做是一个整数,那么,具有最小数值的寄存器所对应的页面,就是最近最久未使用的页面。图4-29示出了某进程在内存中具有8个页面,为每个内存页面配置一个8位寄存器时的LRU访问情况。这里,把8个内存页面的序号分别定为1~8。由图可以看出,第3个内存页面的R值最小,当发生缺页时,首先将它置换出去。
![](https://img-my.csdn.net/uploads/201208/05/1344133474_4446.png)
2) 栈
可利用一个特殊的栈来保存当前使用的各个页面的页面号。每当进程访问某页面时,便将该页面的页面号从栈中移出,将它压入栈顶。因此,栈顶始终是最新被访问页面的编号,而栈底则是最近最久未使用页面的页面号。假定现有一进程所访问的页面的页面号序列为:4,7,0,7,1,0,1,2,1,2,6
随着进程的访问,栈中页面号的变化情况如图4-30所示。在访问页面6时发生了缺页,此时页面4是最近最久未被访问的页,应将它置换出去。
![](https://img-my.csdn.net/uploads/201208/05/1344134210_2871.png)
Clock置换算法
1.简单的Clock置换算法
当采用简单Clock算法时,只需为每页设置一位访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位被置1。置换算法在选择一页淘汰时,只需检查页的访问位。如果是0,就选择该页换出;若为1,则重新将它置0,暂不换出,而给该页第二次驻留内存的机会,再按照FIFO算法检查下一个页面。当检查到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首去检查第一个页面。图4-31示出了该算法的流程和示例。由于该算法是循环地检查各页面的使用情况,故称为Clock算法。但因该算法只有一位访问位,只能用它表示该页是否已经使用过,而置换时是将未使用过的页面换出去,故又把该算法称为最近未用算法NRU(Not Recently Used)。![](https://img-my.csdn.net/uploads/201208/05/1344134531_7348.png)
2.改进型Clock置换算法
在将一个页面换出时,如果该页已被修改过,便须将该页重新写回到磁盘上;但如果该页未被修改过,则不必将它拷回磁盘。在改进型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) 从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
(1) 从指针所指示的当前位置开始,扫描循环队列,寻找A=0且M=0的第一类页面,将所遇到的第一个页面作为所选中的淘汰页。在第一次扫描期间不改变访问位A。
(2) 如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找A=0且M=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。在第二轮扫描期间,将所有扫描过的页面的访问位都置0。
(3) 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。
该算法与简单Clock算法比较,可减少磁盘的I/O操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。
(3) 如果第二步也失败,亦即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。然后重复第一步,如果仍失败,必要时再重复第二步,此时就一定能找到被淘汰的页。
该算法与简单Clock算法比较,可减少磁盘的I/O操作次数。但为了找到一个可置换的页,可能须经过几轮扫描。换言之,实现该算法本身的开销将有所增加。
其它置换算法
1.最少使用(LFU:Least Frequently Used)置换算法
在采用最少使用置换算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在最近时期使用最少的页面作为淘汰页。由于存储器具有较高的访问速度,例如100 ns,在1 ms时间内可能对某页面连续访问成千上万次,因此,通常不能直接利用计数器来记录某页被访问的次数,而是采用移位寄存器方式。每次访问某页时,便将该移位寄存器的最高位置1,再每隔一定时间(例如100 ms)右移一次。这样,在最近一段时间使用最少的页面将是∑Ri最小的页。
LFU置换算法的页面访问图与LRU置换算法的访问图完全相同;或者说,利用这样一套硬件既可实现LRU算法,又可实现LFU算法。应该指出,LFU算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,访问一次和访问10 000次是等效的。
2.页面缓冲算法(PBA:Page Buffering Algorithm)
虽然LRU和Clock置换算法都比FIFO算法好,但它们都需要一定的硬件支持,并需付出较多的开销,而且,置换一个已修改的页比置换未修改页的开销要大。而页面缓冲算法(PBA)则既可改善分页系统的性能,又可采用一种较简单的置换策略。VAX/VMS操作系统便是使用页面缓冲算法。它采用了前述的可变分配和局部置换方式,置换算法采用的是FIFO。该算法规定将一个被淘汰的页放入两个链表中的一个,即如果页面未被修改,就将它直接放入空闲链表中;否则,便放入已修改页面的链表中。须注意的是,这时页面在内存中并不做物理上的移动,而只是将页表中的表项移到上述两个链表之一中。专题:Thrashing –抖动
进程的页面忙于换入换出,以至于系统处理缺页的时间大于执行进程的时间。
![](https://img-my.csdn.net/uploads/201208/05/1344135409_3467.png)
解决办法:
- 减少道数
- 每个进程的任何时刻内存空间不小于它的工作集
Denning 1968提出:对于每个进程每一时刻,为确保改进程能执行下去,在物理储存中必须有的最少页面数。
缺页率的相关因素
缺页率的相关因素
- 内存太小
- 程序道数多
- 淘汰算法不好
- 程序结构不好
请求分段存储管理方式
几种存储管理方案总结
![](https://img-my.csdn.net/uploads/201208/05/1344136233_4957.png)
![](https://img-my.csdn.net/uploads/201208/05/1344136247_6587.png)