1. 需求背景

对内存的需求越来越高,内存不够用

比如游戏:黑白——>彩色——>3D

理想中存储器:

  1. 容量大
  2. 速度快
  3. 价格便宜

现实中:

金字塔型

  1. 寄存器
  2. 高速缓存
  3. 内存
  4. 磁盘
  5. 磁带

从上到下,速度越来越慢,容量越来越大,价格越来越便宜

操作系统对存储空间的抽象:地址空间

1.1 解决办法

  1. 覆盖 (手动)
  2. 交换 (自动)
  3. 虚拟存储

2. 覆盖与交换

2.1 覆盖

目标:较小的内存中运行较大的程序

方法:

1. 必要部分,常驻内存
2. 可选部分,需要时装入内存
3. 不存在调用关系的,可以相互覆盖

1

每一层都选最大,190k优化成110k

2

甚至还可以优化成上图:)

2.2 交换

目标:增加正在运行或需要运行的程序的内存

方法:

1. 可将暂时不用的放到外存
2. 换入换出(基本单位,整个程序的内存空间)

面临得问题?

  1. 交换时机:何时交换?(只有内存不够时才换?)
  2. 交换区的大小:存放所有内存的拷贝
  3. 换入的重定位?放回原处吗?

比较

3

虚拟存储也是覆盖和交换的结合~

3. 局部性原理

物理内存 + 磁盘 = 虚拟存储

4

第二条 ——> 置换算法

局部性原理定义:

程序在执行过程中的一段时间,执行的指令和地址和指令的操作数地址,分别局限某一区域。

  1. 空间局部性
  2. 时间局部性
  3. 分支局部性

4. 虚拟存储概念

思路:将不常用的内存暂存到外存中

原理:

  1. 装载程序时:
     只将当前指令执行需要的部分页面或段装入内存。
    
  2. 指令执行中需要的指令或数据不在内存(缺页或缺段)时:
     处理器通知操作系统将对应的页面或段调入内存。
    
  3. 将暂时不用的页面或段保存到外存。

5

物理和虚拟地址都不连续。

方式:

  1. 虚拟页式
  2. 虚拟段式

5. 虚拟页式存储

在页式存储的基础上,增加请求调页页面置换

思路:

  1. 在程序运行时,只装入部分页面
  2. 在运行中发现代码或数据不存在时,向系统发出缺页异常
  3. 处理缺页异常,将外存中的页面调入内存。使得进程能够继续运行。

6

缺页异常:

7

虚拟页式存储的页表项

8

页表项结构

9

10

6. 缺页异常

访问的该页不在物理内存当中,就会产生缺页异常。

缺页异常的处理流程

11

虚拟页式存储的外存选择

  1. 代码段(可执行二进制文件)
  2. 动态加载的共享段程序段:动态调用的库文件
  3. 其他段:交换空间

6.1 虚拟页式存储的性能

有效存储访问时间 effctive memory access time

EAT = 访问时间 (1 - p) + 缺页异常处理时间 缺页率 p

评论