1. 需求背景
对内存的需求越来越高,内存不够用
比如游戏:黑白——>彩色——>3D
理想中存储器:
- 容量大
- 速度快
- 价格便宜
现实中:
金字塔型
- 寄存器
- 高速缓存
- 内存
- 磁盘
- 磁带
从上到下,速度越来越慢,容量越来越大,价格越来越便宜
操作系统对存储空间的抽象:地址空间
1.1 解决办法
- 覆盖 (手动)
- 交换 (自动)
- 虚拟存储
2. 覆盖与交换
2.1 覆盖
目标:较小的内存中运行较大的程序
方法:
1. 必要部分,常驻内存
2. 可选部分,需要时装入内存
3. 不存在调用关系的,可以相互覆盖
每一层都选最大,190k优化成110k
甚至还可以优化成上图:)
2.2 交换
目标:增加正在运行或需要运行的程序的内存
方法:
1. 可将暂时不用的放到外存
2. 换入换出(基本单位,整个程序的内存空间)
面临得问题?
- 交换时机:何时交换?(只有内存不够时才换?)
- 交换区的大小:存放所有内存的拷贝
- 换入的重定位?放回原处吗?
比较
虚拟存储也是覆盖和交换的结合~
3. 局部性原理
物理内存 + 磁盘 = 虚拟存储
第二条 ——> 置换算法
局部性原理定义:
程序在执行过程中的一段时间,执行的指令和地址和指令的操作数地址,分别局限某一区域。
- 空间局部性
- 时间局部性
- 分支局部性
4. 虚拟存储概念
思路:将不常用的内存暂存到外存中
原理:
- 装载程序时:
只将当前指令执行需要的部分页面或段装入内存。
- 指令执行中需要的指令或数据不在内存(缺页或缺段)时:
处理器通知操作系统将对应的页面或段调入内存。
- 将暂时不用的页面或段保存到外存。
物理和虚拟地址都不连续。
方式:
- 虚拟页式
- 虚拟段式
5. 虚拟页式存储
在页式存储的基础上,增加请求调页和页面置换
思路:
- 在程序运行时,只装入部分页面
- 在运行中发现代码或数据不存在时,向系统发出缺页异常
- 处理缺页异常,将外存中的页面调入内存。使得进程能够继续运行。
缺页异常:
虚拟页式存储的页表项
页表项结构
6. 缺页异常
访问的该页不在物理内存当中,就会产生缺页异常。
缺页异常的处理流程
虚拟页式存储的外存选择
- 代码段(可执行二进制文件)
- 动态加载的共享段程序段:动态调用的库文件
- 其他段:交换空间
6.1 虚拟页式存储的性能
有效存储访问时间 effctive memory access time
EAT = 访问时间 (1 - p) + 缺页异常处理时间 缺页率 p