《现代操作系统(中文第四版)》课后习题答案 第三章 内存管理

题目略
如有错误答案,请各位评论指出,多谢多谢

1、答:首先,需要特殊的硬件来进行比较,而且它必须很快,因为它用于每个内存引用。第二,使用4位键,一次只能在内存中存储16个程序(其中一个是操作系统)。

2、答:这是一个巧合。基址寄存器的值为16384是因为程序恰好在地址16384上加载。程序可以在任何地方加载。界限寄存器为16384是因为程序具有16384字节的长度。程序可以有任意的长度。加载地址与程序长度相等仅仅是一种巧合。

3、答:由题意得,读或写每个字节需要10/4 = 2.5ns,4GB = 410241024*1024字节 = 2^32字节,内存紧缩时,几乎整个内存都必须复制,也就是要求读出每一个内存字,然后重写到不同的位置。因此,对于每个字节的压缩需要 5ns。故总共需要的时间为 2^32×5 ns 。

4、第一次安装需要20 MB、10 MB、18 MB。最佳匹配需要12 MB、10 MB和9 MB
。最差的匹配需要20 MB、18 MB和15 MB。下一个匹配需要20 MB,18MB和9MB。

5、实际内存使用物理地址。这些是内存芯片在总线上对其做出反应的数字。虚拟地址是指进程的地址空间的逻辑地址。因此,具有32位字的计算机可以生成高达4 GB的虚拟地址,而不管该计算机的内存是否大于或小于4 GB。

6、对于4kb的页面大小,(page,offset)对是(4, 3616),(8,0)和(14,2656)。对于8kb的页面大小,它们是(2, 3616)、(4、0)和(7,2656)。

7、 (a) 8212. (b) 4100. © 24684.

8、他们建造了一个MMU,把它插在8086和总线之间。因此,所有8086个物理地址作为虚拟地址进入MMU。然后,MMU将它们映射到物理地址上,并发送到总线上。

9、需要有一个MMU可以将虚拟页重新映射到物理页。此外,当引用当前未映射的页时,需要有一个陷阱到操作系统,以便它可以获取该页。

10、如果智能手机支持多道程序设计,iPhone、Android和Windows手机都支持多道程序设计,那么就支持多个进程。如果进程分叉,并且页在父进程和子进程之间共享,那么在写时复制就非常有意义。智能手机比服务器小,但在逻辑上并没有什么不同。

11、这些尺寸
(a)m必须至少为4096,以确保每次访问元素x时都会出现TLB错误。由于n只影响访问x的次数,因此n的任何值都可以。
(b)m应至少为4096,以确保对x元素的每次访问都会导致tlb丢失。但现在n应大于64k以破坏tlb,即x应超过256kb。

12、所有进程的虚拟地址空间总和是nv,所以页面需要这么多的存储空间。但是,数量r可以在RAM中,因此所需的磁盘存储量仅为nv−r。这个数量远远超过实践中所需的数量,因为实际上很少会有n个进程在运行,甚至更罕见的是,所有进程都需要最大允许虚拟内存。

13、每k条指令出现一个页面错误会给av erage增加N/Kμsec的额外开销,因此平均指令需要1+N/K n sec。

14、页表包含2 32/2 13个条目,即524288。加载页表需要52毫秒。如果一个进程得到100毫秒,那么它包含52毫秒(用于加载页表)和48毫秒(用于运行)。因此,52%的时间用于加载页表。

15、在这种情况下:
(A)由于页码字段中有36=48−12位,因此我们需要为每一页输入一个条目,或2个24=16×1024×1024条目。
(b)指令地址将在TLB中达到100%。在程序移到下一个数据页之前,数据页的命中率将为100。因为一个4kb页面包含1024个长整数,所以每1024个数据引用就有一个TLB未命中和一个额外的内存访问。

16、TLB的命中率为0.99,页表的命中率为0.0099,页错误的命中率为0.0001(即,10000个引用中只有1个会导致页错误)。NSEC中的有效地址转换时间为:
0.99×1+0.0099×100+0.0001×6×10 6≈602个时钟周期。
请注意,有效地址转换时间非常高,因为它以页面替换时间为基础,即使在10000个引用中只发生一次页面错误。

17、考虑一下,
(A)多级页表减少了由于其层次结构而需要在内存中的页表的实际页数。事实上,在一个具有大量指令和数据位置的程序中,我们只需要顶层页表(一页)、一个指令页和一个数据页。
(b)为三页字段中的每个字段分配12位。“偏移”字段需要
14位到地址16KB。它为页字段留下24位。因为每个
条目为4字节,一页可容纳2个12页的表条目,因此-
需要12位来索引一页。所以为每个页面分配12位
字段将寻址所有2个38字节。

18、虚拟地址从(pt1,pt2,offset)更改为(pt1,pt2,pt3,offset)。但是虚拟地址仍然只使用32位。虚拟地址的位配置从(10、10、12)变为(2、9、9、12)。

19、20位用于虚拟页码,剩下12位用于偏移。这将生成一个4-kb的页面。虚拟页的20位意味着2个20页。

20、对于一级页面表,需要2 32/2 12或1百万页。因此,页表必须有1百万个条目。对于两级分页,主页表有1K个条目,每个条目都指向第二页表。只使用其中两个。因此,总共只需要三个页表条目,一个在顶层表中,一个在底层表中。

21、代码和引用字符串如下:

LOAD 6144,R0 1(I), 12(D)
PUSH R0 2(I), 15(D)
CALL 5120 2(I), 15(D)
JEQ 5152 10(I)

22、有效指令时间为1h+5(1-h),其中h为命中率。如果我们把这个公式与2相等,并求出h,我们发现h必须至少是0.75。

23、联想存储器本质上是将一个键与多个寄存器的内容同时进行比较。对于每个寄存器,必须有一组比较器将寄存器内容中的每个位与要搜索的键进行比较。实现这种器件所需的门(或晶体管)的数量是寄存器数量的线性函数,因此,线性地扩展设计是必要的。

24、有8kb的页面和48位的虚拟地址空间,虚拟页面的数量为248/213,即235(约340亿)。

25、主存储器有2 28/2 13=32768页。32K哈希表的平均链长度为1。要低于1,我们必须转到下一个大小,65536个条目。将32768个条目分布在65536个表槽上将得到0.5的平均链长度,从而确保快速查找。

26、这可能是不可能的,除非程序的执行过程在编译时是完全可预测的,这种情况不常见,也不是非常有用。如果编译器收集有关过程调用代码中位置的信息,则可以在链接时使用此信息重新排列对象代码,使过程靠近调用它们的代码。这将使过程更可能与调用代码位于同一页上。当然,对于程序中许多地方调用的过程来说,这并没有多大帮助。

27、在这种情况下
(a)除非页面帧数为512,即整个序列的长度,否则每个引用都会出现页面错误。
(b)如果有500帧,将第0-498页映射到固定帧,只改变一帧。

28、FIFO的page frames如下

x0172333300
xx017222233
xxx01777722
xxxx0111177

LRU的page frames

x0172327103
xx017232710
xxx01773271
xxxx0111327

29、在本例中,将选择0位的第一页。

30、计数器如下

Page 0: 0110110
Page 1: 01001001
Page 2: 00110111
Page 3: 10001011

31、顺序:0,1,2,1,2,0,3。在LRU中,第1页将替换为第3页。在时钟中,将替换第1页,因为所有页面都将被标记,并且光标位于第0页。

32、页面的年龄为2204-1213=991。如果τ=400,它肯定不在工作集内,并且最近没有被引用,因此它将被逐出。τ=1000情况不同。现在,页面属于工作集(几乎不属于),因此不会被删除。

33、略

34、考虑一下,
(a)属性为:(FIFO)加载时间;(LRU)最近参考时间;以及(最佳)未来最近参考时间。
(b)有标记算法和替换算法。标签生成算法使用A部分给出的属性标记每个页面。重新放置算法使用最小的标签逐出页面。

35、寻道加旋转延迟为10毫秒。对于2-kb页面,传输时间约为0.009766毫秒,总计约为10.009766毫秒。加载其中的32页大约需要320.21毫秒。对于4-kb页面,传输时间翻了一番,达到0.01953毫秒,因此每页的总时间为10.01953毫秒。加载其中16页大约需要160.3125毫秒。对于如此快速的磁盘,最重要的是减少传输的数量(或者将页面安全地放在磁盘上)。

36、NRU删除第2页。FIFO删除第3页。LRU删除第1页。第二次机会删除第2页。

37、共享页面会带来各种复杂情况和选项:
(a)如果进程B永远无法访问共享页,或者在再次换出该页时访问该页,则该进程B的页表更新应延迟。不幸的是,在一般情况下,我们不知道B过程将来会做什么。
(B)代价是这种懒惰的页面错误处理会导致更多的页面错误。每个页面错误的开销在确定此策略是否更有效方面起着重要作用。(顺便说一下:这个成本与支持某些UNIX fork系统调用实现的copy-on-write策略所面临的成本相似。)

38、片段B是因为代码比片段A具有更多的空间位置。对于外部循环的其他迭代,内部循环只会导致一个页面错误。(只有32个页面错误。)除此之外(片段A):由于一个帧是128个字,X数组的一行占据了一页的一半(即64个字)。整个数组适合64×32/128=16个帧。对于给定的列,代码的内部循环将逐步通过连续的x行。因此,其他对x[i][j]的引用都会导致页面错误。页面错误总数为64×64/2=2048。

39、当然可以。
(a)这种方法与在智能手机中使用闪存作为寻呼设备有相似之处,但现在虚拟交换区是位于远程服务器上的RAM。虚拟交换区域的所有软件基础设施都必须开发出来。
(b)注意到磁盘驱动器的访问时间在毫秒范围内,而通过网络工作连接的RAM的访问时间在微秒范围内(如果软件开销不太高),这种方法可能是值得的。但是,只有在服务器场中有大量空闲RAM的情况下,这种方法才有意义。另外,还有可靠性的问题,因为RAM是不稳定的,如果远程服务器发生故障,虚拟交换区就会丢失。

40、PDP-1寻呼鼓具有无旋转延迟的优点。每次将内存写入磁鼓时,这节省了半个旋转。

41、文本为8页,数据为5页,堆栈为4页。程序不适合,因为它需要174096字节的页面。对于512字节的页面,情况不同。这里的文本是64页,数据是33页,堆栈是31页,共有128512字节的页,这是合适的。对于较小的页面大小,可以,但对于较大的页面则不行。

42、程序将出现15000页错误,每一页都需要2毫秒的额外处理时间。总的来说,页面错误开销是30秒。这意味着,在使用的60秒中,一半用于页面错误开销,另一半用于运行程序。如果我们用两倍的内存运行程序,我们会得到一半的内存页错误,并且只有15秒的页错误开销,所以总运行时间将是45秒。

43、如果程序不能修改,它对程序有效。如果无法修改数据,则它适用于数据。然而,程序不能被修改是很常见的,而且很少有数据不能被修改。如果二进制文件上的数据区域被更新的页面覆盖,那么下次程序启动时,它将没有原始数据。

44、指令可能跨过页面边界,导致两个页面错误,只是为了获取指令。提取的单词也可以跨越页面边界,再生成两个错误,总共四个。如果字必须在内存中对齐,则数据字只能导致一个错误,但在某些计算机(包括x86)上,在具有4-kb页的计算机上加载地址4094处的32位字的指令是合法的。

45、当最后一个分配单元未满时,会发生内部碎片。当两个分配单元之间的空间被浪费时,就会发生外部碎片。在寻呼系统中,最后一页中浪费的空间会因内部碎片而丢失。在纯分割系统中,各分割段之间的空间总是会丢失。这是由于外部碎片造成的。

46、搜索键同时使用段号和虚拟页号,因此可以在单个匹配中找到准确的页。

47、略

48、当所有应用程序的内存需求都是众所周知和受控的时,不需要常规的虚拟内存支持。例如智能卡、专用处理器(如网络处理器)和嵌入式处理器。在这种情况下,我们应该始终考虑使用更真实的内存的可能性。如果操作系统不需要支持virtu-al内存,那么代码将更简单、更小。另一方面,尽管设计要求不同,但从虚拟内存中获得的一些想法仍可能得到有益的利用。例如,程序/线程隔离可能是分页到闪存。

49、这个问题解决了虚拟机支持的一个方面。最近的诱惑包括denali、xen和vmware。基本的障碍是如何实现接近本机的性能,也就是说,好像执行的操作系统本身有内存。问题是如何快速切换到另一个操作系统,因此如何处理TLB。通常,您希望为每个内核提供一些TLB条目,并确保每个内核在其适当的虚拟内存上下文中运行。但是,有时硬件(例如,一些英特尔架构)想要在不知道您要做什么的情况下处理TLB遗漏。因此,您需要在软件中处理TLB丢失,或者提供硬件支持,用上下文ID标记TLB条目。

你可能感兴趣的:(计算机系统)