Virtual Memory¶
约 594 个字 预计阅读时间 2 分钟
Outline
背景:虚拟内存¶
请求调页¶
1. 基本概念¶
处理缺页错误的程序很简单:
- 检查这个程序的内部表,确定对内存的引用是有效的还是无效的;
- 如果内存引用无效,就会终止进程,如果内存引用有效但是尚未调入页面,现在就应该调入页面;
- 找到一个空闲桢(比如从空闲桢列表上找到一个);
- 调度一个外存操作,将所需页面读到刚刚分配的桢;
- 调度完成的时候,修改进程的内部表和页表,指示当前页面处在内存之中;
- 重新启动刚才被陷阱中断的指令,该进程现在可以访问所需要的页面。
纯请求调页/Pure Demanding Paging:只有在需要的时候才将页面调入内存。
写时复制¶
页面置换¶
1. 基本页面置换¶
为了实现请求调页,我们必须设计:
- 桢分配算法/Frame Allocation Algorithm:决定当多个进程在内存中的时候,为每个进程分配多少桢;
- 页面置换算法/Page Replacement Algorithm:当需要进行页面置换的时候,选择要置换的桢。
2. FIFO 页面置换¶
Belady 异常/Belady's Anomaly:在某些页面置换算法中,随着分配桢数量的增加,缺页错误率可能会增加。
3. 最佳页面置换¶
4. LRU 页面置换¶
LRU 策略通常用作页面置换算法,并被认为是不错的策略,问题主要在于如何实现,实现 LRU 页面置换算法可能需要大量的硬件辅助。
- 使用计数器:
- 使用栈:
5. 近似 LRU 页面置换¶
6. 基于计数的页面置换¶
7. 页面缓冲算法¶
桢分配¶
1. 最小桢数¶
2. 分配算法¶
3. 全局分配和局部分配¶
为各个进程分配桢的一个重要因素是页面置换,我们将页面置换算法分为两大类:
- 全局置换/Global Replacement:允许一个进程从所有桢的集合中选择一个置换桢,不管该桢是否已经分配给其他进程;
- 局部置换/Local Replacement:每个进程只能从自己的桢集合中选择一个置换桢。
全局置换算法示例