1. 什么是虚拟内存
虚拟内存是对物理内存的一种扩充,使得程序可用的内存看起来比实际的内存要大。虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉,而实际上它通常是被分割成多个物理内存碎片的,甚至有些部分暂时存储在外部磁盘存储器上,在需要时再进行数据交换。
2. 局部性原理
局部性原理主要表现在时间局部性和空间局部性两个方面。
- 时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。时间局部性是通过将近来使用的指令和数据保存到高速缓存存储器中,并使用高速缓存的层次结构实现。
- 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。
3. 虚拟内存的技术实现
- 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。在作业运行过程中发现要访问的页面不在内存中时,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。(页面置换算法下面有介绍)
- 请求分段存储管理:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
4. 页面置换算法
首先看一下缺页中断的概念,缺页中断
就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法,我们可以把页面置换算法看成是淘汰页面的规则。
- 最佳页面置换算法(Optimal, OPT):最佳置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若千页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。
- 先进先出页面置换算法FIFO(First In First Out):总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
- 最近最久未使用页面置换算法LRU (Least Currently Used):LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。
- 最少使用页面置换算法LFU (Least Frequently Used):该置换算法选择在之前时期使用最少的页面作为淘汰页。