OS Summary 7 - 虚拟内存
背景
虚拟内存是非连续内存分配的一个延续,非连续内存分配在存储空间内可以连续也可以不连续。虚拟内存是在非连续内存分配基础上,可以把一部分内容放到外存中去,让应用程序有更大的空间使用。
需求背景:增长迅速的存储需求,程序规模的增长速度远远大于存储器容量的增长速度。
解决办法
覆盖 ( overlay )
应用程序手动把需要的指令和数据保存在内存中
交换 ( swapping )
操作系统自动把暂时不能执行的程序保存到外存中
虚拟存储
在有限容量的内存中,以页为单位自动装入更多更大的程序
覆盖技术
目标 :在较小的可用内存中运行较大的程序
方法 :依据程序逻辑结构,将程序划分为若干功能相对独立的模块,将不会同时执行的模块共享同一块内存区域
- 必要部分(常用功能)的代码和数据常驻内存
- 可选部分(不常用功能)放在其他程序模块中,只在需要用到时装入内存
- 不存在调用关系的模块可相互覆盖,共用同一块内存区域
注:不存在相互调用关系可以分成一个覆盖区
不足 :
- 增加编程困难
- 需程序员划分功能模块,并确定模块间的覆盖关系
- 增加了编程的复杂度
- 增加执行时间
- 从外存装入覆盖模块
- 时间换空间
交换技术
目标:增加正在运行或需要运行的程序的内存
实现方法:
- 可将暂时不能运行的程序放到外存
- 换入换出的基本单位是整个进程的地址空间
- 换出(swap out):把一个进程的整个地址空间保存到外存;
- 换入(swap in):将外存中某进程的地址空间读入到内存;
交换技术面临的问题
交换时机
只当内存空间不够或有不够的可能时换出
交换区大小
存放所有用户进程的所有内存映像的拷贝
程序换入时的重定位
采用动态地址映射的方法
覆盖和交换的对比
- 覆盖
- 只能发生在没有调用关系的模块间
- 程序员须给出模块间的逻辑覆盖结构
- 发生在运行程序的内部模块间
- 交换
- 以进程为单位
- 以进程为单位
- 发生在内存进程间
虚拟内存技术目标
只把部分程序放到内存中,从而运行比物理内存大的程序
由操作系统自动完成,无需程序员的干涉
实现进程在内存与外存之间的交换,从而获得更多的空闲内存空间
在内存和外存之间只交换进程的部分内容
局部性原理
程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域
时间局部性
一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内
空间局部性
当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内
分支局部性
一条跳转指令的两次执行,很可能跳到相同的内存位置
局部性原理的意义
从理论上来说,虚拟存储技术是能够实现的,而且可取得满意的效果
虚拟存储概念
将不常用的部分内存块暂存到外存
原理
- 装载程序时只将当前指令执行需要的部分页面或段装入内存
- 指令执行中需要的指令或数据不在内存(称为缺页或缺段)时,处理器通知操作系统将相应的页面或段调入内存
- 操作系统将内存中暂时不用的页面或段保存到外存
实现方式
- 虚拟页式存储
- 在页式存储管理的基础上,增加请求调页和页面置换
- 当用户程序要装载到内存运行时,只装入部分页面,就启动程序运行
- 进程在运行中发现有需要的代码或数据不在内存时,则向系统发出缺页异常请求
- 操作系统在处理缺页异常时,将外存中相应的页面调入内存,使得进程能继续运行
- 虚拟段式存储
缺页异常
- 在内存中有空闲物理页面时,分配一物理页帧 f,转第 5 步
- 依据页面置换算法选择将被替换的物理页帧 f,对应逻辑页 q
- 如 q 被修改过,则把它写回外存
- 修改 q 的页表项中驻留位置为0
- 将需要访问的页 p 装入到物理页面 f
- 修改p的页表项驻留位为 1 ,物理页帧号为 f
- 重新执行产生缺页的指令
虚拟页式存储中的外存管理
在何处保存未被映射的页
应能方便地找到在外存中的页面内容
交换空间(磁盘或者文件)
采用特殊格式存储未被映射的页面
注:可以用一个文件来存这些未被映射的页
虚拟页式存储中的外存选择
- 代码段:可执行二进制文件(代码指向相应的可执行文件)
- 动态加载的共享库程序段:动态调用的库文件(共享库也有相应的目标文件,所以上两项不改)
- 其它段:交换空间(数据段,堆栈)