参考教材:《操作系统概念(原书第九版)》
七、虚拟内存
虚拟内存的概念
- 什么是虚拟内存?
- 虚拟内存使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换
- 基于局部性原理,在程序装入时,可以将程序中的很快会用到的部分装入内存,暂时用不到的部分留在外存,其包含如下四方面技术手段:段页管理、部分加载、按需调页、换入换出
- 实际效果是:每个进程都能占有使用CPU可寻址(32位机4G)的线性地址空间,其可以远大于物理内存空间。
- 虚拟内存的优点
- 1: 地址空间>物理内存
- 用户可以编写比内存大的程序
- 4G空间可以使用,简化编程
- 2: 部分程序或程序的部分放入物理内存
- 内存中可以放更多进程,并发度好,效率高
- 将需要的部分放入内存,有些用不到的部分从来不放入内存,内存利用率高
- 程序开始执行、响应时间等更快
虚拟内存的实现
- 缺页中断
- 页面置换
- 先进先出页面置换 First In First Out (FIFO)
- 最优页面置换 Optimal replacement (OPT)
- 最近最少使用页面置换 (准确实现)Least-Recently-Used (LRU)
- 计数器法
- 页码栈法
- 最近最少使用页面置换(近似实现)Least-Recently-Used (LRU)
- 引用位法
- 时钟法
- 改进的时钟法
- 其他改进的时钟法
- 其他相关问题
- 写时复制
- 交换空间(交换区)与工作集——从何处调入页面
- 磁盘交换空间
- 基于普通文件系统:windows中pagefile.sys文件
- 独立的磁盘分区—生磁盘(RAW),不需要文件系统和目录结构,如linux中的swap分区
- 工作集(驻留集):给进程分配的主存物理空间。是动态变化的。
- 分配给一个进程的存储量越小,在任何时候驻留在主存中的进程数就越多,从而可以提高处理器的利用率。
- 如果一个进程在主存中的帧数过少,尽管有局部性原理,页错误率(不命中率)仍然会相对较高。
- 如驻留集过大,由于局部性原理,给特定的进程分配更多的主存空间对该进程的页错误率没有明显的影响。
- 工作集分配分为两种方式:
- 固定分配(fixed-allocation):工作集大小固定,可以:各进程平均分配,根据程序大小按比例分配,按优先权分配。
- 可变分配(variable-allocation):工作集大小可变,按照缺页率动态调整(高或低->增大或减小常驻集),性能较好。增加算法运行的开销。
- 页置换策略:全局置换和局部置换
- 全局置换:发生缺页时可以在本进程或其他进程的页面中选择一个置换
- 局部置换:发生缺页时只能在本进程页面中选择一个置换
- 系统颠簸现象和Belady异常现象
- 颠簸/抖动(thrashing):刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存
- 主要原因:进程频繁访问的页面数高于可用的物理块数
- Belady异常
- 虚拟内存中程序优化
- 虚拟内存:按需调页与页面置换。如何优化提升程序的性能?
- 对代码来说,紧凑的代码也往往意味着接下来执行的代码更大可能就在相同的页或相邻页。根据时间locality特性,程序90%的时间花在了10%的代码上。如果能将这10%的代码尽量紧凑且排在一起,无疑会大大提高程序的整体运行性能。
- 对数据来说,尽量将那些会一起访问的数据(比如链表)放在一起。这样当访问这些数据时,因为它们在同一页或相邻页,只需要一次调页操作即可完成;反之,如果这些数据分散在多个页(更糟的情况是这些页还不相邻),那么每次对这些数据的整体访问都会引发大量的缺页错误,从而降低性能。
总结
- 虚拟内存的基本思想
- 将进程的一部分(不是全部)放进内存
- 其他部分放在磁盘
- 需要的时候调入: 请求调页
- 请求调页的基本思想
- 当MMU发现页不在内存时,中断CPU
- CPU处理此中断,找到一个空闲页框
- CPU将磁盘上的页读入到该页框
- 如果没有空闲页框需要置换某页(LRU)