虚拟内存
起因:程序规模的增长速度远远大于存储器容量的增长速度。
理想中的存储器:容量更大、速度更快、价格更便宜的非易失性存储器 。
实际中的存储器:
对于内存的非易失性存储还做不到。
计算机系统时常出现内存空间不够用:
覆盖(overlay):应用程序手动把需要的指令和数据保存在内存中,只把需要的指令和数据保存在内存中。
交换(swapping):操作系统自动把暂时不能执行的程序保存到外存中,把整个程序导入导出开销太大
虚拟存储:在有限容量的内存中,以页为单位自动装入更多更大的程序。
覆盖技术:
目标:在较小的可用内存中运行较大的程序,常用于多道程序系统,与分区存储管理配合使用。 背景:早期,DOS,硬件只有640kb的内存,软件几十k,大的上兆。
方法:依据程序逻辑结构,将程序划分为若干功能相对独立的模块;将不会同时执行的模块共享同一块内存区域
- 必要部分(常用功能)的代码和数据常驻内存
可选部分(不常用功能)放在其他程序模块中,只在需要用到时装入内存
不存在调用关系的模块可相互覆盖,共用同一块内存区域
B和C不会同时执行,不具有调用关系,分在一个区。同理D、E和F也一样。
缺点:1.增加编程困难:需程序员划分功能模块,并确定模块间的覆盖关系,增加了编程的复杂度;
2.增加执行时间,从外存装入覆盖模块,时间换空间
交换技术:
背景:UNIX,让OS管理而不是程序员管理,以运行的程序为单位。
目标:多道程序在内存中时,让正在运行的程序或需要运行的程序有更多的内存资源。
方法:可将暂时不能运行的程序送到外存以获得空闲内存空间,操作系统在内存管理单元MMU帮助下把一个进程的整个地址空间的内容保存到外存中(换出swap out),而将外存中的某个进程的地址空间读入到内存中(换入swap in)。其大小为整个程序的地址空间(比较大,几十几百个页,开销大)。
何时交换?
硬盘操作很慢,一动系统就要等,所以要当内存空间确实不够,或者有不够的危险时换出
交换区的大小?
极端下是内存中只留一个程序,其余都在交换区。交换区必须够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像直接存取
程序换入时重定位:再次换入的内存地址一定要在原来位置上吗?
不一定,可能已被占用,,物理地址变化了,要正确寻址,需要动态地址映射,建立好页表,虚拟地址一样,物理地址不一样。
覆盖、交换的比较: 目标一样,使得大的程序或者更多的程序跑在有限的空间内。采取技术不一样
- 覆盖是发生在一个运行中的程序内部没有调用关系的模块之间,代价是程序员手动指定和划分逻辑覆盖结构;
- 交换发生在内存中程序与管理程序或OS之间,以进程作为交换的单位,需要把进程的整个地址空间都换进换出,对程序员是透明的,减轻程序员负担,开销相对较大。
虚拟内存:
目标:
- 像覆盖技术那样,不是把程序的所有内容都放在内存中,因而能够运行比当前的空闲内存空间还要大的程序,但做的更好,由操作系统来完成,无需程序员干涉。
- 像交换技术那样,能够实现进程在内存和外村之间的交换,因而获得更多的空闲内存空间,但做的更好,只对进程的部分内容在内存与外存之间进行交换。
程序的局部性原理(principle of locality):指程序在执行过程的一个较短时期,所执行的指令的地址,指令的操作数地址,分别局限于一定区域。表现为:
- 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都在较短时间内;
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。
程序的局部性原理表明,从理论上虚拟存储技术是能够实现的。
eg:
编程对缺页率的影响: 一个二维数组a[i][j],C默认的先行后列排列法,每一行放在一个页面中。
for(j=0;j<1024;j++){
for(i=0;i<1024;i++){
a[i][j]=0;
}
}
乙是i在外循环,j在内循环。页面大小4k,分配给每个进程的物理页面数为1.
甲方法产生1024*1024次缺页中断;乙方法则仅1024次。
注意:一页是4K。
虚存技术:可以在页式或者段式内存管理的基础上实现
- 在装入程序时,不必将其全部装入内存中,只把当前需要执行的部分页或段装入内存,就可以开始执行;
- 在程序执行的过程中,如果需要执行的指令或数据不在内存上时(缺页、缺段异常),由处理器通知操作系统,若有空余空间则将相应的页面或段调入内存,继续执行;
- 另一方面,os将内存中暂时不用的页、段调出内存保存在外存上以腾出空闲空间存放将要装入的程序以及将要调入的页面或段。
- 大的用户空间:内存可以小,硬盘必须足够。提供给用户的虚拟空间=物理内存+硬盘。
- 部分交换:swap in /swap out 是对部分虚拟地址空间进行的
- 不连续:物理内存分配的不连续,虚拟空间使用的不连续(某些数据被换出,OS解决内外存)
虚拟技术——虚拟页式内存管理
- 大部分虚拟存储系统多采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加了请求调页和页面置换功能
- 基本思路:当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,只装入部分页面即可启动程序。在运行程序的过程中,如果要发现要运行的程序和数据不在内存即页表某项invalid,则会抛出异常,向系统发出缺页中断请求,OS根据产生异常的地址找到对应在外存中的页面调入,使得继续运行。
页表表项:
- 驻留位:表示该页是在内存还是外存,为1,该页在内存;0,在外存,如果访问该页表项,会导致缺页中断;
- 保护位:表示允许对该页做何种类型的访问,如只读,可读写,可执行;
- 修改位:表示此页在内存中是否被修改过。当系统回收物理页面时据此决定是不是把内容写回外存;修改位的使用提高置换功能的效率。
- 访问位:如果该页被访问过(读、写)设1,用于页面置换算法。尽量置换没有被访问的页。
缺页异常(缺页中断)的处理流程:
在何处保存未被映射的页?
- 能简单地识别在二级存储器中的页;
- 交换空间(磁盘/文件):特殊格式,用于存储未被映射的页面
后备存储(backing store),二级存储
- 数据:一个虚拟地址空间的页面可以被映射到一个(在二级存储中)文件的某个位置;
- 代码段:映射到可执行二进制文件;
- 动态加载的共享库程序段:映射到动态调用的库文件
- 其他段:(动态产生的数据,是没与文件直接对应的内存内容→硬盘上专门开一个区swap file)可能被映射到交换文件(swap file)
虚拟内存性能