1.页面换出
实际上上一节所说的页面换入过程实际上还缺少一个环节。因为物理内存是有限的,且相比于虚拟内存而言要小得多,我们不可能一直能换入页面,找到空闲的,没有映射过的虚拟页。所以更符合实际的做法是,如果找到了空闲的虚拟页框就直接建立映射,否则就需要从已有的映射中找到一页物理页,将其换出,腾出空闲页框供操作系统换入新的物理页。
2.基本页面换出算法
- 先进先出FIFO
先进先出的FIFO是最容易想到的,每次淘汰最先放入的那个物理页。但这当然不可能是足够高效的算法。
- 最优置换算法OPT
开天眼预知未来会放入的物理页,然后将未来最长时间不会放入的页换出。目前的人类科学还做不到。
- 最近最少使用算法 LRU
虽然无法开天眼,但我们至少能从最近使用的规律中进行预测,将最近最少使用的那个物理页换出去。LRU算法的实现可以参考我的这篇文章。
目前我们能够做到的最好的LRU算法可以做到换入和换出O(1)的时间复杂度。这在算法层面已经是我们能给出的最漂亮的算法了。但是这个实现在实际操作系统中其实不可行。因为每次进行一次LRU算法还是会造成几次的指针读写,也就是对内存的访问。说白了还是太复杂。如果采用LRU算法,整个计算机的工作效率就会降低很多。
- Clock算法
Clock算法是一种近似的LRU算法,这种算法足够简单,可以应用在实际的操作系统中。
具体算法内容请参考李治军《操作系统原理,实现与实践》P194页。
4. 系统颠簸
从进程自身角度而言,分配给进程的物理页个框数应该是越多越好的,但是物理内存的总容量是有限的,如果给每个进程分配的物理页框数量太多,系统能支持的并发进程数量就越少。但是如果给进程分配的页框个数过少,就会造成系统颠婆现象。
造成这种现象的原因是分配给进程的物理页框数量不够,无法覆盖当前进程的“局部”,导致换出去的页面有很快需要被访问从而又得换回来。频繁地发生缺页,频繁地需要换页。而此时CPU只能空闲等待,导致CPU工作效率下降。所以我们应当准确地估计当前的局部有多大,从而防止系统颠婆的情况发生。