【操作系统】虚拟内存以及页面置换算法
起因
为什么需要虚拟内存?
由于程序规模的增长速度远远大于存储器容量的增长速度。
更大、更快、更便宜的非易失性存储器。



覆盖技术
上世纪80年代末90年代初:

把不会同时执行的模块,共享同一块内存区域。

通过程序间的逻辑调用关系对程序在内存中进行分区。
调用关系不止一种,另外一种如下图所示:


交换技术
将暂时不运行的程序转移到外存中去。

换出(Swap Out):将进程的整个地址空间的内容保存到外存中。
换入(Swap in):将外存中的进程的地址空间中的内容读入到内存中。

只在内存不足的时候才做对应的换入换出。

虚存技术
目标


程序局部性原理

C语言中是按照行优先来放置二维数组。
基本概念

基本特征

由于换入换出机制,会将连续的逻辑内存变为不连续。
虚拟页式内存管理


请求调页:需要用到对应页的时候,才会发出请求。
页面置换:把需要的页换进来把不需要的页换出去。


32780对应第八行,驻留位为0,表示缺页,那么此时会触发缺页中断。

不同的存储形式

其他段:程序在运行过程中,可能会产生很多数据,并未对应到具体的文件,也就是动态产生的数据,会被映射到Swap文件。

为什么是1+q?
q表示的对内存页的写操作。并且需要将这个写操作一定换出到外存中,那么换出操作也会做一次写硬盘操作,当前的开销换入和换出的比例就是1+q。
对于EAT公式中,起决定作用的起始是p,如果p足够小,那么对应的开销起始就是10,也就是对应的访问时间。如果程序具有局部性的特点,那么产生的缺页就会很少,那么效率就会很高。
页面置换算法
功能目标
当缺页中断发生时,需要调入新的页面而内存已满时,选择内存当中的那个物理页面被置换。
目标:尽可能地减少页面的换入换出的次数。具体来说,把未来不再使用的或者短期内较少的页面换出。通常只能在局部性原理指导下依据过去的统计数据来进行预测。
页面锁定(frame lock):用户描述必须常驻内存的操作系统的关键部分或时间关键(time critical)的应用进程。常用的方法是:在页面中添加锁定标志位(lock bit)


最优页面置换算法


在替换e的,应该是离下一次访问最远的页。

所以最远的是d,故替换d。
先进先出算法
先进先出算法:淘汰内存中驻留最久的。

Belady现象:给的物理页帧越多,反而越容易出现缺页中断。

最近最久未使用算法(LRU)
Least Recently Used
原理:程序的时间和空间的局部性。



使用链表或者是使用栈来实现。

时钟页面置换算法

依据是页表中accessbit(Used bit)来看。

指针指向过的区域如果为1,那么会清为0,直到找到初始为0的。

贴近LRU效果,但比LRU算法略差。
二次机会法
将used bit 和 dirty bit 结合起来,来淘汰对应的页。

指针每指一次,那么对应的标志位被降级,降级的路径如黄色表中所示。

最不常用算法(LFU)
Least Frequently Used

把时间因素也考虑进去,可以一段时间后把频度给左移一位。相当于每隔一段时间除2。
belady现象
在采用FIFO现象时,有时会出现分配的物理页面数增加,缺页率反而提高的异常现象。


对比LRU算法

LRU算法满足栈算法特点,但是FIFO不满足栈算法特点。


工作集模型











上图中的window Size指的是缺页时刻,而不是工作集大小。
抖动问题


