一、虚存的引入(为什么?)
突破了程序常驻内存。
1.常规存储器管理方式的特征
计算机程序运行时,组成程序的指令一定是要放在计算机的内存中才能执行;计算机的控制器从内存中读取指令,分析并执行指令;计算机取出指令后,指令计数器自动指向下一条指令;程序执行具有顺序性。所以一般情况下,系统将程序一次装入内存,并使程序连续存放。所以一个作业中程序的大小受到实际的计算机内存的限制,同时也造成资源浪费。
(1)一次性
一次全把程序放在内存中。
(2)驻留性
并把程序驻留在内存中。
二、覆盖与交换技术
0.简介
虚存是在覆盖与交换技术上发展而来。 分区式内存管理方式,对作业的大小有严格的限制,作业运行时,系统将作业的全部信息一次装入内存,并一直驻留内存,直至运行结束。当作业大于内存的空闲分区时,作业无法被接收、运行。为充分利用计算机的内存资源,可以采用覆盖和交换技术,使较大的作业也能够在系统中运行。 覆盖和交换技术是实现虚存管理的最基本的方法,让几个程序段共享一段内存空间,通过覆盖和交换,把暂时不需要运行的程序段调出内存,腾出内存空间,把将要运行的程序段调入内存执行。
1.覆盖
(1)覆盖技术
是指同一内存分区可以被不同的程序段重复使用的技术。 通常一个作业由若干个功能上相互独立的程序段组成,作业在一次运行时,也只是用到其中的几段,有些程序段是不会同时使用的。让那些不会同时运行的程序段交替使用同一个内存分区,实现部分内存的共享,这就是覆盖技术。被多个程序段共享使用的内存段称为覆盖区;共享使用覆盖区的程序段称为覆盖段。
覆盖技术.png
(2)流程解释
假设系统中有一个作业 w 由6个程序段组成,如图(a)所示,从图上可以看出,主程序是一个独立段,它调用子程序1和子程序2,且子程序1与子程序2是互斥被调用的两个段,在子程序1执行过程中,它调用子程序11,而子程序2执行过程中调用子程序21和子程序22,显然子程序21和子程序22也是互斥调用的。 因此可以为作业 w 建立如图(b)所示的覆盖结构:主程序段是作业 w 的常驻内存段,而其余部分组成覆盖段。根据上述分析,子程序1和子程序2组成覆盖段0,子程序11、子程序21和子程序22组成覆盖段1。相应覆盖区的大小应为每个覆盖段中最大的覆盖段的大小,覆盖的示意图如图(b)所示。覆盖段0(子程序1和子程序2)最大覆盖段为子程序2 10KB 所以相应覆盖区为 10KB;同理,覆盖段1(子程序11、子程序21和子程序22)最大覆盖段为子程序22 25KB 所以相应覆盖区为 25KB。
(3)覆盖技术的主要特点
是打破了必须将一个作业的全部信息装入内存后才能运行的限制,在一定程度上解决了小内存运行大作业的矛盾,为后续虚拟存储器概念的建立打下基础。
2.交换
交换技术.png
(1)交换技术
执行哪一个进程,就把哪一个进程从外存中拿进内存中来。 所谓交换(又叫做对换)就是指系统根据需要把内存中暂时不能运行的进程或者暂时不用的程序和数据,部分或者全部移到外存,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需要的程序和数据,移到相应的内存区,并使其投入运行。 具有交换功能的操作系统,通常把外存分为文件区和交换区,文件区用于存放文件,交换区用于存放从内存中换出的作业。为了能对交换区中的空闲盘块进行管理,在系统中应配置相应的数据结构,以记录外存的使用情况。其形式与内存在动态分区分配方式中所用数据结构相似,同样可以用空闲分区表或空闲分区链来管理交换区。
(2)流程解释
每当一进程由于创建子进程而需要更多的内存空间,但又无足够的内存空间等情况发生时,系统应将某进程换出。 其过程是: ① 系统首先选择处于阻塞状态且优先级最低的进程作为换出进程,将该进程的程序和数据传送到磁盘的交换区上。若传送过程未出现错误,便可回收该进程所占用的内存空间,并对该进程的进程控制块做相应的修改。 ② 系统定时地查看所有进程的状态,从中找出“就绪”状态但已换出的进程,将其中换出时间(换出到磁盘上)最久的进程作为换入进程,将之换入。直至已无可换入的进程或无可换出的进程为止。
三、程序局部性原理(重要)
1968年,Denning.P就曾提出局部性原理:程序在执行时将呈现出局部性规律,即在一较短的时间内,程序的执行仅局限于某个部分;相应地,它所访问的存储空间也局限于某个区域。
- 程序执行时,除了少部分的转移和过程调用指令外,在大多数情况下仍是顺序执行的。该论点也在后来的许多学者对高级程序设计语言(如FORTRAN语言、PASCAL语言)及C语言规律的研究中被证实。
- 过程调用将会使程序的执行轨迹由一部分区域转至另一部分区域,但经研究看出,过程调用的深度在大多数情况下都不超过5。这就是说,程序将会在一段时间内都局限在这些过程的范围内运行。
- 程序中存在许多循环结构,这些虽然只由少数指令构成,但是它们将多次执行。
- 程序中还包括许多对数据结构的处理,如对数组进行操作,它们往往都局限于很小的范围内。
局限性还表现在下述两个方面: (1) 时间局限性: 如果程序中的某条指令一旦执行, 则不久以后该指令可能再次执行;如果某数据被访问过, 则不久以后该数据可能再次被访问。产生时间局限性的典型原因,是由于在程序中存在着大量的循环操作。 (2) 空间局限性: 一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,其典型情况便是程序的顺序执行。 基于局部性原理,应用程序在运行之前,没有必要全部装入内存,仅须将那些当前要运行的少数页面或段先装入内存便可运行,其余部分暂留在盘上。程序在运行时,如果它所要访问的页已调入内存,便可继续执行下去;但如果程序所要访问的页尚未调入内存(称为缺页),此时程序应利用操作系统所提供的请求调页功能,将它们调入内存,以使进程能继续执行下去。如果此时内存已满,无法再装入新的页,则还须再利用页的置换功能,将内存中暂时不用的页调至盘上,腾出足够的内存空间后,再将要访问的页调入内存,使程序继续执行下去。
四、虚拟存储器定义
1.定义(是什么?)
所谓虚拟存储器, 是指具有请求调入功能和置换功能, 能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量和外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。可见,虚拟存储技术是一种性能非常优越的存储器管理技术,故被广泛地应用于大、 中、 小型机器和微型机中。 利用请求调入和置换的方法将一定的外存容量模拟成内存,同时对程序的调入调出内存的方式进行管理,从而得到一个比实际内存容量大得多的内存空间,使得程序的运行不受内存大小的限制。
五、虚存的实现机制(重要)
1.缺页中断
中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。
缺页中断.png
每当用户程序要访问的页面尚未调入内存时便产生一次缺页中断,以请求操作系统将所缺的页面调入内存。缺页中断是一种特殊的中断,与一般的中断相比,有着明显的区别: 1)指令执行期间,产生和处理中断信号。通常,CPU是在一条指令执行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续执行下一条指令。然而,缺页中断是在指令执行期间,发现所要访问的指令或数据不在内存时所产生和处理的。 2)一条指令在执行期间,可能产生多次缺页中断。在图6-4中示出了一个例子。如在执行一条指令COPY A TO B时,可能要产生6次缺页中断,其中指令本身跨了两个页面,A和B又分别各是一个数据块,也都跨了两个页面。基于这种特征,系统中的硬件机构能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处继续执行。
2.调页
(1)何时调入页面
1)预调页
- 以预测为基础,将预计不久后便会被访问的若干页面,预先调入内存。
- 优点:一次调入若干页,效率较好
- 缺点:预测不一定准确,预调入的页面可能根本不被执行到。主要用于进程的首次调入,由程序员指出应该先调入哪些页。
如果进程的许多页是存放在外存的一个连续区域中,则一次调入若干个相邻的页,会比一次调入一页更高效些。但如果调入的一批页面中的大多数都未被访问,则又是低效的。可采用一种以预测为基础的预调页策略,将那些预计在不久之后便会被访问到的页面预先调入内存。如果预测较准确,那么,这种策略显然是很有吸引力的。但遗憾的是,目前预调页的成功率仅约50﹪。故这种策略主要用于进程的首次调入时,由程序员指出应该先调入哪些页。
2)请求调页
- 运行中需要的页面不在内存,便立即提出请求,由OS将其调入内存。
- 优点:由请求调页策略所确定调入的页,一定会被访问;比较容易实现。
- 缺点:每次仅调入一页,需花费较大的系统开销,增加了磁盘的I/O的启动频率。
当进程在运行中需要访问某些部分程序和数据时,若发现其所在的页面不在内存,便立即提出请求,由OS将其所需的页面调入内存。由请求调页策略所确定调入的页,是一定会被访问的,再加上请求调页策略比较易于实现,故在目前的虚拟存储器中大多采用此策略。但这种策略每次仅调入一页,故须花费较大的系统开销,增加了磁盘I/O的启动频率。
(2)何处调入页面
1)在请求分页系统中的外存分为两部分:
用于存放文件的文件区和用于存放对换页面的对换区。 通常,由于对换区是采用连续分配方式,而事件是采用离散分配方式,故对换区的磁盘I/O速度比文件区的高。
2)三种情况
这样,每当发生缺页请求时,系统应从何处将缺页调入内存,可分成如下三种情况: ① 系统拥有足够的对换区空间: 这时可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,便须将与该进程有关的文件,从文件区拷贝到对换区。 ② 系统缺少足够的对换区空间: 这时凡是不会被修改的文件,都直接从文件区调入;而当换出这些页面时,由于它们未被修改而不必再将它们换出,以后再调入时,仍从文件区直接调入。但对于那些可能被修改的部分,在将它们换出时,便须调到对换区,以后需要时,再从对换区调入。 ③ Linux方式: Linux使用请求调页把可执行映像装入进程虚拟内存中。每当一个命令被执行时,包含该命令的文件被打开,它的内容被映射到进程虚拟空间。这是通过修改描述进程内存映射的数据结构来完成的,被称作“内存映射”。然后,只有映像的开始部分被实际装入物理内存,映像其余部分留在磁盘上。随着进程的执行,它会产生页故障, Linux使用进程内存映射以决定映像的哪一部分被装入内存去执行。
3)简而言之
外存分为2部分:文件区、对换区
- 系统拥有足够的对换区空间:对换区;
- 系统缺少足够的对换区空间:文件区、对换区;
- Linux:首次->文件区>再请求调入->对换区。
六、请求页式管理
在请求式分页存储管理的地址重定位时,可能会出现所需页面不在主存的情况,此时,系统必须解决以下两个问题: (1)当程序要访问的某页不在内存时,如何发现这种缺页情况?发现后应如何处理? 答:缺页中断。 (2)当需要把外存上的某个页面调入内存时,此时内存中没有空闲块应怎么办? 答:置换(这里就需要置换算法)。 (1)缺页(命中):缺页中断 、保护现场 、调页 、恢复现场。命中就是内存中已有。 (2)置换:内存分配块数不够用,需要选择页面进行淘汰。
1.请求页式管理中的硬件支持
(1)页表机制
请求页式管理的页表机制其实是在纯分页的页表机制上增加若干项而形成的,作为请求分页的数据结构。
页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
---|---|---|---|---|---|
各字段说明如下: 状态位P:用于表示该页是否已调入内存,供程序访问时判断是否应该产生缺页中断。 访问位A:用于记录本页在一段时间内被是否访问过,或记录本页最近已有多长时间未被访问,供选择换出页面时参考。 修改位M:表示该页在调入内存后是否被修改过。由于内存中的每一页都在外存上保留一份副本,因此,若未被修改,在置换该页时就不需再将该页写回到外存上,以减少系统的开销和启动磁盘的次数;若已被修改,则必须将该页重写到外存上,以保证外存中所保留的始终是最新的副本。简言之,M位供置换页面时,判断是否需要写回到磁盘。 外存地址:用于指出该页在外存上的地址,通常是磁盘的扇区号,供调入该页时寻找外存上的页面时使用。
(2)缺页中断机构
每当所访问的页面不在内存,便产生一 缺页中断,请求os将所缺的页 调入内存。
(3)地址变换机构
同样是在纯分页地址变换机构的基础上发展形成的。
请求页式地址变换.png