4.2 虚拟内存

一、虚拟内存概述

1.1 什么是虚拟内存

​ 虚拟内存将内存抽象成一个巨大的,统一的数组,进而将用户看到的逻辑内存与物理内存分开,使用户程序产生已经被分配了连续内存的错觉。使得我们编程时不再受物理内存大小的限制。虚拟内存通过按需分配物理内存空间,所以内存中可以载入更多的程序,提高了并发度。

在这里插入图片描述

二、基于虚拟内存的换入换出

2.1 按需调页(换入)

2.1.1 定义

​ 按需调页就是先将进程保存在磁盘上,在需要的时候才将相应的页调入内存。

2.1.2 实现方法

​ 当进程访问页时,先检查进程内部页表,如果页表中的该页对应的位是“无效位“,那么就将会产生一个页错误(中断),然后操作系统负责找到一个空闲帧,再把磁盘上对应的页加载到这个空闲帧,最后重新开始因为陷阱而中断的指令。
在这里插入图片描述

2.1.3 性能分析

​ 因为按需调页在产生页错误后会访问磁盘,如果页错误率太高会导致性能下降,所以降低也错误率是实现虚拟内存的关键所在。

2.2 页面置换(换出)

2.2.1 引入

​ 在上面的换入过程中提到了操作系统查找一个空闲帧,但是如果内存已经被占满了,那么就必须找到一个帧作为牺牲帧,将牺牲帧写到磁盘,然后把该帧所占用的内存空闲出来,将新的页加载到这个帧里面。

​ 上述过程就是页面置换的思想,为了找到合适的牺牲帧,必须使用合适的页置换算法,否则会使系统的页错误率上升。

2.2.2 FIFO 算法

​ 开发算法的时候总是从最简单的思路入手,我们很容易想到的就是将最早被分配的页置换出去,但这种算法的性能一般也不太好,在页置换中,FIFO 会引起最高的页错误率(因为刚被换出的页在最近就可能被使用)。

在这里插入图片描述

​ 该算法在如图所示的情况下会引起 15 次页错误。

2.2.3 最优置换算法

​ 选取最远将使用的页淘汰,该算法法引发的页错误率是最低的。

在这里插入图片描述
​ 在同样的情况下,最优置换算法只发生了 9 次页错误。但是该算法是实现不了的,因为我们无法知道将来到底哪些页需要被使用。

2.2.4 LRU 页置换

​ 就如进程调度算法中的最短作业优先调度一样,我们无法知道将来哪个进程将使用最短的 CPU 区间,但是我们可以用最近的情况来预测将来的情况。在页置换算法中也可以使用同样的算法,如果一个页在最近一段时间内使用的次数最少,那么我们就可以大致地认为该页在将来也会最晚被使用,这就是 LRU(最近最少使用) 算法

在这里插入图片描述

​ 在同样的情况下,LRU 算法发生了 12 次页错误,依然优于 LRU 算法。

时钟方法实现:为每个页都维护一个时钟用来记录该页最后被使用的时间,在淘汰的时候就选择时钟最小的进行淘汰,寻找最小的时钟是需要进行搜索。

栈方法实现:使用具有头指针和尾指针的双向链表来实现,将最近最少使用的页放到栈顶,最近使用的页放到栈的底部,这样每当弹出一个元素时只需要改变指针即可,避免了搜索。

现实情况:如果没有足够的硬件支持,那么每次进行内存访问,都需要产生中断,陷入操作系统来更新时钟或者栈,这将会使内存引用慢至少 10 倍。所以这种方法基本是不使用的。

2.2.5 近似 LRU 页置换

​ 硬件很难提供实现 LRU 所需的功能,但是我们可以近似 LRU,操作系统为页表中的每一项都提供一个引用位,每当引用一个页时,相应页表的引用位就会被硬件修改。

​ 开始,操作系统将所有的引用位都清零。随着用户进程的执行,与引用页相关联的引用位被硬件置位(置位 1)。通过检查引用位就可以确定哪些页被使用过而哪些页未被使用过。在此基础上就可以开发算法:

1. 二次机会算法(Clock 算法)

​ 该算法基于 FIFO 算法。当要选择一个页时,如果其引用位是 0,则直接置换该页;如果引用位是 1,将其设置成 0,然后接着检查下一页,知道找到一个 0 止。

在这里插入图片描述

**存在的问题**:如果所有页的引用位都为 1,那么必须转一圈后将第一页淘汰,Clock 算法就退化成了 FIFO 算法。
2. 二次机会算法的改进

​ 按照 FIFO 的方式定时将一定个数的 1 清为 0.

在这里插入图片描述

3. 增强型的二次机会算法

​ 在二次机会算法中,我们选择一个页的时候,只考虑到了其最近是否被引用,而没有考虑到是否被修改。事实上,如果一个页没有被修改,那么则不用将其写到磁盘,这样可以减少一次 IO,所以我们可以增加一个位来表示其是否被修改,使用有序数对的方式来实现:

​ (0, 0):最近没被使用,且没被修改——用于置换的最佳页

​ (0, 1):最近没有使用但修改过

​ (1, 0):最近使用过但没修改

​ (1, 1):最近使用过且修改过

三、颠簸

​ 因为我们的置换算法一般是局部置换的,这样可以不影响其他进程,所以给每个进程分配多少帧成了问题,我们可以使用平均分配,或者按照进程的优先级进行分配。

​ 但是如果给一个进程分配了过多的帧,会浪费资源,如果分配的过少,就会产生颠簸

​ 颠簸:系统内的进程增多 => 每个进程的缺页率增大 => 缺页率增大到一定程度,进程总是等待调页完成 => CPU 利用率降低 => 进程进一步增多,缺页率更大…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值