1、虚拟内存的起因
在程序运行过程之中,经常会出现内存不够用的情况,程序规模的增长速度远大于存储器规模的增长速度。我们理想之中的存储器是:更大,更快,更便宜的非易失性的存储器。但实际中的存储器的结构如下图所示:从上到下分别为寄存区,缓存,主存,磁盘,磁带。其中访问速度越开的内存里CPU越近,但是所具有的空间也越小。
从上述图中可以看出,内存的空间有限,但是磁盘的空间很大,为了将磁盘的空间利用起来,就想到了虚拟内存的方式。
2、覆盖技术
目标是在较小的可用内存中运行较大的程序。常用于多道程序系统,与分区存储管理配合使用。早期的DOS操作系统使用的就是这种覆盖技术。
原理是把程序按照其自身逻辑结构,划分为若干个功能上相对独立的程序模块,那些不会同时执行的模块共享同一块内存区域,按时间先后来运行。
必要部分(常用功能)的代码和数据常驻内存;
可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用到时才装入内存;
·不存在调用关系的模块不腻同时装入到内存,从而可以相互覆盖,即这些模块公用一个分区。
下图是一个覆盖技术的实例:
上图之中一个190k的程序只需要110k的内存空间就可以运行了。但是还有一种更加节省空间的覆盖方式,将A独占一个分区内存为20k,将相互之间没有调用关系的模块B、E和F放到一个分区,所需空间大小为50k,将相互之间没有调用关系的模块C和D放到一个分区,所需要的空间大小为30k,这样总共值需要100k的内存空间就可以执行190k的应用程序了。
缺点:·由程序员来吧一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费事费力,增加了编程的复杂度;
覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省;
3、交换技术
目标: 是多道程序在内存中时,让正在运行的程序或许要运行的程序获得更多的内存资源,是早期UNIX操作系统提供的一种方法。
方法:
·可以将暂时不能运行的程序送到外存,从而获得空闲内存空间;·
·操作系统把一个进程的整个地址空间的内容保存到外存中(换出 swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容的大小为整个程序的地址空间。
交换技术示意图如下图所示:
操作系统呢执行交换技术需要注意的几个问题?
交换时机的确定:何时才需要发生交换?只当内存空间不足或有不足的危险时换出;
·交换区的大小:必须的足够大已存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取;
·程序换入时的重定位:换出后在换入的内存位置一定要在原来的位置上吗?最好采用动态地址映射的方法。
覆盖与交换的比较?
覆盖只能发生在那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构;
·交换技术示意在内存中的程序大小为单位而来进行的,他不需要程序员给出各个模块之间的逻辑覆盖结构。换言之,交换发生在内存中程序与管理程序或操作系统之间,而覆盖则发生在运行程序的内部。
4、虚存技术
**目标:**在内存不够的情形下,可以采用覆盖技术和交换技术,但是,**覆盖技术:**需要程序员自己把整个程序划分为若干个小的功能模块,并确实那个各个模块之间的覆盖关系,增加了程序员的负担;**交换技术:**以进程为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销。**虚存技术:**包含覆盖技术的特点,但是不需要程序员干涉,由操作系统自动那个完成,也包含交换技术的特点,但是只对进程的部分内容在内存和外存之间进行交换。
虚存技术需要程序具有局部性的特征,程序的局部性指程序在执行过程中的一个较短的时期,所执行的指令地址和指令的操作数地址,分别局限于一定的区域。程序的局部性包含时间局部性和空间局部性。
时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内;
空间局部性:当前指令和临近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小的区域内。
4.1 在页式或者段式内存管理实现虚存技术
·在装入程序时,不必将全部程序装入到内存,而只需要将当前需要执行的部分页面或者段装入到内存,就可以让程序开始执行;
在程序执行过程之中,如果需要执行的指令或访问的数据尚未在内存(称之为缺页或者缺段),则由处理器统治操作系统将相应的页面或者段调入到内存,然后继续执行程序;
另一方面,OS将内存中暂时不使用的页面或者短调出保存在外存上,从哪儿腾出更多空闲空间存放将要装入的程序以及将要调入的页面或者段;
4.2 虚存技术的特征
·大的用户空间:通过把物理内存与外存相结合,提供给用户的虚拟化空间通常大于实际的物理内存,即实现了这两者的分离;
部分交换:与交换技术相比,虚拟储存的调入和调出是对部分虚拟地址空间进行的;
不连续性:物理内存分配的不连续性,虚拟地址空间使用的不连续性;
4.3 虚拟页式内存管理
大部分虚拟储存系统都采用虚拟页式存储管理技术,机载也是存储管理的基础上,增加请求调页和页面置换的功能。
其基本思路为:当一个用户程序要调入内存运行时,不是讲改程序的所有页面都装入内存,而是指装入部分的页面,就可以启动程序运行;
·在运行的过程中,如果法发现要运行的程序或要访问的数据不在内存中,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。用于虚存管理的页表表项如下图所示:
驻留位表示该页在内存还是在外存,若该位等于0,则表名该页在外存中,若想要访问,则将导致缺页中断;保护位表示允许对该页进行的访问类型,包括读,写和执行等;修改位表示该页在内存中是否被修改过,当系统内回收改物理页面时,根据此位来决定是否需要把它的内容写会外存;最后访问位表示在一段时间内该页是否内访问过,用于页面置换时将不经常访问的页面置换出去。
4.4 缺页中断处理
产生缺页中断之后,会分两种情况,内存中有看空闲物理空间和内存中没有空闲的物理空间。
当内存中有空闲的物理空间时,则OS会分配一个空闲的物理页帧 f f f,然后转到上图第4步;否则将采用某种页面置换算法,选择一个将被替换的页帧 f f f,其所对应的逻辑页号为 q q q,并判断是否需要将其内容写回到外存中;之后将 q q q对应的页表项进行修改,把驻留位置为0;将需要访问的页 p p p装入到物理页面 f f f中,修改 p p p所对应的页表项的内容,把驻留位置为1,把物理页帧号置为 f f f;最后重新运行你被中断的指令。
4.5 虚存技术的性能
为了便于理解分页的开销,使用有效存储器访问时间effective memery access time(EAT)。
EAT=访问时间(10ns)∗页面命中几率+pagefault处理时间(5ms)∗pagefault几率
当 p充分小的时候,EAT可以很接近10ns,具有很高的效率,当程序具有局部性的特点时,p就会很小,虚存技术的性能就会很高。