第5章虚拟存储管理本章目录5.1请求页式虚拟存储管理基础5.1.1虚拟存储器5.1.2请求页式虚拟存储管理5.2请求页式的替换策略5.2.1替换策略综述5.2.2请求页式静态替换策略5.2.3关于静态替换策略的进一步讨论5.2.4请求页式动态替换策略5.3请求段式虚拟存储管理5.3.1请求段式虚拟存储管理5.3.2段的动态链接5.4Linux的存储管理5.4.1Linux存储管理的硬件基础5.4.2Linux多级页表的地址转换5.4.3内存空间的管理5.4.4管理虚拟存储空间的数据结构除分支和调用指令,程序的执行都是顺序的。分支和调用指令在所有程序指令中只占很少一部分。大多数情况下,要读取的下一条指令肯定都是紧跟在已取到的上一条指令之后的。5.1请求页式虚拟存储管理基础5.1.1虚拟存储器程序执行的“局部性”原理1.程序执行的“局部性”原理,是指程序在执行的某一时刻,并不是均匀地访问它的整个地址空间,而往往是集中于某一小部分区域。..程序执行的局部性,具体表现在几个方面:(1)(2)程序中很少会出现很长的、一个过程调用接着又一个过程调用的调用序列。在较短的时间内,指令的引用大多局限在很少几个过程中,不会一会儿是这个过程,一会儿是那个过程。(3)大多数循环结构都由较少的几条指令重复若干次组成,循环过程中的计算,也多被限制在程序中的一个很小的相邻部分完成。(4)许多程序中的计算都涉及到对数组、文件记录之类数据的处理,而对这些数据的引用,其实都是对位置相邻的数据项进行操作。虚拟存储器2.程序执行的“局部性”原理给人们重要的启示是:其实程序并不是必须全部都在内存后才能运行,只要关键的那一小部分在内存就可以了。..有了“局部性”原理的支撑,一个新程序运行时,只需把包含程序开始处的一个或几个块(页或段)从磁盘读入内存就行。运行过程中,若对存储器的访问在这些块里,那么通过页表或段表对逻辑地址的动态重定位,执行就可顺利进行。如果CPU需要访问一个不在内存中的逻辑地址,那就产生一个中断,告知CPU对内存的访问出现了故障。这时,操作系统就阻塞正在执行的进程,产生磁盘I/O请求,把包含引起访问故障的那个逻辑地址所在的块取到内存。这样,被阻塞进程就可重新成为就绪状态,继续运行下去。.有了“局部性”原理的支撑,有了操作系统新的工作模式,用户在程序设计时就完全不需要去顾忌内存的大小。这时给程序人员的感觉是,他面对的是一个巨大的“内存储器”,其大小只与磁盘存储器有关。.所谓“虚拟存储器”,实为一种扩大内存容量的软件设计技术,它把辅存作为计算机实际内存的后援,操作系统把当前需要使用的那部分程序、数据等内容读入内存,其他部分保存在磁盘上,必要时由操作系统实施内存和磁盘之间的信息交换。.在虚拟存储意义下,系统向每个用户提供一个虚拟存储器,用户作业的相对地址空间,就是系统提供给他的虚拟存储器。这时称用户作业的相对地址空间为“虚拟地址空间”,里面的相对地址称为“虚拟地址”。虚拟存储要解决的问题3.(1)读取策略所谓“预约式”,是利用磁盘I/O操作中所具有的寻道时间和旋转延迟特性,一次顺序读入后面的多个块,把可能需要的块提前读入供程序使用,这比需要哪块才去读哪块显得更加有效些。.指在程序运行过程中,何时把所需要的块调入内存的策略。.所谓“请求式”,指当访问需要某块里的信息、而这块当时又不在内存时,才把这块从辅存换入内存.放置策略(2).主要是针对请求页式管理的,当要把所需的页面信息从辅存调入内存时,内存必须要有空闲页。放置策略用来决定把所需要的页面存放到内存的哪个空闲页帧去。.所谓“固定”的放置策略,就是静态放置策略,指为作业程序分配固定数目的帧,页面只能存放在这些页帧里;所谓“可变”的放置策略,就是动态放置策略,是指分配给作业程序的页帧随需要不断变化。(3)替换策略.如果放置时内存里没有空闲的区域,那么就必须先要把当前暂时不用的信息从内存替换出去,以便腾出位置进行放置,这是替换策略需要解决的问题。.所谓“局部”替换策略,指只在分配给作业使用的帧里选择替换对象;所谓“全局”替换策略,指把整个内存页帧都作为替换的候选对象,不去管它们属于哪一个作业进程。返回目录1.请求页式虚拟存储管理的基本思想5.1.2请求页式虚拟存储管理作业全部在磁盘,只把要用的若干页面装入页帧。运行时虚拟地址转换成数对:(页号,页内位移)。由页号查页表,若该页在内存某页帧,就得到物理地址,运行继续进行;若该页面不在内存,表示发生了“页面失效”,俗称“缺页”,运行无法继续。此时系统根据所缺页的页号,把它从辅存调入内存,修改页表后,程序在原先暂停处继续运行。.04KB8KB12KB16KB20KB24KB28KB32KB36KB40KB44KB48KB52KB56KB60KB64KB虚拟地址空间虚拟页面21604357XXXXXXXX04KB8KB12KB16KB20KB24KB28KB32KB页帧物理内存空间(a)请求页式的地址映射关系虚拟地址:页号页内位移IM其他控制位页帧号页表项:修改位页面失效位(缺页中断位)图(b)给出了请求页式的虚拟地址和页表项结构和内容。图(a)给出了请求页式存储管理的示意。..(b)请求页式的虚拟地址和页表项在请求页式存储管理中,虚拟地址空间中的虚拟地址仍然是一维的。操作系统把虚拟地址空间按照页帧尺寸划分成若干页面,这样一维的虚拟地址就与一个数对(页号,页内位移)对应了。2.请求页式虚拟存储管理的特点向用户提供虚拟存储器.由于总是把作业的虚拟地址空间存放在磁盘,因此用户的虚拟存储器可以比实际内存大。(1).虚拟存储器的大小由地址结构决定(2).在请求页式存储管理中,向用户提供的虚拟存储器的大小,由其地址结构决定。.比如地址结构为16个二进制位,页帧尺寸是4KB(=212),那么用户作业的虚拟存储器最多可以有16(=24)个页面;若地址结构为20个二进制位,页帧尺寸是4KB,那么用户作业的虚拟存储器最多可以大到有256(=28)个页面。(3)“页面失效”位和“修改”位.“页面失效”位I为“1”,表示对应页面已调入内存的某页帧;如果为“0”,表示对应的页面不在内存(即页面失效),应发出“缺页”中断信号,让操作系统将其调入。.“修改”位M为“0”,表示对应页面在调入到内存页帧后没被修改过;这位为“1”,表示对应页面在调入到内存页帧后被修改过,若要把这页从内存调出(即替换),那就需要用页帧中的内容去更新磁盘上的相应页内容。有时,称修改位为0的页是“干净”的,为1的页是“脏”的。当执行到作业2第0帧中的指令“call8300”时,系统把虚拟地址8300转换成数对:(2,108)。3.请求页式虚拟存储管理的实际运作过程例5-1:一个请求页式存储管理的整个运作过程。346000已分配1已分配2已分配3空闲4已分配5已分配6已分配7空闲8已分配9空闲帧号状态存储分块表0操作系统012114205作业2第0页call8300作业2第1页作业1第0页作业1第1页作业3第0页4KB8KB12KB16KB20KB24KB28KB32KB36KB40KB内存帧1帧0帧2帧3帧4帧5帧6帧7帧8帧9页面表信息长度起址18KB24160212KB3460034KB14820尺寸作业号作业表页表控制寄存器015116PIFPIF217012114205018PIF作业1的页表作业2的页表作业3的页表空闲帧空闲帧空闲帧(a)(b)(c)(d)当系统决定把CPU分配给作业2时,就从作业表中把作业2的页表起址4600和长度3装入页表控制寄存器中。...作业2的第2页不在内存,它的I位(即页面失效位)是0,于是引起“缺页中断”。.把作业2第2页调入内存的第7帧,系统结束缺页中断处理,返回到指令“call8300”处重新执行。.用第7页帧的起址28K加页内位移108,形成虚拟地址8300对应的绝对地址,真正应该执行的指令是:“call(28K+108)”。.请求页式存储管理地址变换的简要流程准备取下一条指令执行指令形成物理地址该页通过读/写保护?出错中断信号NY分析指令,拆分成(p,d)查快表成功?NY查页表,页在内存?NY快表满否?Y按FIFO腾空一个快表表项复制页表项到快表缺页中断缺页中断处理程序内存有空帧?YN按替换策略选一页淘汰修改位为1?NY将淘汰页回写修改淘汰页页表信息调入所需页面修改页表信息硬件处理软件处理中断返回4.页面走向与缺页中断率.每一个虚拟地址都与一个数对(页号,页内位移)相对应,这种动态特征可用程序执行时页号的变化来描述。通常,称一个程序执行过程中页号的变化序列为该作业的“页面走向”。.LOAD1#,1120200010000100104108ADD1#,2410STORE1#,11241KB112011242KB24103KB虚拟存储器第0页第1页第2页LOAD1#,1120200010000100104108ADD1#,2410STORE1#,11241KB112011242KB24103KB虚拟存储器第0页第1页第2页3000(a)(b)LOAD1#,11200100104108ADD1#,2410STORE1#,1124(0,100)112011242410用户作业程序(页号,页内位移)虚拟地址页面走向(c)(1,96)(0,104)(2,354)(0,108)(1,100)10201图(a)给出一个用户作业的虚拟地址空间,里面有3条指令。.运行结果如图(b)所示,在虚拟地址1124中有结果3000。.该程序运行时,虚拟地址的变化情形如图(c)第2栏“虚拟地址”所示。另一方面,每一个虚拟地址都有一个数对与之对应,如图(c)第3栏所示。把它里面的页号抽取出来,就构成了该程序运行时的页面走向,即如图(c)第4栏所示。把128×128的二维数组元素初始化为“0”。数组中的每个元素占一个字。假定页面尺寸为128字,数组按行的顺序存放,分配给该作业两个内存页帧:一个存放程序,另一个用于数组初始化。作业开始运行时,除程序已在内存页帧外,数据均未进入。编写实现数组元素初始化的程序,运行时会有多少次缺页中断?分配给作业的内存块数:分配给作业的内存块数多,同时能够装入内存的作业页面就多,页面失效的可能性下降,于是发生缺页中断的可能性也就下降。.假定一个作业运行的页面走向中涉及到的页面总数为A,其中有F次页面失效(即缺页),必须通过缺页中断把它们调入内存。我们定义:f=F/A称f为“缺页中断率”。.影响缺页中断次数的因素(1)(2)页面尺寸:页面增大了,在每个页帧里的信息相应增加,缺页的可能性就下降;反之,页面尺寸减少,每帧里的信息减少,缺页的可能性上升。(3)程序的实现:作业程序的编写方法,对缺页中断产生的次数也会有影响。例5-2:程序1:程序2:main()main(){{inta[128][128];inta[128][128];inti,j;inti,j;for(i=0;i128;i++)for(j=0;j128;j++)for(j=0;j128;j++)for(i=0;i128;i++)a[i][j]=0;a[i][j]=0;}}解:返回目录5.2.1替换策略综述对请求页式,若采用的放置策略是局部性的,那么当把所缺的页面从磁盘调入内存时,只能把它们放置在自己有权使用的页帧区域里。当该区域里没有空闲页帧时,就只有把这个区域里暂时不用的页面替换出去,以腾出页帧供放置使用。5.2请求页式的替换策略..所谓“静态”替换策略,指作业运行过程中,分配给它使用的页帧数不变;所谓“动态”替换策略,指作业运行过程中,可根据其需要,增加或减少所使用的页帧数。假定某作业有6个页面:0、1、2、3、4、5,分配给它m=4个页帧。其执行时的部分页面走向R=2,0,3,4,3,2,0,1,1,3,……..开始时,4个页帧都是空闲的。由页面失效通过缺页中断调入页面2、0、3、4时,因有空闲页帧存在,所以不会有替换问题。再往下运行时,由于第3页、第2页、第0页都在页帧里,因此也不会有什么问