操作系统 - 第 5 章 虚拟存储器

5.0 虚拟存储器

      虚拟存储器作为现代操作系统中存储器管理的一项重要技术,实现了内存扩充功能

      虚拟存储器实现内存扩充,不是真正地扩大物理内存容量而是从逻辑上扩充了内存容量让用户感觉可用的内存容量比真实内存容量大得多

      逻辑上扩大内存,从而支持运行更大的程序支持并发运行更多的用户程序

      虚拟存储器扩充逻辑内存,满足了用户的需要,同时改善了系统性能

5.1 虚拟存储器概述

    第四章所介绍的各种存储器管理方式有一个共同的特点,就是都要求将一个作业全部装入内存后才能运行;于是,出现了下面这两种情况:

    (i). 有的作业很大,程序所需的内存空间超过了实际的物理内存总容量,作业不能全部被装入内存,导致该作业无法运行

    (ii). 有大量作业要求运行,但由于内存容量不足以容纳所有作业,只能将少数作业装入内存先运行,而将其他大量作业留在外存等待

    出现上述两种情况,都是因为内存容量不够大一个明显的解决办法是从物理上增加内存容量,但这样往往收到机器自身的限制,而且无疑会增加系统成本,因此这种方法受到一定限制;另一种方法是从逻辑上扩充内存容量,这正是虚拟存储技术索要解决的主要问题

5.1.1 常规存储管理方式的特征和局部性原理
1. 常规存储器管理方式的特征

    前一章中所介绍的各种存储器管理方式,统称为 "传统存储器管理方式" ,这些方式全都具有如下 2 个共同的特征

    (i). 一次性是指作业必须一次性地全部装入内存后才能开始运行

         在传统存储器管理方式中,无一例外地要求先将作业全部装入内存后才能运行;正是这一特征导致了大作业无法在小内存中运行,以及无法进一步提高系统的多道程序度,直接限制了处理机利用率的提高和系统吞吐量的提高;事实上,许多作业在运行时,并非需要用到全部程序和数据如果一次性地装入全部程序和数据,显然也是对内存空间的一种浪费

    (ii). 驻留性是指作业被装入内存后,整个作业都一直驻留在内存中,其中任何部分都不会被换出,直至作业运行结束

         尽管运行中的进程会因 I/O 等原因而被阻塞,可能处于长期等待状态,或者有的程序模块在运行过一次后就不再需要(运行)了,但它们都仍将驻留在内存中,继续占用宝贵的内存资源

    (iii). 由此可见,上述的一次性以及驻留性特征,使得许多在程序运行中不用或暂时不用的程序(数据)占用了大量的内存空间,而一些需要运行的作业又无法装入内存运行;显然,这是在浪费宝贵的内存资源;现在的问题是:一次性以及驻留性特征是否是程序在运行时所必需的和不可改变的

2. 局部性原理

    程序运行时的局部性现象:程序在执行时呈现出局部性规律即在一个较短的时间内,程序的执行仅局限于某个部分,相应地,程序所访问的存储空间也局限于某个区域;为此提出以下几点:

    (1). 程序执行时,除了少部分的转移和过程调用指令外,在大多数情况下是顺序执行的

    (2). 过程调用将会使程序的执行轨迹从一部分区域转移至另一部分区域;即程序在一段时间内都局限在这些过程的范围内运行

    (3). 程序中存在许多循环结构,这些结构最燃只由少数指令构成,但是它们将被多次执行

    (4). 程序中还包括许多对数据结构的处理,如对数组进行操作,这些处理往往都局限于很小的范围内

    局限性又表现在下面两个方面:

    (i). 时间局限性如果程序中的某条指令被执行,则不久以后该指令可能再次执行如果某数据被访问过,则不久以后该数据可能再次被访问

    产生时间局限性的典型原因:在程序中存在着大量的循环操作

    (ii). 空间局限性一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问即程序在一段时间内所访问的地址可能集中在一定的范围之内

    产生空间局限性的典型原因:程序是顺序执行的

3. 虚拟存储器的基本工作情况

    基于局部性原理可知:

    (i). 应用程序在运行之前没有必要将全部的程序和数据装入内存,而仅需将那些当前要运行的少数页面或段,先装入内存便可运行,其余部分暂留在外存上

    (ii). 程序在运行时,如果所要访问的页(段)已调入内存,便可继续执行下去

    (iii). 程序在运行时,如果所要访问的页(段)尚未调入内存( 称为 "缺页" 或 "缺段" ),便发出缺页(段)中断请求此时 OS 将利用 "请求调页(段)功能" 将所需的页(段),从外存调入内存,以便进程能继续执行下去

    (iv). 如果此时内存已满,无法再装入新的页(段)OS 还会利用 " 页(段)置换功能 " ,将内存中暂时不用的页(段)调出到外存上,腾出足够的内存空间,再将要访问的页(段)从外存调入内存中,以便进程继续执行

    这样,便可使一个大的用户程序在较小的内存空间中运行,也可在内存中同时装入更多的进程且并发执行

5.1.2 虚拟存储器的定义和特征
1. 虚拟存储器的定义

    当用户看到自己的程序能在系统中正常运行时,用户会认为,该系统所具有的内存容量一定比自己的程序大,或者说,用户所感觉到的内存容量会比实际内存容量大得多

    但用户所看到的大容量只是一种错觉,是虚的,人们把这样的存储器称为 "虚拟存储器"

    所谓虚拟存储器,是指具有请求调入功能和置换功能,可以从逻辑上对内存容量进行扩充的一种存储器系统虚拟存储器系统的逻辑容量由内存容量和外存容量之和决定特点是运行速度接近于内存,而每一位的成本接近于外存

    调入功能 :当进程需要运行的页或段不在内存中时,OS 把该页或段从外存调入内存

    置换功能 :当执行调入功能时,若内存已满,OS 会先将内存中暂时不用的页或段调至外存,然后再将当前进程需要运行的页或段调入内存

    可见,虚拟存储技术是一种性能非常优越的存储器管理技术,故被广泛地应用于 大 、中 、小型机器和微型机中

2. 虚拟存储器的特征

    与传统的存储器管理方式比较,虚拟存储器具有以下三个重要特征

    (i).  多次性多次性是相对于传统存储器管理方式的一次性而言的,是指一个作业中的程序和数据无须在作业运行时一次性地全部装入内存,而是允许作业被分成多次调入内存运行

          即,只需将当前要运行的那部分程序和数据装入内存即可开始运行;以后每当要运行到尚未调入内存的那部分程序时,再将那部分程序从外存调入内存

        小结:正是由于虚拟存储器的多次性特征,才使虚拟存储器具有从逻辑上扩大内存的功能

        多次性是虚拟存储器最重要的特征,是任何其他的存储管理方式所不具有的;因此,可以认为虚拟存储器是具有多次性特征的存储器管理系统

    (ii). 对换性对换性是相对于传统存储器管理方式的驻留性而言的,是指一个作业中的程序和数据,无须在作业运行时一直驻留在内存中,而是允许在作业的运行过程中,程序和数据进行换进换出

         (a). 在进程运行期间,允许将那些暂不使用的代码和数据,从内存调至外存的对换区(换出),待以后需要时再将那些代码和数据,从外存调至内存(换进);(b). 甚至还允许将暂时不运行的进程调至外存,待那些进程重新具备运行条件时再调入内存

        换进和换出能有效地提高内存利用率;虚拟存储器的对换性特征,使得虚拟存储器得以正常运行

    (iii). 虚拟性虚拟性是指能够从逻辑上扩充内存容量使用户所看到的内存容量远大于实际内存容量;这样,就可以在小内存空间中运行大的作业或者能提高多道程序度

        虚拟性不仅能有效提高内存利用率,同时也提高程序执行的并发程度,从而增加了系统吞吐量;这是虚拟存储器所表现出来的最重要的特征,也是实现虚拟存储器的最重要的目标;正是由于虚拟存储器的虚拟性特征,才使得虚拟存储器成为 大 、中 、小及微机上应用最广泛的存储器管理方式

    (iv). 小结:虚拟性是以多次性和对换性为基础的,或者说,仅当系统允许将作业分成多次调入内存,并能将内存中暂时不运行的程序和数据换出至外存上时,才有可能实现虚拟存储器;多次性和对换性必须建立在离散分配的基础上

5.1.3 虚拟存储器的实现方法

    在虚拟存储器中,允许将一个作业分多次调入内存;如果采用连续分配方式时,要求必须将作业装入一个连续的内存区域中,则必须事先为作业一次性地申请一个足以容纳整个作业的内存空间,以便能将作业分先后地多次装入内存 。这不仅会使相当一部分内存空间处于暂时或 "永久" 的空闲状态,造成内存资源的严重浪费,而且无法 、也无意义再从逻辑上扩大内存容量 。所以,虚拟存储器的实现,都毫无例外地建立在离散分配存储管理方式的基础上;目前,所有的虚拟存储器都是采用下面的方式中的一种来实现的 。

1. 分页请求系统

    分页请求系统是在分页系统的基础上增加了 "请求调页功能" 和 "页面置换功能" 所形成的页式虚拟存储系统

    分页请求系统,允许用户程序只装入少数页面的程序(及数据)即可启动运行;以后,再通过调页功能及页面置换功能,陆续地把即将运行的页面调入内存同时把暂不运行的页面换出到外存上置换时以页面为单位

    为了实现请求调页和页面置换功能,系统必须提供必要的硬件支持实现请求分页的软件

(1). 硬件支持

主要的硬件支持有:

(i). 请求分页的页表机制:是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构

(ii). 缺页中断机构每当用户程序要访问的页面尚未调入内存时便产生一个缺页中断,请求 OS 将所缺的页面调入内存

(iii). 地址变换机构:同样是在纯分页地址变换机构的基础上发展形成的

(2). 实现请求分页的软件

这里包括有用于实现请求调页的软件实现页面置换的软件;这些软件在硬件的支持下,将程序正在运行时所需的页面(尚未在内存中)调入内存,再将内存中暂时不用的页面从内存换出到外存上

2. 请求分段系统

    请求分段系统是在分段系统的基础上,增加了 "请求调段功能" 以及 "分段置换功能" 所形成的段式虚拟存储系统

    该系统允许用户程序只装入少数段(不是所有的段)的程序和数据,即可启动运行;以后,通过调段功能和段的置换功能,将暂时不运行的段从内存换出到外存,在把即将运行的段从外存调入到内存中

    置换是以段为单位进行的

    为了实现请求分段,系统同样需要必要的硬件支持和软件支持:

(1). 硬件支持

主要的硬件支持有:

(i). 请求分段的段表机制:是在纯分段的段表机制上增加若干项而形成的,作为请求分段的数据结构

(ii). 缺段中断机构:每当用户程序要访问的段尚未调入内存时,便产生一个缺段中断,请求 OS 将所缺的段从外存调入内存中

(iii). 地址变换机构:同样是在纯分段地址变换机构的基础上发展形成的

(2). 软件支持

    这里包括有用于实现请求调段的软件实现段置换的软件;这些软件在硬件的支持下,先将内存中暂时不用的段从内存置换到外存上,再将程序正在运行时所需的段(尚未在内存中的),从外存调入内存

    小结:虚拟存储器在实现上具有一定难度;相对于请求分段系统,因为请求分页系统换进和换出的基本单位都是固定大小的页面,所以在实现上要容易些;而请求分段系统换进换出的基本单位是段,段的长度是可变的,分段的分配类似于动态分区方式,在内存分配和回收的操作都比较复杂

    目前,不少虚拟存储器是已段页式系统为基础的,通过增加请求调页和页面置换功能形成了段页式虚拟存储器系统,而且把实现虚拟存储器必须支持的硬件集成在处理器芯片上

5.2 请求分页存储管理方式

    请求分页系统是以 "基本分页" 为基础的,为了能支持虚拟存储器功能,而增加了 "请求调页功能" 和 "页面置换功能"

    在请求分页系统中,每次换进和换出的基本单位是长度固定的页面;在请求分段系统中,每次换进和换出的基本单位是长度可变的段;所以,请求分页系统相比较请求分段系统,实现更简单

    请求分页是目前最常用的一种实现虚拟存储器的方式

5.2.1 请求分页中的硬件支持

    为了实现请求分页,系统必须提供一定的硬件支持;计算机系统除了要求一定容量的内存和外存,还需要具备 "请求页表机制" 、"缺页中断机构" 、"地址变换机构"

1. 请求页表机制

    在请求分页系统中,所需的主要数据结构是 "请求页表" ,其基本作用仍然是将用户地址空间中的逻辑地址映射为内存空间中的物理地址;为了满足页面换进换出需要,在请求页表中又增加了 4 个字段;这样,在请求分页系统中的每个页表都应包含以下各项:

(基本)分页存储基本分页存储系统中,页表中只有两个字段,即 页号和(物理)块号
请求分页存储在请求分页存储系统,页表中另外增加了 4 个字段

    请求分页中的页表中各字段说明如下:

    (1). 状态位(存在位)P

    由于在请求分页系统中,只将应用程序的一部分调入内存,还有一部分仍在外存磁盘上,所以要在页表项中增加一个存在位字段用于指示该页是否已调入内存,供程序访问时参考;由于该字段只有一位,故又称位字

    (2). 访问字段 A

    用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问供置换算法(程序)在选择换出页面时参考

    当进程所需的页面在外存上时,则需要 OS 将该页面从外存调入内存;假如此时内存已满,则需要通过置换算法将内存中长时间未被访问的页面换出到外存(此时就需要该访问字段 A,比较优先级,优先级最低的页面将被换出),再将该页面从外存调入内存

    (3). 修改位 M

    标识该页在调入内存后是否被修改过由于内存中的每一页都在外存上保留了一份副本,故在置换该页时,若未被修改,就不需将该页写回到外存上(内存中的页与外存上的副本内容一致,不需要再写回),从而减少系统的开销和启动磁盘的次数若已被修改,则必须将该页重新写到外存上,来保证外存上所保留的副本始终是最新的;总之就是,M 位供置换页面时参考

    (4). 外存地址

    用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考

2. 缺页中断机构

    缺页中断机构产生缺页中断

    在请求分页系统中,每当所要访问的页面不在内存中时,便产生一 "缺页中断" ,请求 OS 将所缺的页面调入内存;作为中断,缺页中断同样需要经历诸如保护 CPU 环境 、分析中断原因 、转入缺页中断处理程序进行处理,以及在中断处理完成后再恢复 CPU 环境等几个步骤;但缺页中断又是一种特殊的中断,与一般的中断相比有着明显的区别,主要表现在下面两个方面 :

    (1). 在指令执行期间产生和处理中断信号

    通常,CPU 是在一条指令执行完后才去检查是否有中断请求到达;若有,便去响应,否则,继续执行下一条指令;然而,缺页中断是在指令执行期间,若 CPU 发现所要访问的指令或数据不在内存时,便立即产生和处理缺页中断信号,以便能及时将所缺的页面调入内存

    (2). 一条指令在执行期间可能产生多次缺页中断

    如下图所示:在执行一条执行 "copy A to B" 时,可能会产生 6 次缺页中断,其中指令本身跨了两个页面,A 和 B 又分别各是一个数据块,也都跨了两个页面;基于这些特征,系统中的硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前,产生缺页中断的指令处继续执行

3. 地址变换机构

    请求分页系统中的地址变换机构,是在(基本)分页系统地址变换机构的基础上,为实现虚拟存储器,再增加了某些功能所形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等

    下图展示了请求分页系统中的地址变换过程

    在进行地址变换时,首先检索快表,试图从中找出索要访问的页;若找到,便修改页表项中的访问字段 A(供置换算法选择换出页面时参考);对于写指令,还须将修改位 M 置为 "1" ,表示该页在调入内存后已被修改;然后利用页表项中给出的物理块号和页内地址形成物理地址,则地址变换过程到此结束

    如果在快表中未能找到该页的页表项,则应到内存中去查找页表,再从找到的页表项中的状态位 P 来了解该页是否已调入内存;若该页已调入内存,这时应将该页的页表项写入快表;当快表已满时,则应先调出按某种算法所确定的页的页表项,然后再写入该页的页表项(到快表中);若该页尚未调入内存,这时应产生缺页中断,请求 OS 从外存上把该页调入内存

5.2.2 请求分页中的内存分配

    在为进程分配内存时,将涉及到三个问题 :第一,为保证进程能正常运行,必须确定所需要的最小物理块数;第二,在为每个进程分配物理块时,应采取什么样的分配策略即所分配的物理块是固定的还是可变的);第三,为不同进程所分配的物理块数,是采取平均分配算法,还是根据进程的大小按比例分配

1. 最小物理块数的确定

    一个明显的事实,随着为每个进程所分配的物理块的减少,将使进程在执行中的缺页率上升,从而会降低进程的执行速度;为使进程能有效地工作,应为(该进程)分配一定数目的物理块,但这并不是 "最小物理块数" 的概念

    "最小物理块数" 是指,能保证进程正常运行所需的最小(少)物理块数,当系统为进程分配的物理块数少于此值时,进程将无法运行

    至于进程应获得的最少物理块数,与计算机的硬件结构有关,取决于指令的格式 、功能和寻址方式

    对于某些简单的机器,若是单地址指令,且采用直接寻址方式,则所需的最少物理块数为二 ;一块是用于存放指令的页面,另一块是用于存放数据的页面

    如果该机器允许间接寻址,则至少要求有三个物理块

    对于某些功能较强的机器,其指令长度可能是两个或多于两个字节,因而其指令本身有可能跨两个页面,且源地址和目标地址所涉及的区域也都可能跨两个页面;正如前面所介绍的在缺页中断机构中要发生六次中断的情况一样,对于这种机器,至少要为每个进程分配六个物理块,来装入六个页面

2. 内存分配策略

    在请求分页系统中,可采取两种内存分配策略,即固定和可变分配策略;在进行置换时,也可采取两种策略,即全局置换和局部置换;于是可组合出以下三种适用的策略 :

    (1). 固定分配局部置换(Fixed Allocation,Local Replacement)

    所谓固定分配,是指为每个进程分配一组固定数目的物理块,在进程运行期间不再改变

    所谓局部置换,是指如果进程在运行时发生缺页,则只能从分配给该进程的 n 个页面中选出(进程自己的)一页换出,然后再调入(进程自己的 、需要运行的)一页,来保证分配给该进程的内存空间不变

    采用该策略时,为每个进程分配多少物理块是根据进程类型(交互型或批处理型等)或根据程序员 、程序管理员的建议来确定的

    实现这种策略的困难在于 :应为每个进程分配多少个物理块难以确定;若太少,会频繁地出现缺页中断,降低了系统的吞吐量;若太多,又必然使内存中驻留的进程数目减少,进而可能造成 CPU 空闲或其他资源空闲,而且在实现进程对换时,会花费更多的时间

    (2). 可变分配全局置换(Variable Allocation,Global Replacement)

    所谓可变分配,是指先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少

    所谓全局置换,是指如果进程在运行期间发生缺页,则将 OS 所保留的空闲物理块(一般组织为一个空闲物理块队列)中取出一块分配给该进程(内存增加);或者以所有进程的全部物理块(包括当前进程自己的物理块)为范围,选择一块换出,然后将所缺的页面调入;如此,分配给该进程的内存空间可能会随之增加(为什么是可能,假如被换出的是当前进程自己的一个长时间未被调用的页面,则当前进程占用的内存空间大小不变)

    可变分配全局置换可能是最易于实现的一种物理块分配和置换策略;采用这种策略时,凡是产生缺页(中断)的进程 pCur,都将获得新的物理块,仅当空闲物理块队列中的物理块用完时,OS 才能从内存中选择一页换出;被选择换出的页面可能是系统中任何一个进程 pOld 的页面,因此这个被选中的进程 pOld 所拥有的物理块将减少,从而导致进程 pOld 的缺页率提高

    (3). 可变分配局部置换(Variable Allocation,Local Replacement)

    该策略同样是基于进程的类型或根据程序员的要求,为每个进程分配一定数目的物理块;但当某进程发生缺页时,只允许从该进程在内存的(自己的)页面中选择一页换出,这样就不会影响其他进程的运行

    如果进程在运行期间频繁地发生缺页中断,则系统必须再为该进程分配若干附加的物理块,直至该进程的缺页率减少到合适的程度;反之,若一个进程在运行过程中的缺页率特别低,则此时可适当减少分配给该进程的物理块数目,但不应该引起该进程的缺页率的明显提高

3. 物理块分配算法

    在采用固定分配(进程运行期间占用的物理块数目不变)策略时,如何将系统中可供分配的所有物理块分配给各个进程,可采用以下几种算法 :

    (1). 平均分配算法

    (2). 按比例分配算法

    (3). 考虑优先权的分配算法

5.2.3 页面调入策略

1. 何时调入页面

2. 从何处调入页面

3. 页面调入过程

4. 缺页率

5.3 页面置换算法

    在进程运行过程中,如果所要访问的页面不在内存中,则需要把该页面调入内存;当内存中已经没有空闲空间时,为了保证当前进程能正常运行,系统必须从内存中调出一页程序或数据,送到磁盘的对换区中

    应将哪个页面调出,必须根据一定的算法来确定;通常,把选择换出页面的算法称为 "页面置换算法(Page-Replacement Algorithms)" ;置换算法的好坏直接影响到系统的性能

    不适当的算法可能会导致进程发生 "抖动(Thrashing)" ,所谓 "抖动" :即刚被换出的页面 F1马上又要被访问,需要将刚换出的页面 F1 重新调入内存,此时又需要再选出一页面 F2 调出,而 F2 刚被调出又马上被访问,需要将页面 F2 重新调入内存,如此频繁地更换页面,以致一个进程在运行中把大部分时间都花费在页面置换工作上;我们称该进程发生了 "抖动"

    一个好的页面置换算法应该具有较低的页面更换频率;从理论上讲,应将那些以后不再会访问的页面调出,或把那些在较长时间内不会再访问的页面调出;目前已有多种置换算法,这些置换都试图更接近于理论上的目标,下面介绍几种常用的置换算法

5.3.1 最佳置换算法和先进先出置换算法

    目前有许多页面置换算法,相较而言,下面将介绍的是两种比较极端的算法。

    最佳置换算法是一种理想化的算法,具有最好的性能,但实际上是无法实现的。通常使用最佳置换算法作为标准,来评价其他算法的优劣。

    先进先出置换算法是最直观的算法,由于与通常页面的使用规律不符,可能是性能最差的算法,故实际应用极少。

1. 最佳(Optimal)置换算法

    最佳置换算法,其选择的调出页面(策略),是淘汰那些再也不会被使用的,或是在最长(未来)时间内不再被访问的页面;采用最佳置换算法通常可以保证获得最低的缺页率;但是由于人们当下无法预知,一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不会被访问的,因而该算法是无法实现的。但可以利用该算法去评价其他算法,举例说明如下:

    假定系统为某进程分配了三个物理块,并考虑有以下的页面号被访问的顺序:

    7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

    进程运行时,先将 7,0,1 这三个页面装入内存;

    当进程要访问页面 2 时,将会产生缺页中断(发现内存中没有页面 2 ,需要将页面 2 调入内存);此时 OS 根据最佳置换算法,将页面 7 调出内存,这是因为页面 7 、0 、1 三个页面中,页面 7 再次被访问的时间点最靠后,调出页面 7 ,则下次访问页面 0 时,因页面 0 已在内存中 而不会引起缺页中断;

    当进程访问页面 3 时,又将调出页面 1 ,因为当前在内存中的三个页面 0,1,2 中,页面 1 再次被访问的时间点最靠后

    图 5-3 展示了采用最佳置换算法时的置换图,可以看出,采用最佳置换算法一共发生了 6 次页面置换

2. 先进先出(FIFO)页面置换算法

    FIFO 算法是最早出现的置换算法。

    策略:FIFO 算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面,予以调出。

    优点:FIFO 算法实现简单,只需把一个进程已调入内存的页面按先后次序链接成一个队列,并设置一个指针,称为替换指针,让该指针总是指向最老的页面;

    缺点:FIFO 算法与进程实际运行规律不适应,因为在进程运行中,有些页面经常会被访问,比如,包含全局变量 、常用函数 、main 函数等的页面,FIFO 算法不能保证这些页面不被调出

    示例:我们仍沿用上面的例子,但采用 FIFO 算法进行页面置换(图 5-4);当进程第一次访问页面 2 时,将把页面 7 调出,因为页面 7 是最先被调入内存的;在第一次访问页面 3 时,又把页面 0 调出,因为在内存中的三个页面 2,0,1 中,页面 0 驻留时间最长;由图 5-4 可以看出,利用 FIFO 算法时,进行了 12 次页面置换,比最佳置换算法正好多一倍

5.3.2 最近最久未使用和最少使用置换算法
1. LRU(Least Recently Used)置换算法的描述

    FIFO 置换算法的性能比较差,因为 FIFO 算法依据的是各个页面调入内存的先后,而页面调入内存的先后不能反映页面的使用频率。

    策略:最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况做出决策;由于无法预测各个页面未来的使用情况,只能利用 "最近的过去" 作为 "最近的将来" 的依据,因此,LRU 置换算法是调出最近最久未使用的页面

    实现:LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t ,当需要淘汰一个页面时,选择现有页面中 t 值最大的,即调出最近最久未使用的页面

    示例:利用 LRU 算法对上面的例子进行页面置换的结果如图 5-5 所示:当进程第一次对页面 2 进行访问时,调出页面 7 ;进程访问页面 3 时,调出页面 1 。从图中可以看出,前 5 个时间的图像与最佳置换算法相同,但这并非是必然的结果;因为最佳置换算法是从 "将来" 的观点出发的,是根据未来的各页的使用情况进行判断;而 LRU 算法则是根据 "最近" 出发,根据各页以前的使用情况来判断的,但页面过去和未来的使用频率,没有必然联系

2. LRU 置换算法的硬件支持

    LRU 置换算法虽然是一种比较好的算法,但要求系统有较多的支持硬件

3. 最少使用(Least Frequently Used,LFU)置换算法

    在采用 LFU 算法时,需要为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率;LRU 置换算法会调出最近一段时间内被访问最少的页面

    由于内存具有较高的访问速度,例如 100ns,在 1ms 时间内,可能对某页面连续访问成千上万次;因此,直接利用计数器来记录某页面被访问的次数是不现实的,只能采用较大的时间间隔来记录对内存中某页面的访问情况

    在 LFU 算法中,采用了移位寄存器方式;每次访问某页面时,便将该移位寄存器的最高位,置 1 ,再每隔一定时间(例如 100ms)右移一次;这样,在最近一段时间使用最少的页面将是 \sum R[i] 最小的页面;LFU 算法的页面访问图,与 LRU 算法的页面访问图完全相同;或者说,利用这样一套硬件,既可实现 LRU 算法,也可实现 LFU 算法

    缺点:LFU 算法并不能真正反映出页面的使用情况,因为在每一时间间隔内,只是用寄存器的一位来记录页的使用情况,因此,在该时间间隔内,对某页面访问一次和访问 1000 次是完全等效的

5.3.3 Clock 置换算法

    虽然 LRU 是一种比较好的算法,但由于 LRU 算法需要较多的硬件支持,使得该算法实现所需的成本较高,故在实际应用中,大多采用 LRU 的近似算法;Clock 算法就是用得较多的一种 LRU 近似算法

1. 简单的 Clock 置换算法

    当利用简单 Clock 算法时,只需要为每个页面设置一位访问位,再将内存中的所有页面都通过链接指针,链接成一个循环队列;

    当某个页面被访问时,其访问位被置为 1 ;改置换算法选择淘汰哪个页面时,只需检查页面的访问位,如果访问位是 0 ,就将该页面调出,如果访问位是 1 ,则将该访问位置为 0 ,暂不调出该页面;再按照 FIFO 算法检查下一个页面;当检查到队列中的最后一个页面时,若其访问位仍为 1 ,则再返回到队首去检查第一个页面

    图 5-8 展示了该算法的流程和示例;由于该算法是循环地检查各个页面的使用情况,故称为 Clock 算法;由于该算法只有一位访问位,只能用该访问位表示页面是否已经使用过,而置换时是将未使用过的页面调出,所以也把该算法称为最近未使用算法或 NRU(Not Recently Used)算法

    

2. 改进型 Clock 置换算法

    

5.3.4 页面缓冲算法(Page Buffering Algorithm,PBA)

1. 影响页面换进换出效率的若干因素

2. 页面缓冲算法 PBA

5.3.5 访问内存的有效时间
  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值