OS操作系统系列文章目录
【OS操作系统】Operating System 第一章:操作系统的概述
【OS操作系统】Operating System 第二章:启动、中断、异常和系统调用
【OS操作系统】Operating System 第三章:连续内存分配
【OS操作系统】Operating System 第四章:非连续内容分配
【OS操作系统】Operating System 第五章:虚存技术
【OS操作系统】Operating System 第六章:页面置换算法
【OS操作系统】Operating System 第七章:进程与线程
【OS操作系统】Operating System 第八章:处理机调度
【OS操作系统】Operating System 第九章:同步互斥问题
【OS操作系统】Operating System 第十章:信号量与管程
【OS操作系统】Operating System 第十一章:死锁与进程通信
【OS操作系统】Operating System 第十二章:文件系统
第五章:虚存技术
虚拟内存的起因
-
起因:经常出现内存不够的情况;且程序规模的增长远大于存储器容量的增长速度;
-
理想的存储器:更大、更快、更便宜、非易性存储;
- 实际的存储器
- 同时,也会把硬盘的空间也用上,不常用的信息存储在硬盘上,常用的存储在内存上;
- 在OS中,面对多道程序运行的情况,可能会出现内存不够的问题,解决办法:
- 手动的覆盖技术(overlay),如果程序太大,超过了内存的容量,只把需要的指令和数据保存在内存中;
- 自动的交换技术(swapping),如果程序太多,超过了内存的容量,把暂时不能执行的程序保存在内存中;
- 自动的虚拟存储技术,在有限容量的内存中,以更小的页粒度为单位装入更多更大的程序;
覆盖技术
- 当程序太大,超出内存容量,可以采取手动的覆盖技术,只把需要的指令和数据存储在内存中;
- 目的:在较小的可用内存中运行较大的程序,用于大程序系统,与分区存储管理配合使用;
-
原理:
把程序按照逻辑结构,划分为若干个功能上相互独立的程序模块,那些不需要同时执行的模块将共享同一块内存区域中,按时间先后运行;- 必要部分(常用功能)的代码和数据常驻内存;
- 可选部分(不常用功能)在其它程序模块中实现,平时放在硬盘中,在需要用到时才装入内存;
- 不存在调用关系的模块不必同时装入内存中,从而可以相互覆盖,即这些模块共用一个分区
程序松耦合的部分可以按需装入内存,不需要的时候放在硬盘上,多个不常用部分共用一个分区;
- 实例:
- A会调用B和C,但是并不需要同时调用;
- C会调用E和F,但是并不需要同时调用;
- 缺点:
- 程序员需要把一个大的程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,费时费力,增加编程的复杂度;
- 覆盖模块并从硬盘装入内存,实际上时以时间延长来换取空间节省;
交换技术
- 如果程序太多,超过了内存的容量,可以采用自动的交换技术,把暂时不能执行的程序从内存中取出;
- 目的:多道程序在内存中时,让正在运行的程序或需要运行的程序获得更多的内存资源;
- 原理:
- 可将暂时不能运行的程序送到外存中,从而获得空闲的内存空间;
- OS把一个进程的整个地址空间的内容保存到外存中,该操作被称为换出(swap out);从而将外存中的某个进程的地址空间读入到内存中,该操作被称为换入(swap in);
- 换入换出内容的大小为整个程序的地址空间;
- 存在的问题和解答
- 交换时机的确定,何时需要发生交换?
只当内存空间不够或有不够的危险时,进行换出; - 交换区的大小;
必须足够大以存放所有用户进程的所有内存映射的拷贝,必须能够对这些内存映射进行直接存取; - 程序换入时的重定位,换出后再换入的内存位置一定要在原来的位置上吗?
可能会出现寻址的问题,最后采用动态地址映射的方法;
- 交换时机的确定,何时需要发生交换?
覆盖技术和交换技术的对比
- 特点:
- 覆盖只能发生再那些相互之间没有调用关系的程序模块之间,因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构;
- 交换技术是以在内存中的程序大小为单位进行的,不需要程序员给出各个模块之间的逻辑覆盖结构;
- 换而言之,交换发生在内存中程序与管理程序或OS之间,而覆盖则发生在运行程序的内部;
- 在内存不够用的情形下,可以采用覆盖技术和交换技术,但是:
- 覆盖技术:需要程序员自己把整个程序划分为若干个小的功能模块,并确定各个模块之间的覆盖关系,增加了程序员的负担;
- 交换技术:以进程作为交换的单位,需要把进程的整个地址空间都换入换出,增加了处理器的开销;
虚拟内存管理技术
- 目标:
解决了覆盖技术给程序员负担大和交换技术处理器开销大的问题;- 像覆盖技术一样,不是把程序的所有内容都放在内存中,因而能够运行比以前的空闲内存空间还要大的程序;但是做得更好,能由操作系统自动完成,无需程序员介入;
- 像交换技术那样,能够实现进程在内存和外存之间的交换,因而获得更多的空闲内存空间;但能做得更好,只对进程的部分内容在内存和外存之间进行交换;
-
程序的局限性原理
指程序在执行过程中的一个较短时间,所执行的指令地址和指令的操作数地址分别局限于一定区域,表现为:- 时间局部性:
一条指令的一次执行和下次执行,以及一个数据的一次访问和下次访问都集中在一个较短的时间内; - 空间局部性:
当前指令和临近的几条指令,以及当前访问的数据和临近的几个数据都集中在一个较小的区域内;
程序的局部性原理表明,从理论上说,虚拟存储技术能够实现的,而且在实现了以后应该能够取得一个满意的效果;
- 时间局部性:
-
实例:
在32位系统中,一个
int
元素的大小为4B
;数组一行有1024个元素,故一行的大小为
1024 * 4B = 4KB
;数组共有1024行,故数组的大小为
1024 * 4KB = 4MB
;
- 虚存技术的基本概念
可以在页式或段式内存管理的基础实现- 在装入程序时,不必将其全部装入到内存,而只需将当前需要执行的部分页面或段装入到内存,就可以让程序开始执行;
- 在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;
- 另一方面,操作系统将内存中暂时不使用的页面或段调出保存在外存中,从而腾出更多空闲空间存放将要装入的程序以及将要调入的页面或段;
- 虚存技术的基本特征
- 大的用户空间:
通过把物理内存于外存相结合,提供给用户的虚拟内存空间通常大于实际的物理内存,即实现了这两者的分离;如32位的虚拟地址理论上可以访问4GB,而可能计算机上仅有256MB的物理内存,当硬盘容量大于4GB; - 部分交换:
与交换技术相比较,虚拟存储的调入和调出是对部分虚拟地址空间进行的; - 不连续性:
物理内存分配的不连续,虚拟地址空间使用的不连续;
- 大的用户空间:
- 虚拟页式内存管理
- 大部分虚拟存储系统都采用页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能;
- 基本思路:
- 当一个用户程序要调入内存运行时,不是将该程序的所有页面都装入内存,而是只装入部分的 页面,就可启动程序运行;
- 在运行的过程中,如果发现要运行的程序或要访问数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存,使得该程序能够继续运行;
- 页表表项的构成:
逻辑页号 | 访问位 | 修改位 | 保护位 | 驻留位 | 物理页帧号
- 访问位:
如果该页被访问过(包括读写操作),则设置此位,用于页面置换算法; - 修改位:
表示此页在内存中是否被修改过,当系统回收该物理页面时,根据此位决定是否把它的内容写回外存; - 保护位:
表示允许对该页做何种类型的访问,如只读、可读写、可执行等; - 驻留位:
表示该页是在内存中还是在外存;
- 缺页中断处理过程:
- 如果在内存中有空闲的物理页面,则分配一物理页帧
f
,然后转第4步;否则转到第2步; - 采用某种页面置换算法,选择一个将被替换的物理页帧
f
,它所对应的逻辑页为q
,如果该页在内存期间被修改过,则需要把它写回外存; - 对
q
所对应的页表修改,把驻留位设为0; - 将需要访问的页
p
装入到物理页面f
当中; - 修改
p
所对应的页表项的内容,将驻留位设为1,把物理页帧号设为f
; - 重新运行被中断的指令;
- 如果在内存中有空闲的物理页面,则分配一物理页帧
- 后备存储(二级存储)
- 保存未被映射的页的地方:
- 能够简单地识别在二级存储器中的页;
- 交换空间(磁盘或者文件):特殊格式,用于存储未被映射的页面;
- 概念:后备存储
- 虚拟地址空间的页面:
可以被映射到一个文件(在二级存储中)的某个位置; - 代码段:
映射到可执行二进制文件; - 动态加载的共享库程序段:
映射到动态调用的库文件; - 其它段:
可能被映射到交换文件(swap file);
- 虚拟地址空间的页面:
- 保存未被映射的页的地方:
- 虚拟内存性能
为了便于理解分页的开销,使用有效存储器访问时间EAT
,即EAT = 访存时间 * 页表命中率 + page fault处理时间 * page fault几率
;- 实例:
访存时间:10ns
磁盘访问时间:5ms
参数p = page fault几率
参数q = dirty page几率
EAT = 10(1 - p) + 5 000 000(1 + q)p;
- 实例: