跳转至

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:每个进程只能从自己的桢集合中选择一个置换桢。

全局置换算法示例

4. 非均匀内存访问

抖动

内存压缩

分配内核内存