虚拟内存管理(二)操作系统软件

操作系统软件

操作系统的内存管理设计取决于三个基本方面的选择

  • 是否使用虚拟内存技术
  • 使用分页还是分段,或者是二者的结合
  • 为各种存储管理特征采用的算法

前两者的选择取决于使用的硬件平台。早期的UNIX实现没有提供虚存,是因为该系统运行的处理器不支持分页或分段。

  • 除了一些老式的个人系统(MS-DOS)和特殊的系统外,所有重要的操作系统都提供了虚拟内存。
  • 纯粹的分段系统现在越来越少,当分段与分页结合后,操作系统面临的大多数内存管理问题都是关于分页方面的。

第三方面的选择则是属于操作系统软件领域的问题。因此,就需要考虑重要设计因素,而不论在何种情况下,对重要的都是与性能有关。

  • 由于页错误,带来的巨大的软件开销,所以希望使页错误发生的频率最小。这类开销至少包括决定替换哪个或哪些驻留页以及交换页所需要的I/O操作。
  • 此外,在I/O操作中,操作系统还必须调度另外一个进程运行,即导致一次进程切换。因此,希望通过合适的安排,使得在一个进程正在执行的时候,访问一个未命中的页的字的可能性最小。
  • 任何特定的策略的总性能取决于主存的大小、主存和辅存的相对速度、竞争资源的进程大小和数目以及单个程序的执行情况。

对于小系统,操作系统设计者可以试图基于当前的状态信息,选择一组看上去在大多数条件下都比较“好”的策略;而对于大系统而言,特别是大型机,操作系统应该配备监视和控制工具,允许操作系统管理员根据系统状态调整操作系统,以获得比较“好”的结果。

读取策略

读取策略确定一页何时取入内存

请求式分页

对于请求式分页:只有当访问到某页中的一个单元时才将该页取入内存。如果内存管理的其他策略比较合适,将发生下述情况当一个进程第一次启动时,会出现一阵大量的页错误。当越来越多的页被取入时,局部性原理表明大多数的页都是最近读取的页。因此,在一段时间后错误会平息下来,页错误的数目会降到很低。

预约式分页

对于预约式分页:读取的页并不是页错误请求的页。预约式分页利用了大多数辅存设备(如磁盘)的特性,这些设备有寻道时间和合理的延迟如果一个进程的页被连续存储在辅存中,则一次读取许多连续的页比隔一段时间读取一页更有效。当然如果大多数额外读取的页没有引用到,则这个策略是低效的。

放置策略

放置策略决定一个进程块驻留在实存中的什么地方。

在纯粹的分段系统中:放置策略并不是重要的设计问题。如最佳适配或首次适配都可供选择。

在纯粹的分页系统或分页和分段相结合的系统中:如何放置通常是没有关系的,这是因为地址转换硬件和主存访问硬件可以以相同的效率为任何页帧组合执行它们的功能。

还有一个关注放置问题的领域是非一致存储访问多处理器。在非一致存储访问多处理器中,机器中分布的共享内存可以被该机器的任何处理器访问。但是访问某一特定的物理单元所需要的时间随着处理器和内存模块之间的距离的不同而变化。因此,其性能很大程度上依赖于数据驻留的位置与使用和数据的处理器间的距离。对于NUMA系统,自动放置策略希望把页分配到能够提供最佳性能的内存。

替换策略

当主存中的所有帧都被占据,并且需要读取一个新页以满足一次页错误时,替换策略决定当前在主存的哪个页被替换。

  • 给每个活动分配多少页帧。
  • 考虑替换的页的集合是否局限在那些产生页错误或所有页帧都在主存中的进程。
  • 在考虑的页集中,选择换出那一页。

所有的策略目标都是移出最近不可能访问的页。由于局部性原理,最近访问的历史和最近将访问的模式间有很大的相关性因此,大多数策略都基于过去的行为来预测将来的行为

帧锁定

在分析各种算法前,需要注意的是关于一个替换策略的约束:主存中的某些帧可能是被锁定的。如果一个帧被锁定时,当前保存在帧中的页就不能被替换。大部分操作系统内核和重要的控制结构就保存在锁定的帧中,此外,I/O缓冲区和其他对时间要求严格的区域也可能锁定在主存的帧中。锁定是通过给每个帧关联一个lock位实现的,这一位可以包含在当前的帧表和页表中。

基本算法

在这里插入图片描述

  • 最佳(OPT)
  • 最近最少使用(LRU)
  • 先进先出(FIFO)
  • 时钟(Clock)
OPT策略

OPT策略选择替换下次访问距当前时间最长的那些页,该算法能导致最少的页错误,但这种算法是不可能实现的但可以用来衡量其他算法的性能

LRU策略

LRU策略替换主存中上次使用距当前最远的页根据局部性原理,这也是最近最不可能访问到的页实际上,LRU策略的性能接近于OPT策略。但是比较难以实现

  • 一种实现方法是给每一页添加一个最后一次访问的时间标签,并且必须在每次访问存储器时,不论是指令还是数据,都更新这个标签。即使有支持这种方案的硬件,但开销仍然非常大。
  • 另一种实现方法是维护一个关于访问页的栈,但开销同样很大。
FIFO策略

FIFO策略把分配给进程的页帧看作是一个循环缓冲区,按循环方式移动页。它所需要的只是一个指针,这个指针在该进程的页帧中循环。因此这是一种实现起来最简单的页替换策略

除了简单性之外,它隐含的逻辑:替换驻留在主存中时间最长的页:一个在很久以前取入主存的页,到现在可能已经不会再用到这个推理常常是错误的,因为经常会出现一部分程序或数据在整个程序的生命周期中使用频率都很高的情况,如果使用FIFO算法,则这些页会反复地需要被换入换出。

尽管LRU策略几乎和OPT策略一样好,但是它的实现比较困难,而且需要大量的开销。另一方面,FIFO策略实现简单,但性能相对较差。这些年来操作系统的设计者尝试了很多算法,试图以较小的开销接近LRU的性能,许多这类算法称为时钟策略的变体

Clock时钟策略

最简单的Clock时钟策略需要给每一帧关联一个附加位,称为使用位

当某一页被装入内存中时,该帧的使用位设置为1;当该页随后被访问到时(在访问产生页错误之后),它的使用位也被置为1。对于页替换算法,用于替换的候选帧集合(这个进程:局部范围;所有主存:全局范围)被看作是一个循环缓冲区,并且有一个指针与之相关联。当一页被替换时,该指针被指向缓冲区的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为0的一帧。每当遇到一个使用位为1的帧时,操作系统就将该位重新置为0;如果在这个过程开始时,缓冲区中所有帧的使用位均为0,则选择遇到的第一个帧被替换;如果所有帧的使用位都为1,则指针在缓冲区中完整地循环一周,把所有的使用位都变为0,并且停留在最初的位置上,替换该帧中的页。

可见该策略类似于FIFO,惟一不同的是,在时钟策略中使用位为1的帧被跳过。许多操作系统都使用类似于它的变体(比如 Multics分时操作系统)

举例
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值