301-读取策略,放置策略和置换策略

操作系统软件

操作系统的内存管理设计取决于三个基本方面的选择:
1、是否使用虚拟内存技术
2、使用分页还是分段,或者是二者的组合
3、为各种存储管理特征采用的算法
前面两个方面中的选择取决于使用的硬件平台
因此,早期的Unix实现中没有提供虚拟内存,是由于该系统运行的处理器不支持分页或分段。如果没有对地址转换和其他基本功能的硬件支持,则这些技术都是不能达到实用的。
对前面两个方面还有两个附加的说明:首先,除了一些老式个人计算机上的操作系统(如MS-DOS)和特殊的系统外,所有重要的操作系统都提供了虚拟内存。其次,纯粹的分段系统现在越来越少,当分段与分页结合起来后,操作系统所面临的大多数内存管理问题都是关于分页方面的。

与第三方面相关的选择是属于操作系统软件领域的问题
下表8.4列出了需要考虑的重要的设计因素。在各种情况下,最重要的都是与性能相关的问题:由于缺页中断带来巨大的软件开销,所以希望使缺页中断发生的频率最小。这类开销至少包括决定置换哪个或哪些驻留页以及交换这些页所需要的I/O操作。此外,在这个页I/O操作的过程中,操作系统还必须调度另一个进程运行,即导致一次进程切换。因此,希望能通过适当的安排,使得在一个进程正在执行时,访问一个未命中的页中的字的可能性最小。在下表8.4中给出的所有策略中,都不存在一种绝对的最佳策略。 在分页环境中的内存管理任务是极其复杂的。此外,任何特定策略的总性能取决于内存的大小、内存和外存的相对速度、竞争资源的进程大小和数目以及单个程序的执行情况。最后一个特性取决于应用程序的类型、所采用的程序设计语言和编译器、编写该程序的程序员的风格和用户的动态行为(交互式程序)。对于小系统,操作系统设计者可以试图基于当前的状态信息,选择一组看上去在大多数条件下都比较“好”的策略;而对于大系统,特别是大型机,操作系统应该配备监视和控制工具,允许系统管理员根据系统状态调整操作系统,以获得比较“好”的结果。
在这里插入图片描述

读取策略

读取策略确定一个页何时取入内存,常用的两种方法是请求分页和预先分页
对于请求分页,只有当访问到某页中的一个单元时才将该页取入内存。如果内存管理的其他策略比较合适,将发生下述情况:当一个进程第一次启动时,会在一段时间出现大量的缺页中断;当越来越多的页被取入后,局部性原理表明大多数将来访问的页都是最近读取的页。因此,在一段时间后错误会逐渐减少,缺页中断的数目会降到很低。
对于预先分页,读取的页并不是缺页中断请求的页。预先分页利用了大多数辅存设备(如磁盘)的特性,这些设备有寻道时间和合理的延迟。如果一个进程的页被连续存储在辅存中,则一次读取许多连续的页比隔一段时间读取一页要更有效。当然,如果大多数额外读取的页没有引用到,则这个策略是低效的。
当进程第一次启动时,可以采用预先分页策略,在这种情况下,程序员必须以某种方式指定需要的页;当发生缺页中断时也可以采用预先分页策略,由于这个过程对程序员是不可见的,因而它显得更可取一些。但是,预先分页的实用工具程序还没有建立[MAEK87]。
不要把预先分页和交换混淆。当一个进程被换出内存并且被置于挂起状态时,它的所有驻留页都被换出。当该进程被唤醒时,所有以前在内存中的页都被重新读回内存。

放置策略

放置策略决定一个进程块驻留在实存中的什么地方。在一个纯粹的分段系统中,放置策略并不是重要的设计问题。但对于纯粹的分页系统或段页式的系统,如何放置通常是没有关系的,这是因为地址转换硬件和内存访问硬件可以以相同的效率为任何页框组合执行它们的功能。
还有一个关注放置问题的领域是非一致性存储访问(NUMA)多处理器。在非一致存储访问多处理器中,机器中分布的共享内存可以被该机器的任何处理器访问,但是访问某一特定的物理单元所需要的时间随着处理器和内存模块之间距离的不同而变化。因此,其性能很大程度上依赖于数据驻留的位置与使用数据的处理器间的距离。对于NUMA系统,自动放置策略希望能把页分配到能够提供最佳性能的内存。

置换策略

用于处理在必须读取一个新页时,应该置换内存中的那一页,阐明这方面的主题有一定的困难:
1、给每个活动进程分配多少页框
2、计划置换页的集合是局限在那些产生缺页中断的进程,还是所有页框都在内存中的进程。
3、在计划置换的页集中,选择换出哪一个页。

前两个概念称做驻留集管理,术语“置换策略”用于专指第三个概念。我们先来讲述“置换策略”的内容。
置换策略在内存管理的各个领域都得到了广泛的研究。当内存中的所有页框都被占据,并且需要读取一个新页以处理一次缺页中断时,置换策略决定当前在内存中的哪个页将被置换。所有策略的目标都是移出最近最不可能访问的页。由于局部性原理,最近的访问历史和最近将要访问的模式间有很大的相关性。因此,大多数策略都基于过去的行为来预测将来的行为。必须折中考虑的是,置换策略设计得越精致、越复杂,实现它的软硬件开销就越大。
页框锁定
在分析各种算法前,需要注意的是关于置换策略的一个约束:内存中的某些页框可能是被锁定的。如果一个页框被锁定时,当前保存在该页框中的页就不能被置换。大部分操作系统内核和重要的控制结构就保存在锁定的页框中,此外,I/O缓冲区和其他对时间要求严格的区域也可能锁定在内存的页框中。锁定是通过给每个页框关联一个lock位实现的,这一位可以包含在页框表和当前的页表中。
基本算法
不论采用哪种驻留集管理策略,都有一些用于选择置换页的基本算法。在文献中可以查到的置换算法包括:最佳(OPT),最近最少使用(LRU),先进先出(FIFO),时钟。
OPT策略选择置换下次访问当前时间最长的那些页,可以看出该算法能导致最少的缺页中断[BELA66],但是由于它要求操作系统必须知道将来的事件。显然这是不可能实现的。但是它仍能作为一种标准来衡量其他算法的性能。
下图8.5给出了关于OPT策略的一个例子,该例子假设固定的为该进程分配3个页框(驻留集合大小固定)。进程的执行需要访问5个不同的页,运行该程序需要的页地址的顺序为:
2,3,2,1,5,2,4,5,3,2,5,2
这意味着访问的第一个页是2,第二个页是3,依次类推。当页框分配满了以后,OPT策略产生3次缺页中断。
LRU策略置换内存中上次使用距当前最远的页。根据局部性原理,这也是最近最不可能访问到的页。实际上,LRU策略的性能接近于OPT策略。该方法的问题在于比较难于实现。一种实现方法是给每一页添加一个最后一次访问的时间标签,并且必须在每次访问存储器时,都更新这个标签。即使有支持这种方案的硬件,开销仍然是非常大的。另一种可选择的方法是维护一个关于访问页的栈,但开销同样很大。
下图8.15给出了关于LRU行为的一个例子。它使用与前面OPT策略的例子相同的页地址顺序。在这个例子中会产生4次缺页中断。
在这里插入图片描述
FIFO策略把分配给进程的页框看做是一个循环缓冲区,按循环方式移动页。它所需要的只是一个指针,这个指针在该进程的页框中循环。因此这是一种实现起来最简单的页面置换策略。除了它的简单性,这种选择方法所隐含的逻辑是置换驻留在内存中时间最长的页:一个在很久以前取入内存的页,到现在可能已经不会再用到了。这个推断常常是错误的,因为经常会出现一部分程序或数据在整个程序的生命周期中使用频率都很高的情况,如果使用FIFO算法,则这些页会反复地需要被换入换出。
继续上图8.15中的例子,FIFO策略导致了6次缺页中断。注意到LRU识别出了页2和页5比其他页的访问频率高,而FIFO却没有。
尽管LRU策略几乎与OPT策略一样好,但是它的实现比较困难,而且需要大量的开销。另一方面,FIFO策略实现简单,但性能相对较差。这些年以来,操作系统的设计者尝试了很多其他的算法,试图以较小的开销接近LRU的性能。许多这类算法都是称为时钟策略的各种变体。
最简单的时钟策略需要给每一页框关联一个附加位,称为使用位
当一页首次装入内存中时,则将该页框的使用位置为1;当该页随后被访问到(在访问产生缺页中断之后),它的使用位也会被置为1。对于页面置换算法,用于置换的候选页框集合(当前进程:局部范围;整个内存:全部范围)被看做是一个循环缓冲区,并且有一个指针与之相关联。当一页被置换时,该指针被设置成指向缓冲区中的下一页框。当需要置换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一页框。每当遇到一个使用位为1的页框时,操作系统就将该位重新置为0;如果在这个进程开始时,缓冲区中所有页框的使用位均为0,则选择遇到的第一个页框置换;如果所有页框的使用位均为1,则指针在缓冲区中完整地循环一周,把所有使用位都置为0,并且停留在最初的位置上,置换该页框中的页。可见,该策略类似于FIFO,唯一不同的是,在时钟策略中使用位为1的页框被跳过。该策略之所以称为时钟策略,是因为可以把页框形象地想象成在一个环中。许多操作系统都采用这种简单时钟策略的某种变体(如Multics[CORB68])。
下图8.16给出了关于简单时钟策略的一个例子。一个由n个内存页框组织的循环缓冲区可用于页面置换。当页727进入时,在从缓冲区中选出一页进行置换之前,下一页框指针指向含有页45的页框2。现在开始执行时钟策略。由于页框2中页45的使用位等于1,因而该页不能被置换,相反,把该页的使用位重新置为0,指针继续前进。类似地,页框3中的页191也不能被置换,其使用位被置成0,指针继续前进。下一页框是页框4,它的使用位为0,因此,页566被页727置换,该页框的使用位被置为1,指针继续前进到页框5,完成页面置换过程。
在这里插入图片描述
上图8.15中说明了时钟策略的行为。星号表示相应的使用位等于1,箭头表示指针的当前位置。注意,时钟策略可以防止页框2和页框5被置换。
下图8.17给出了[BAER80]中的一个实验结果,该实验比较了前面讨论的4个算法;它假设分配给一个进程的页框数目是固定的,其结果基于在一个FORTRAN程序中执行0.25x10^6次访问,页大小为256个字。Baer分别在分配6、8 、10、12和14页框的情况下进行了实验。当分配的页框数目比较小时,4种策略的差别非常显著,FIFO比OPT几乎差了2倍。这里访问某一页的概率分布情况几乎是相同的,如图8.11b所示。为了更高效地执行,希望能既处于曲线拐角的右侧(保证小的缺页率),又能保证小的页框分配(处于曲线拐角的左侧)。这两个约束表明需要的操作模式应该是在曲线的拐角。
在这里插入图片描述
[FINK88]中报告了几乎完全一致的结果,表明几种方法最多相差两倍。Finkel从一个包含100页的虚拟空间选出10000个访问组成一个综合的页访问字符串,以此来仿真多个策略的效果。为了近似局部性原理的效果,规定访问一个特定的页的可能性满足指数分布。Finkel指出,有部分人因为数据仅相差了两倍,就得出设计复杂页面置换算法没有什么意义的结论。同时他还说明这个差别将对内存的需求(为避免降低操作系统性能)或操作系统性能(为避免扩大内存)产生重大的影响。
当使用可变分配和全局或局部置换范围时,也有关于时钟算法和其他算法的比较[CARR81,CARR84]。时钟算法的性能非常接近于LRU。
可以通过增加使用的位数目,可以使时钟算法更加有效(另一方面,如果将使用的位数减少至0,则时钟算法就退化为FIFO)。在所有支持分页的处理器中,内存中的每一页都有一个修改位与之关联,因此内存中的每一页框也与这些修改位相关联。修改位是必需的,如果一页被修改了,在它被写回辅存之前不会被置换出。可以按照下面的方式在时钟算法中利用这一位。如果一起考虑使用位和修改位,那么每一页框都处于以下4种情况之一:
1、最近未被访问,也未被修改(u=0;m=0)
2、最近被访问,但未被修改(u=1;m=0)
3、最近未被访问,但被修改(u=0;m=1)
4、最近被访问,被修改(u=1;m=1)

根据这个分类,时钟算法的执行如下:
1、从指针的当前位置开始,扫描页框缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个页框(u=0;m=0)用于置换。
2、如果第1步失败,则重新扫描,查找(u=0;m=1)的页框。选择第一个遇到的这样的页框用于置换。在这个扫描过程中,对每个跳过的页框,把它的使用位置成0。
3、如果第2步失败,指针将回到它的最初位置,并且集合中所有页框的使用位均为0。重复第1步,并且,如果有必要,重复第2步。这样将可以找到供置换的页框。
总之,页面置换算法在缓冲区的所有页中循环,查找自从被取入到现在从未被修改过且最近没有访问过的页。这样的页最适合置换,并且还有一个优点是,由于未被修改,它不需要被写回辅存。如果在第一次扫描过程中没有找到候选页,则算法再次在缓冲区中开始循环,查找最近未被访问过但被修改过的页。即使置换这样的页必须先写回,但由于局部性原理,它不会很快又需要用到。如果第二次扫描失败,则缓冲区中的所有页框都被标记为最近没有访问过,执行第三次扫描。
该策略用于较早版本的Macintosh虚拟内存方案中[GOLD89],如图8.18所示。该算法优于简单时钟算法之处在于置换时首选没有变化的页。由于修改过的页在被置换之前必须写回,因而这样会节省时间。
在这里插入图片描述
页缓冲

尽管LRU和时钟策略比FIFO更高级,但FIFO却没有像它们那样涉及复杂性和开销问题。此外,还有一个相关问题是,置换一个被修改过的页,其代价比置换没有被修改过的页要大,这是由于前者需要写回辅存。
一种可以提高分页的性能并且允许使用较简单的页面置换策略的方法是页缓冲。比较有代表性的是VAX VMS方法,它的页面置换算法是简单的FIFO。为了提高性能,被置换出的页不是被丢弃,而是被分配到以下两个表之一:如果未被修改,则分配到空闲页表,如果修改了,则分配到修改页表。注意,该页不是在内存中发生物理移动,而是该页对应的页表项被移动,并放置在空闲页表中或修改页表中。
空闲页表包含着页中可以读取的一系列页框。VMS试图在任何时刻保留一小部分空闲块。当需要读取一个页时,使用位于列表头部的页框,置换原本在那个位置的页。当一个未结修改的页被置换时,它仍然在内存中,并且它的页框被添加到空闲页表的尾部。与此类似,当一个被修改过的页被写出和置换时,它的页框也被添加到空闲页表的尾部。
这些操作的一个重要特征是被置换的页仍然保留在内存中。因此,如果进程访问该页,则它可以迅速返回该进程的驻留集合,并且代价很小。实际上,空闲页表和修改页充当着页的高速缓存的角色。修改页表还有另外一种很有用的功能:被修改的页以簇方式写回,而不是一次只写一个,这就大大减少了I/O操作的数目,从而减少了磁盘访问时间。
Mach操作系统实现了一种更简单的页缓冲[RASH88],它未区分修改页和未修改页。

置换策略和高速缓存大小

随着内存越来越大,应用的局部性特性逐渐降低。作为补偿,高速缓存的大小也相应地增加了。比较大的高速缓存,甚至是几兆字节的高速缓存,现在也属于合理的设计选择[BORG90]。对于大的高速缓存,虚拟内存页的置换对性能可能会有影响。如果选择置换的页框在高速缓存中,则该高速缓存块以及保存在块中的页都会失效。
对于使用某种形式页缓冲的系统,有可能通过为页面置换策略补充一个在页缓冲区中的页放置策略来提高高速缓存的性能。大多数操作系统通过从页缓冲区中选择一个任意的页框来放置页,并且通常使用FIFO原则。[KESS92]中的研究报告表明,一个细致的页放置策略比任意放置可以减少10%~20%的高速缓存失误。
有些放置算法,其具体内容基于高速缓存结构和策略细节,这些策略的本质是为减少映射到同一个高速缓存槽的页框的数目,按这种方式把连续的页取入内存。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值