3.2_1 虚拟内存的基本概念
虚拟存储技术也是存储空间扩充的一种技术,它比交换、覆盖技术要更先进一些。
(一)传统存储管理方式的特征、缺点
对于这种传统的存储管理方案,很多暂时用不到的数据也会长期占用内存,导致内存利用率不高。
传统存储管理方式有两个很明显的特征
1.一次性
作业必须一次性全部装入内存后才能开始运行。这会造成两个问题:
①作业很大时,不能全部装入内存,导致大作业无法运行;
比如一个大型游戏要60G内存,如果按照传统存储管理方式的话,一个4G运行内存的电脑是不可能运行这个游戏的。
②当大量作业要求运行时,由于内存无法容纳全部作业,因此只有少量作业能运行,导致多道程序并发度下降。
2.驻留性
一旦作业被装入内存,就会一直驻留在内存中,直至作业运行结束。事实上,在一个时间段内,只需要访问作业的一小部分数据即可正常运行,这就导致了内存中会驻留大量的、暂时用不到的数据,浪费了宝贵的内存资源。
比如一个游戏中有很多个场景地图,我们的角色处于A场景中,其实只需要加载A场景相关资源就行了,而不需要加载B场景、C场景……。但是对于传统存储管理方式,不管是A、B、C场景……的数据,都要求一直驻留在内存当中,无论此时是否需要用到这些数据。就导致内存中驻留了大量的暂时用不到的数据,从而浪费内存资源。
传统存储管理方式的这些缺点,都可用虚拟存储技术解决问题。
(二)局部性原理
虚拟存储技术的提出,其实是基于著名的局部性原理(之前在讲页式存储管理的快表机构的地方讲过)。
时间局部性
如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性
一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)
(三)虚拟内存的定义和特征
基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。
在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。
“虚拟内存”也是操作系统虚拟性的一个体现。实际的物理内存大小没有变,只是在逻辑上进行了扩充。
虚拟内存有以下三个主要特征:
1.多次性
无需在作业运行时一次性全部装入内存,而是允许被分成多次调入内存。
2.对换性
在作业运行时无需一直常驻内存,而是允许在作业运行过程中,将作业换入、换出。
这里的“多次性”和“对换性”,刚好就对应了传统存储管理方式当中的“一次性”和“驻留性”。
3.虚拟性
从逻辑上扩充了内存的容量,使用户看到的内存容量远大于实际的容量。
(四)如何实现虚拟内存技术
虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。
因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础之上。
之前学过的“离散分配”的传统的内存管理方式,有基本分页、基本分段、基本段页式。
那么,在这三种“离散分配”的内存管理方式基础之上,就形成了与它们相对应的——请求分页、请求分段、请求段页式。
“传统的离散分配”和“虚拟内存”的主要区别在于:
1.在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。
因此,要在传统的基础之上增加功能:操作系统要提供**请求调页(或请求调段)**功能。
2.若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。
因此,要在传统的基础之上增加功能:操作系统要提供**页面置换(或段置换)**的功能。
具体需要提供什么功能,如请求调页、请求调段;页面置换、段置换,要看你是“请求分页”、”请求分段“还是”请求段页式“。