虚拟存储概念
睡不醒的鲤鱼 2021-07-21 操作系统 uCore
# 一、虚拟存储的需求背景
# 1.1 存储层次结构
理想中,我们希望有容量更大、速度更快、价格更便宜的非易失性存储器。
但这几个条件是相互制约的,因此实际中,存储器的层次结构如下所示:
# 1.2 操作系统的存储抽象
由于内部存储介质的多样性,存储空间的管理就变得更加复杂了,如果让用户直接操作这些存储介质,那么程序的通用性不强,而且编程难度也很高。因此我们让操作系统在中间层抽象出单独的地址空间,将内部的映射关系隐藏掉,用户能看到的只有抽象出的地址空间,具体形式如下。
# 1.3 虚拟存储需求
计算机系统时常出现 内存空间不够用,具体解决办法有以下几种。
- 覆盖(overlay):应用程序 手动 把需要的指令和数据保存在内存中;
- 交换(swapping):操作系统 自动 把暂时不能执行的程序保存到外存中;
- 虚拟存储:在有限容量的内存中,以页为单位 自动 装入 更多更大 的程序。
# 二、覆盖与交换
# 2.1 覆盖技术介绍
目标
在较小的可用内存中运行较大的程序。
方法
依据程序逻辑结构,将程序划分为若干 功能相对独立 的模块,将不会同时执行的模块 共享同一块内存 区域。
- 必要部分(常用功能)的代码和数据常驻内存;
- 可选部分(不常用功能)放在其他程序模块中,只在需要用到时装入内存;
- 不存在调用关系的模块可相互覆盖,共用同一块内存区域。
# 2.2 覆盖技术的不足
增加编程困难
- 需程序员划分功能模块,并确定模块间的覆盖关系;
- 增加了编程的复杂度。
增加执行时间
- 从外存装入覆盖模块;
- 时间换空间。
# 2.3 交换技术介绍
目标
增加正在运行或需要运行的程序的内存。
实现方法
- 可将暂时不能运行的程序放到外存;
- 换入换出的基本单位:整个进程的地址空间;
- 换出(swap out):把一个进程的整个地址空间保存到外存;
- 换入(swap in):将外存中某进程的地址空间读入到内存。
# 2.4 交换技术面临的问题
交换时机:何时需要发生交换?
只当内存空间不够或有不够的可能时换出。
交换区大小
存放所有用户进程的所有内存映像的拷贝。
程序换入时的重定位:换出后再换入时要放在原处吗?
采用动态地址映射的方法。
# 2.5 覆盖与交换的比较
覆盖
- 只能发生在没有调用关系的模块间;
- 程序员须给出模块间的逻辑覆盖结构;
- 发生在运行 程序的内部模块间。
交换
- 以进程为单位;
- 不需要模块间的逻辑覆盖结构;
- 发生在内存进程间。
# 三、局部性原理
# 3.1 虚拟存储技术的目标
- 只把部分程序放到内存中,从而运行比物理内存大的程序:由操作系统自动完成,无需程序员的干涉;
- 实现进程在内存与外存之间的交换,从而获得更多的空闲内存空间:在内存和外存之间只交换进程的部分内容。
# 3.2 局部性原理的概念
程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。
时间局部性
一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内。
空间局部性
当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。
分支局部性
一条跳转指令的两次执行,很可能跳到相同的内存位置。
# 3.3 局部性原理的意义
从理论上来说,虚拟存储技术是能够实现的,而且可取得满意的效果。