一、虚拟内存概述
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 利用率降低 => 进程进一步增多,缺页率更大…