虚拟内存
起因
程序规模的增加远大于存储容量的增长速度。
理想中的存储器:更大、更快、更便宜的非易失性存储器。
在计算机系统中,尤其是在多道程序运行环境下,可能会出现内存不够的情况,怎么办?
- 如果是程序太大,超过了内存的容量,可以采用手动的覆盖技术,只需要把指令和数据保存在内存当中
- 如果是程序太多超过了内存的容量,可以采用自动的交换技术,把暂时不能执行的程序送到外存中
- 如果想要在有限容量的内存中,以更小的页的粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术
覆盖技术
- 目标:是在比较小的可用内存中运行比较大的程序。常用于多道程序系统,与分区的存储管理配合使用
- 原理:把程序按照其自身的逻辑结构,划分为若干个功能上相对独立的程序模块,把那些不会同时执行的模块共享同一块内存区域,按时间先后来运行
- 必要部分的代码和数据常驻内存
- 可选部分在其他程序模块中实现,平时存放在外存中,在需要的时候才装入内存;
- 不存在调用关系的模块,不必要同时装入到内存中,从而就可以相互覆盖,即这些模块公用一个分区
- 缺点:
- 由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度
- 覆盖模块从外存装入内存实际上是以延长时间来获取空间节省
交换技术
- 目标:多道程序在内存中时,让正在运行的程序获取更多的内存资源
- 方法:可以将暂时不能运行的程序送到外村,从而获取空闲内存空间。操作系统把一个进程的整个地址空间内容保存到外存中,而将外存中的某个进程的地址空间读入到内存中,换入唤出内容的大小为整个程序的地址空间
- 交换技术实现的几个问题
- 交换时机的确定:何时需要发生交换?只当内存空间不够或有不够的危险时换出
- 交换区的大小:必须足够大以存放所有的用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取
- 程序换入时候的重定位:换出后再换入的内存位置不一定在原来的位置上,最高采用动态地址映射的方法
- 覆盖和交换的比较
- 覆盖只发生在那些互相之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构。
- 交换技术是以在内存中的程序大小为单位来进行的,它不需要程序员给出各个模块之间的逻辑覆盖结构。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖则发生在运行程序的内部。
虚拟技术
-
目标:
- 像覆盖技术一样,不是把程序的所有内容都放在内存中,因此能够运行比当前的空闲内存空间还要大的程序。但做的更好,由操作系统自动完成,无需程序员干涉。
- 像交换技术那样,能够实现进程在内存和外存之间的交换,因而获得更多的空闲内存空间,但是做的更好,只对进程部分内容在内存和外存之间进行交换。
-
程序局部性原理:指的是程序在执行过程中的一个较短的时间内。所执行的指令地址和指令操作数地址,分别局限于一定区域
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都几种在一个较小的区域内
程序局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的效果的
-
基本概念:可以在页式或者段式内存管理基础上实现
- 在装入程序时候,不必将其全部装入到内存中,只需要将当前需要执行的部分页面或者段装入到内存,就可以将程序开始执行
- 在程序执行过程中,如果需要执行的指令或者访问的数据尚未在内存,则由处理器通知操作系统将相应的页面或者段调入到内存,然后继续执行程序
- 另一方面,操作系统将内存中暂时不使用的页面或者段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段
-
基本特征:
- 大的用户空间:通过把物理内存和外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,但是实际上内存是256M,但是硬盘大于4GB
- 部分交换:与交换技术相比较,虚拟存储的调入或者是调出是对部分虚拟地址空间进行的
- 不连续性:物理内存分配不连续,虚拟地址空间使用的不连续
-
虚拟页式内存管理:
- 页式内存管理:页表完成逻辑页到物理页帧的映射
- 大部分的虚拟存储系统都是采用虚拟页式存储管理技术,即在也是存储管理的基础上增加请求调页和页面置换的功能
- 当一个用户需要调入内存运行时候,不是将该程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行
- 在运行过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统再处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行
-
后备存储
-
概念:
- 一个虚拟地址空间的页面可以被映射到一个文件中的某个位置
- 代码段:映射到可执行二进制文件
- 动态加载的共享程序段:映射到动态调用库文件
- 其他段:可能被映射到交换文件
-
在何处保存未被映射的页?
- 能够简单的识别在二级存储中的页
- 交换空间:特殊格式,用于存储未被映射的页面
-