操作系统第5章存储器管理习题与解答.docx
《操作系统第5章存储器管理习题与解答.docx》由会员分享,可在线阅读,更多相关《操作系统第5章存储器管理习题与解答.docx(31页珍藏版)》请在冰豆网上搜索。
操作系统第5章存储器管理习题与解答
第5章存储器管理习题与解答
5.2例题解析
例5.2.1为什么要引入逻辑地址?
解引入逻辑地址有如下原因:
(1)物理地址的程序只有装入程序所规定的内存空间上才能正确执行,如果程序所规定内存空间不空闲或不存在,程序都无法执行;
(2)使用物理地址编程意味着由程序员分配内存空间,这在多道程序系统中,势必造成程序所占内存空间的相互冲突;
(3)在多道程序系统中,程序员门无法事先协商每个程序所应占的内存空间的位置,系统也无法保证程序执行时,它所需的内存空间都空闲。
(4)基于上述原因,必须引入一个统一的、在编程时使用的地址,它能够在程序执行时根据所分配的内存空间将其转换为对应的物理地址,这个地址就是逻辑地址。
(5)逻辑地址的引入为内存的共享、保护和扩充提供方便。
例5.2.2静态重定位的特点有哪些?
(1)实现容易,无需增加硬件地址变换机构;
(2)一般要求为每个程序分配一个连续的存储区;
(3)在重定位过程中,装入内存的代码发生了改变;
(4)在程序执行期间不在发生地址的变换;
(5)在程序执行期间不能移动,且难以做到程序和数据的共享,其内存利用率低。
例5.2.3动态重定位的特点有哪些?
(1)动态重定位的实现要依靠硬件地址变换机构,且存储管理的软件算法比较复杂;
(2)程序代码是按原样装入内存的,在重定位的过程中也不发生变化,重定位产生的物理地址存放在内存地址寄存器中,因此不会改变代码;
(3)同一代码中的同一逻辑地址,每执行一次都需要重位一次;
(4)只要改变基地址,就可以很容易地实现代码在内存中的移动;
(5)动态重定位可以将程序分配到不连续的存储区中;
(6)实现虚拟存储器需要动态重定位技术的支持;
尽管动态重定位需要硬件支持,但他支持程序浮动,便于利用零散的内存空间,利于实现信息共享和虚拟存储,所以现代计算机大都采用动态重定位。
例5.2.4装入时动态链接的优点有哪些?
(1)便于软件版本的修改和更新
在采用装入时动态链接方式时,要修改或更新各个目标模块,是件非常容易的事,但对于经静态链接以装配在一起的装入模块,如果要修改或更新其中的某个目标模块时,则要求重新打开装入模块,这不仅是低效的,而且对于普通用户是不可能的。
(2)便于实现目标模块共享
若采用装入时动态链接方式,OS能够将一个目标模块链接到几个应用程序中去。
即实现多个应用程序对该模块的共享;然而,采用静态链接方式时每个应用模块都必须含有该目标模块的拷贝,则无法实现共享。
例5.2.5覆盖技术与虚拟存储技术有何本质不同?
交换技术与虚存中使用的调入调出技术有何相同和不同之处?
解覆盖技术与虚拟存储技术的本质不同是:
(1)虚拟存储器对于程序员时透明的,不需要程序员了解程序结构、覆盖的区域、时机,不需要精心的设计程序及其数据结构,所有的操作由操作系统自动完成。
(2)覆盖的程序段的最大长度要受到物理内存容量的限制,而虚拟存储器的最大长度不受物理内存容量的限制,只受计算机地址结构的限制。
交换技术与虚存中使用的调入调出技术相同和不同之处:
(1)主要相同点是都要在内存与外存之间交换信息;
(2)主要区别在于交换技术换出换进一般是整个进程(proc结构和共享正文段除外),因此一个进程的大小受物理存储器的限制;而虚存中使用的调入调出技术在内存与外存之间来回传递的是存储页或存储段,而不是整个进程,从而使得进程映射具有了更大的灵活性,且允许进程的大小比可用的物理存储空间大的多。
例5.2.7有一计算机系统,内存容量为512K,辅存容量为2G,逻辑地址形式如下:
段号段内地址
2920190
求其虚拟存储器的实际容量?
解虚拟内存的实际大小由系统的逻辑地址结构、主存辅存容量共同决定。
虚拟内存容量的理论值是210*220=1G;最大段内地址为220=1M,远大于内存容量,其段长超过512K的内存容量,故最大实际段长为512k而不是1M。
所以可计算虚拟存储容量为210*512K=210*0.5M=0.5G。
0.5G<2G,因此虚拟存储器的实际容量是0.5G。
例5.2.8段页式存储系统中,为了获得一条指令或数据,需几次访问内存?
解在段页式系统中,为了获得一条指令或数据,需三次访问内存。
第一次访问,是访问内存中的段表,从中取得页表始址;第二次访问,是访问内存中的页表,从中取出逻辑页面对应的内存物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问,才是真正从第二次访问所得的地址中,取出指令或数据。
例5.2.9在实存管理上,管理方法主要分成哪两种类型?
解实存管理的方法主要分成:
(1)用户程序需要占用连续的内存空间,如分区存储管理;
(2)用户程序不需要占用连续的内存空间,如分页、分段、段页等管理,一个用户程序在内存可能是不连续的,如果它有不只一页或一段的话。
例5.2.10解释静态链接、装入时动态链接和执行时动态链接的不同。
解“链接”(link),本应是编译系统的任务,但是,随着程序执行方式的改进,当出现了“动态链接”之后,“程序链接”就不仅仅是编译系统的事情,它还需要OS的支持。
程序的静态链接,指的是在程序装入内存之前,由链接程序将已编译好的多个目标模块(.obj文件)链成一个统一的可执行文件。
其特点是:
①链接好的可执行文件可以重复使用和执行;②被链接的模块一般不可能再拆开,因而不便修改和更新;③不便于多个程序共享某些模块,需使用同一模块的多个程序需分别将该模块链入自己的程序空间。
装入时动态链接,指的是在程序加载入内存(准备执行)时,由OS中的装入程序(如exec())将存放在盘上的诸多目标模块边装入边在内存链接成一个统一的可执行程序。
其特点是:
①链接好的可执行程序只存在于内存,因而每次执行都要重新链接;②被链接的诸目标模块在盘上是各自独立存放的,因而便于修改;③便于共享,当多个程序需使用同一模块时,该模块在内存只需一个副本。
执行时动态链接,是把程序的链接推迟到程序执行时根据执行的需要动态地装入和链接。
它除了有与“装入时动态链接”相同的特点外,还有一个显著的特点,是不会将本次执行中不需要的模块(如错误处理模块)装入内存,从而减少时空开销。
当然,它也增加了链接的复杂性,且需要一定的硬件支持。
动态链接需要OS的支持和服务。
例5.2.11说明静态重定位和动态重定位的区别。
解“重定位”,在实际上指的是这样相互联系的两件事情:
一是确定一个待执行程序在内存中的位置;二是将程序中的逻辑地址转换成物理地址。
说它们是相互联系的,是因为后一件事情是由前一件事情决定的。
静态重定位,指的是在程序装入时实现的重定位。
具体的讲,就是将程序装入内存后,立即根据其装入位置将程序中需重定位的逻辑地址转换成物理地址,包括指令地址、数据地址、子程序入口地址等。
这种“定位”的特点是“定位”之后,内存中的代码发生了变化,程序不能在内存移动,CPU按物理地址运行程序。
动态重定位,是在程序执行的过程中,根据执行的需要动态地装入、链接和定位。
它不是根据程序在内存的位置立即将指令和数据的逻辑地址转换成物理地址,而是把这种位置信息送入一个称之为“地址映射机构”的硬件中,然后,CPU按逻辑地址执行程序。
在执行中,由“映射机构”将逻辑地址及时地转换成正确的访存物理地址。
这种定位方法的主要特点是重定位后,内存中的代码没有发生了变化,允许程序在执行的过程中在内存移动位置,这只要更换“映射机构”中的启址信息就可将同一程序映射到内存不同的地方。
这种位置移动对提高内存空间的利用率是有好处的。
例5.2.12存储空间分配的“边界要求”是什么意思?
为什么有的系统有这种要求?
解空间分配的“边界要求”,指的是要求所分得的空间的起始地址落在所分得空间的大小的整数倍上。
例如,若要求分一个4K大的空间,则实际分得的空间的起始地址应是0,4K,8K,12K,…;有的系统之所以有这种要求,主要是为了便于机器的判断和管理。
例如,在分页存储管理系统内,每一个页面在内存的起始地址都应是页面大小的整数倍,这样才能正确地将一个地址划分成页号和页内位移量两部分,并正确地实现分页管理下的地址映射;又如,若为一个数组分配空间,则所分空间的起始地址也应落在数组元素个数(假定一个元素需要偶数个字节)的整数倍上,这样就可以根据当前地址算出当前处理的是第几个元素,并且,当数组中的所有元素都处理一遍后,此时地址的低部分会与数组起始地址的低部分相同,这样,机器就很容易判断该数组已处理完一遍。
例5.2.13为什么在分页和分段管理下取一条指令或一个操作数通常需两次访存?
如何解决这一问题?
解这是因为用于地址变换的页表或段表也是存放在内存的,为了将CPU给出的逻辑地址变成物理地址,首先就要访问内存的页表和段表,然后,根据形成的物理地址再取指令或数据,这就要两次访存。
解决这一问题的办法是提供一个称之为“快表”的硬件,用以存放当前运行进程的页表或段表的部分内容,“快表”的访问时间很快,因此可以节约访问页表和段表的时间。
存储器访问具有时间和空间的“局部性”,因此快表的命中率一般可达70%到90%;页表和段表是在系统执行过程中,每时每刻都需要访问的,因此,访问时间的微小缩短,其累计节约的时间却可以达到很大。
例5.2.14在分页存储管理系统中,存取一次内存的时间是8us,查询一次快表的时间是1us,缺页中断的时间是20us,假设页表的查询与快表的查询同时进行。
当查询页表时,如果该页在内存但快表中没有页表项,系统将自动把该页页表项送入快表。
(1)求对某一数据进行一次次存取可能需要的时间?
(2)现连续对同一页面上的数据进行4次连续读取,求每次读取数据可能需要的时间?
解
(1)当系统对数据进行存取时,有3种可能性。
①所存取的数据的页面在内存,其页表项已经存储到快表,此时存取数据的时间是:
查询快表的时间+存取内存数据的时间=1us+8us=9us
②所存取的数据的页面在内存,但是其页表项没有存储到快表,没有命中快表,此时存取数据的时间是:
查询页表的时间+存取内存数据的时间=8us+8us=16us
③所存取的数据的页面不在内存,发生缺页中断,此时存取数据的时间是:
查询页表的时间+缺页中断的时间+查询页表的时间+
存取内存数据的时间=8us+20us+8us+8us=44us
(2)当对某一数据进行4次连续读取时:
①第1次可能的时间为:
1us+8us=9us;8us+8us=16us;8us+20us+8us+8us。
②第2次时,对应页面的页表项已经交换到快表中。
因为存取是连续的,不存在页面被淘汰的可能性,所以第2次、第3次、第4次的存取时间是一样的,消耗的时间为1us+8us=9us。
例5.2.15为什么说分段系统较之分页系统更易于实现信息共享和保护?
如何实现。
解
(1)在分页和分段存储管理系统中,多个进程并发运行,共享同一内存块里的程序或数据是可行的。
为了实现共享,必须在各共享者的段表或页表中分别有指向共享内存块的表目。
(2)对分段式系统,被共享的程序或数据可作为单独的一段。
在物理上它是一段,在不同的进程中,可以对应不同的逻辑段,相对来说比较易于实现。
(3)对分页管理,则要困难的多。
首先,必须保证被共享的程序或数据占有整数块,以便与非共享部分分开。
其次,由于共享程序或数据被多个进程访问,所以每个进程对共享程序或数据的访问都应该是有限制条件的。
(4)因此,从共享和保护的实现上来看,须共享的程序段或数据段是一个逻辑单位,而分段存储管理中被共享的程序或数据作为一个整体(一段),实现共享和保护就要方便得多。
(5)分段系统的共享是通过两个(或多个)进程的段表之相应表目都指向同一个物理段,并设置共享计数来实现的。
每段设置访问方式,就可以实现段的保护。
例5.2.16为什么分段管理下的程序共享和保护比分页管理更有意义?
解主要是因为段是一个有意义的逻辑整体,如主程序、子程序、数据表格、工作空间等,就如书本上的一章或一个自然段。
而页只是一个物理尺寸,不一定有完整的意义,如书本上的一页。
程序共享当然希望被共享的对象是一个有意义的整体,如一个子程序;至于程序保护,指的是每个进程都应按所拥有的存取权访问不同的程序,而存取权(R,W,E等)当然对一个有完整意义的对象才更有意义。
所以就共享和保护而言,分段管理比分页管理更有意义。
例5.2.17虚存与单、多道程序设计,程序重定位,程序动态链接以及覆盖和交换技术之间有什么关系?
解从原理上讲,单道程序设计系统也可实现虚存管理,但从实际上看,虚存主要是应用在多道程序设计系统中。
虚存的实现需要程序的动态重定位技术的支持,因为程序的对换会导致同一部分程序多次进出内存并有可能在内存中不断地移动位置。
虚存与程序的动态链接没有必然的因果关系,但程序的动态链接可以避免无用的程序进入内存,使虚存的效率提高实现;
虚存需要覆盖和交换技术的支持,但覆盖和交换与虚存是不同的概念。
在实存管理下覆盖和交换是一种可以节省内存的技术,对用户是不透明,覆盖和交换的区由程序结构和程序员决定。
而在虚存下的交换和覆盖对程序员是透明的,操作是由OS根据某种算法决定的。
例5.2.18说明什么是置换算法的异常现象,为什么LRU算法不会有异常现象?
解页面置换算法的异常现象,也叫Belady异常,是在局部置换前提下的一种现象。
所谓局部置换,指的是当一进程创建时,分给其一定数量的页面(例如8页),然后,在运行过程中,若该进程需调入新页且须置换一个页面时,则只能置换其自己的一个页面而不能置换别的进程的页面。
页面置换的异常现象,是指在一定置换算法和一定页面走向下,分给进程的页面数增多其页面失效率反而增加这样一种情况。
这种异常,只在一定的算法和一定的页面走向下才会出现。
许多算法,如OPT.和LRU,在任何情况下都不会有异常现象。
LRU之所以不会有“异常”,是因为最近的过去使用的n个页面一定在最近的过去使用的n+1个页面之中。
例5.2.19什么是抖动现象?
如何消除这种现象?
解抖动现象,是在虚存管理下,用于页面(在内、外存之间)对换的时间比程序的有效运行时间还要多的这样一种现象。
它可以是一进程内部的局部性抖动,也可以是整个系统的全局性抖动。
造成这种情况固然与置换算法和页面走向有关,但其根本原因是多道系统内的进程数太多,从而分给每个进程的页面数太少。
因此,解决这一问题的最有效的办法是减少系统内的进程数。
Denning于1980年提出了“L=S准则”,即调整系统内的进程数,使得产生缺页的平均间隔时间(L)等于系统处理进程缺页的平均时间(S)。
理论和实践表明,此时的CPU利用率最高。
例5.2.20有这样一种页面置换算法,它给每一个内存块(块与页大小相等)设置一个计数器,以计数曾经装入过该块的页面数。
当需要置换一个页面时,该算法总是将其计数值最小的那个块内的页面换掉,当有多个最小值时,按FIFO执行。
若某进程分得4个内存块,现对1、2、3、4、5、3、4、1、6、7、8、7、8、9、7、8、9、5、4、5、4、2,解答如下问题:
(1)求在上述算法下的页面失效数;
(2)求在OPT.算法下的页面失效数。
解
(1)求解过程如下表所示
页面号√
1√
2√
3√
4√
5
3
4√
1√
6√
7√
8
7
8√
9
7
8
9√
5√
4
5
4√
2
B11111555555888888888882
B222222211111199999999
B33333336666666665555
B4444444777777777444
C11111222222333333333334
C2011111122222233333333
C30011111122222222233333
C40001111112222222223333
注:
打“√”的表示缺页,共有13次缺页。
说明:
在上面的求解过程中,B1~B4表示进程分得的4个块号,C1~C4表示与这4块对应的计数器;表中的每一列记录了每一块当前装入的页面及其计数器的值。
(2)在OPT.算法下的页面失效次数为11。
例5.2.20在可变分区分配的存储管理方案中,基于链表的存储分配算法有哪几种?
它们的思想是什么?
解:
在可变式分区分配的存储管理方案中,基于链表的存储分配算法主要有三种:
首次适应算法、循环首次适应算法和最佳适应算法。
(1)首次适应算法
在首次适应算法中,每个空白区按其位置的顺序链在一起,即每个后继的空白区其起始地址总是比前者的大。
当系统要分配一个存储块时,就按照空白块链的顺序,一次查询,直到找到第一个满足要求的空白块为止。
由这种算法确定的空白块其大小不一定刚好满足要求。
如果找到的这个空白区比要求的大,则把它分成两个分区,一个为已分配分区,其大小刚好等于所要求的;另一个仍然为空白块,且留在链中原来的位置上。
若是在空白链中从头到尾找一遍,找不到满足要求的空白块,则返回“暂不能分配”。
系统在回收一个分区时,首先检查该分区是否有邻接的空白块,如果有,则应将这个分区与之合并,并将该空白块保留在链中原来的位置。
如果回收的分区不和空白块邻接,则应根据其起始地址大小,把它插在链中的相应位置上。
首次适应算法的实质是,尽可能地利用存储器低地址部分的空白块,尽量保存在高地址部分的大空白块。
其优点在于:
当需要一个较大的分区时,便有希望找到足够大的空白块以满足要求。
其缺点是:
在回收一个分区时,需要花费较多的时间去查找链表,确定它的位置。
(2)循环首次适应算法
循环首次适应算法与首次适应算法类似,只是在每次分配分区时,系统不是从第一个空白块开始查找,而是从上次分配的空白块处查找。
当查找至链尾时,便从链首继续查找,直到找完整个链表。
在系统回收一个分区时,为了减少在插入一个空白区时查询链表的时间,如果这个分区不和空白块邻接,则把它插入到前向指针链的最后一个空白块后;如果有空白块相邻,则根据情况作相应处理。
由此可见,这些空白块在链中的位置没有一定的规则。
这种循环首次适应算法的实质是,使得小的空白块均匀地分布在可用存储空间内。
这样,当回收一个分区时,它和一个较大空白块相邻的可能性比较大,因而合并后可得到大的空白块。
和首次适应算法相比,它产生过小空白块的现象比较小。
(3)最佳适应算法
在最佳适应算法中,空白块按大小顺序链在一起。
系统在寻找空白块时,总是从最小的一个开始。
这样,第一次找到的满足要求的空白块必然是最适合的,因为它最接近于要求的大小。
这种算法的优点是:
如果存储空间中具有正好是所要求大小的空白块,则必然被选中;如果不存在这样的空白块,也只对比要求稍大的空白块划分,而绝不会去划分一个更大的空白块。
此后,遇到有大的存储要求时,就比较容易满足了。
最佳适应算法的缺点在于:
寻找一个较大空白块时花费的时间较长;回收一个分区时,把它插入到空白块链中合适的位置上也较为费时;此外,由于每次都划分一个与要求大小最接近的空白块,使得系统中小的空白块较多。
其实质是,在系统中寻找与要求的空间大小最接近的一个空白块。
例5.2.21在虚拟页式存储系统为什么要引入缺页中断?
缺页中断实现由哪几部分组成,并分别说明其实现方法。
解页式虚存管理是在页式存储管理的基础上实现虚拟存储器的,作业在执行时并不是所有的页均放在主存,若欲访问的页面不在主存,则须由操作系统把当前所需页面从辅存装入主存。
这一过程就交由中断系统完成,称为缺页中断。
缺页中断由缺页处理和页淘汰组成,缺页处理过程如下:
(1)中断触发:
在地址变换过程中,当查询页表时,发现逻辑页面不在内存,即其状态位为0,则发生缺页中段。
(2)页面调入:
OS在页表中找到对应页面的辅存地址,进行页面的淘汰,将所缺页调入内存;
(3)修改页表:
将该页面的内存地址填入页表,修改状态位为1;
缺页中断结束,恢复现场,重新执行指令。
页面淘汰处理如下:
(1)如果内存有空闲的页面,直接调入外存的页面,修改页表;
(2)如果内存没有空间,根据页面淘汰算法,在内存中找到可淘汰的页面;
(3)如果被淘汰页面修改位为0,则直接调入外存页面将其覆盖,修改页表;
(4)如果被淘汰页面修改位为1,则要申请一块交换空间,将该内存的内容保存到交换区中,然后将辅存的页面调入其中,修改页表。
例5.2.22何谓虚拟机存储器,并举一例说明操作系统如何实现虚拟内存的?
解虚拟存储器通过把主、辅存统一起来管理,给用户造成一种仿佛系统内有巨大主存供用户使用的假象。
例如页式存储管理,一道作业被划分成若干页,其中较活跃的几页放在内存,而其余不活跃的页被放在辅存,当需要访问辅存内的页时,就可通过页面调度将其调入内存运行;但用户感觉不到这种变化,他会以为作业的所有部分都存在于主存。
这样可以让更多的作业进入主存,提高系统的效率。
例5.2.23在内存管理中,“内零头”和“外零头”各指的是什么?
在固定式分区分配、可变式分区分配、页式虚拟存储系统、段式虚拟存储系统中,各会存在何种零头?
为什么?
解内零头(又称内部碎片):
给一个作业分配的存储单元长度为n,该块存储的作业长度为m,则剩下的长度为(n-m)的空间,成为该单元的内部碎片;若存储单元长度为n,在该系统所采用的调度算法下,较长时间内无法选出一道长度不超过该块的作业,则称该块为外零头(外部碎片)。
在固定式分区分配中两种零头均会存在,因为空间划分是固定的,无论作业长短,存储单元均不会随之变化,若作业短而存储块长则产生内零头,若作业长而存储块短则产生外零头。
在可变式分区分配中只有外零头而无内零头,因为空间划分是依作业长度进行的,是要多少给多少,但剩下的部分太短而无法再分,则称为外零头。
页式虚存中会存在内零头而无外零头,因存储空间与作业均分为等长单元,所以不存在无法分配的单元,但作业长度并不刚好为页面大小的整数倍,因此在最后一页会有剩余空间,即为内零头。
段式虚存中会存在外零头而无内零头,因段式的空间划分类似于可变分区分配,根据段长分配,要多少给多少,但会剩余小空间无法分配,则为外零头。
例5.2.24常用的内存信息保护方法有哪几种?
它们各自的特点是什么?
解常用的内存保护方法有硬件法、软件法和软硬件结合保护法三种。
界地址保护法,即上下界保护法,是一种常用的硬件保护法。
上、下界存储保护技术要求为每个进程设置一对上、下界寄存器。
上、下界寄存器中装有被保护程序和数据段的起始地址和终止地址。
在程序执行过程中,在对内存进行访问操作时,首先进行访问地址合法性检查,即检查经过重定位之后的内存地址是否在上、下界寄存器所规定的范围之内。
若在规定的范围之内,则访问是合法的,否则是非法的,并产生访问越界中断。
保护键法也是一种常用的软件存储保护法。
保护键法为每一个被保护的存储块分配一个单独的保护键。
在程序状态字中设置相应的保护键开关字段,对不同的进程赋予不同的开关代码,与被保护的存储块中的保护键匹配。
保护键可以设置成对读写同时保护的,或只对读写进行单项保护的。
如果开关字段与保护键匹配或存储块未受到保护,则访问该存储块是允许的,否则将产生访问出错