对应视频内容:
- 5.1 虚拟内存的起因
- 5.2 覆盖技术
- 5.3 交换技术
- 5.4 虚存技术(上)
- 5.5 虚存技术(下)
一、虚拟内存的起因
有没有比内存更便宜、容量更大的设备?
电脑游戏
有,硬盘。但是硬盘的速度远远慢于内存,程序不能放在硬盘上执行。
存储器层次结构
因此,操作系统能不能做出一个 更大、更快、更便宜 的虚拟内存空间。程序员直接针对虚拟内存空间操作。
如上图,一种OS抽象技术。在OS Kernel管理下,常用数据代码放在内存中。
在没有虚拟内存技术时,使用覆盖技术或交换技术:
虚拟存储技术
在计算机系统中,尤其是在多道程序运行的环境下,可能会出现内存不够用的情况,怎么办?
- 如果程序太大,超过了内存的容量,可以采用手动的覆盖(overlay)技术,只把需要的指令和数据保存在内存当中;
- 如果程序太多,超过了内存的容量,可以采用自动交换(swapping)技术,把暂时不能执行的程序送到外存中。
- 如果想要在有限容量的内存中,以更小的页粒度为单位装入更多更大的程序,可以采用自动的虚拟存储技术。
二、 覆盖技术
产生
上世纪80年代,当时操作系统能力较弱(DOS),硬件640K内存。
基本原理
- 把程序按照其自身逻辑结构,划分为若干个功能相对独立的程序模块;那些不会同时执行的模块共享同一内存区域,按时间先后来运行:
- 必要部分(常用功能)的代码和数据常驻内存;
- 可选部分(不常用功能)在其他程序模块中实现,平时存放在外存中,在需要用时才装入内存;
- 不存在调用关系的模块不必同时装入到内存,从而可以相互覆盖,即这些模块共用一个分区。
覆盖技术实例
上图是一个例,A、B、C、D、E、F是六个函数,不存在相互调用关系的函数共享一个内存空间,用到谁时调谁。
**注意 ,**上例还有另外一种覆盖方法:(100K)
A 占一个分区:20K;
B、E和F共用一个分区:50K;
C和D共用一个分区:30K。
上述是以逻辑覆盖关系。
存在问题
最大问题开销问题非常大:
- 由程序员来把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加了编程的复杂度;
- 覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。
三、交换技术
目标:
- 多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源
方法:
- 可将暂时不能运行的程序送到外存,从而获得空闲内存空间
- 操作系统把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。换入换出内容的大小为整个程序的地址空间。
内存保存到外存(swap out)
从外存导入内存(swap in)
交换技术中的问题
-
交换时机的确定:只有当内存空间不够或有不够的危险时换出;
-
交换区的大小:必须足够大以存放所有用户进程的所有内存映像的拷贝,必须对这些内存映像进行直接存取;
-
程序换入的重定位:换出后再换入内存的位置不一定一样,寻址可能会出现问题。所以最好采用动态地址映射的方法。
覆盖与交换的比较:
-
覆盖技术需要程序员的介入
-
交换技术不需要程序员的介入,操作系统接管了很多细节的操作
-
交换技术对于程序员来说是透明的,减轻了程序员的负担,但是系统的开销变大了。
四、虚存技术
覆盖技术和交换技术的局限性
在内存不够用的情况下,可以采用覆盖技术和交换技术,但是:
-
覆盖技术:需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担;
-
交换技术:以进程作为交换的单位,需要把进程的整个地址空间都换进换出,增加了处理器的开销
虚存技术的目标
- 像覆盖技术那样,不是把程序的所有内容都放在内存中,但是是自动执行的,无需程序员干涉;
- 像交换技术那样,实现进程在内存与外存之间的交换,但是不是以一个程序为粒度,而是以页为粒度。
程序的局部性原理
程序的局部性原理(principle of locality):指程序在执行过程中一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。可以表现为:
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问都集中在一个较短时间内;
- 空间局部性:当前指令和临近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小的区域内。
程序的局部性原理表明,从理论上说,虚拟存储技术是能够实现的,而且在实现了以后应该能够取得一个满意的效果的。
程序的局部性原理实例
例:页面大小为4K,分配给每个进程的物理页面数为1。在一个进程中,定义了如下的二维数组int A[1024][1024],该数组按行存放在内存中,每一行放在一个页面中。
操作系统只用利用程序的局部性特点,才能很好地实现虚存技术。
虚存技术基本概念
可以在页式或段式内存管理的基础上实现
- 在装入程序时,不必将其全部装入到内存,而只需将当前需要执行的部分页面或段装入到内存,就可以让程序开始执行;
- 在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
- 另一方面,操作系统将内存中暂时不适用的页面或段调出保存在外存上,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段。
虚拟技术-基本特征
-
大的用户空间:提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离。如32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有256M的物理内存,但硬盘容量大于4GB。
-
部分交换:与交换技术相比,虚拟存储的调入和调出是对部分虚拟地址空间进行的;
-
不连续性:物理内存分配的不连续,虚拟地址空间使用的不连续。
虚拟页式内存管理
物理内存与虚拟内存靠页表进行索引。页表项中,还有代表“存在与否”等的bit。
五、虚拟页式内存管理
大部分虚拟存储系统都采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能。
基本思路:
-
当一个用户程序要调入内存运行时,不是将程序的所有页面都装入内存,而是只装入部分的页面,就可启动程序运行;
-
在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行。 (请求调页、页面置换)
-
因此为了实现请求调页和页面置换,在页表表项增加几个bit。
页表表项
虚拟页式内存管理实例
例如下:
上图中,X代表驻留位为0。
- 对于逻辑地址0,其在0K到4K,索引值为2,其物理地址为4K*2=8192。+ 而对于32780,32K~36K的驻留位为0,因此产生缺页异常。
因此,缺页中断时很重要的一个步骤,导演了内外存相互交换的动作。
缺页中断
缺页中断处理过程:
- 如果在内存中有空闲的物理页面,则分配一物理页帧f,然后转第4步;否则转第2步;
- 采用某种页面置换算法,选择一个将被替换的物理页帧f,它所对应的逻辑页为p,如果该页在内存期间被修改过,则需把它写回外存;
- 对p所对应的页表项进行修改,把驻留位改为0;
- 将需要访问的页p装入到物理页面当中;
- 修改p所对应的页表项的内容,把驻留位改为1,把物理页帧号置为f;
- 重新运行被中断的指令。
具体细节将在实验环节展开讲解。置换算法将在下节课进行讨论。
后备存储(Backing Store)
在何处保存未被映射的页?
- 能够简单地识别在二级存储器中的页
- 交换空间(磁盘或者文件):特殊格式,用于存储未被映射的页面。
后备存储的概念(backing store)
- 一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置;
- 代码段:映射到可执行二进制文件;
- 动态加载的共享库程序段:映射到动态调用的库文件;
- 其他段:可能被映射到交换文件(swap file)
虚拟内存性能
虚拟内存性能
为了便于理解分页的开销,使用有效存储器访问时间effective memory access time(EAT)。
EAT = 访问时间 * 页表命中几率 * + page fault处理时间 * page fault几率
1
例子:
访问时间:10ns
磁盘访问时间:5ms
参数p=page fault几率
参数q=dirty page几率
EAT=10(1−p)+5000000p(1+q)
1
如果p足够小,则使效率够。
我们的程序局部性保证了EAT足够小。