现代操作系统 第三章 内存管理 习题答案

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

  2. 这是个意外。基址寄存器是16384,因为程序恰好加载在地址16384。它本来可以放在任何地方。限界寄存器是16384,因为程序包含16384字节。它可以有任何长度。加载地址恰好与程序长度匹配是纯粹的巧合。

  3. 几乎整个存储器都必须被复制,这需要读取每个字,然后在不同的位置重写。 读取4个字节需要4 nsec,因此读取1个字节需要1 nsec,写入需要另外2 nsec,每个字节紧缩总共2 nsec。 这是500,000,000字节/秒的速率。 要复制4 GB(232字节,大约4. 295×109字节),计算机需要232 / 500,000,000秒,大约859毫秒。 这个数字有点麻烦,因为如果内存底部的初始孔是k字节,则不需要复制那些k字节。 但是,如果有许多孔和许多数据段,则孔将很小,因此k将很小并且计算中的误差也会很小。

  4. 首次适配20 MB,10 MB,18 MB。 最佳适配12 MB,10 MB和9 MB。 最差适配20 MB,18 MB和15 MB。 下次适配20 MB,18 MB和9 MB。

  5. 真实内存使用物理地址。 这些是存储器芯片对总线作出反应的数字。 虚拟地址是引用进程地址空间的逻辑地址。 因此,无论机器是否具有比4 GB更多或更少的内存,具有32位字的机器都可以生成高达4 GB的虚拟地址。

  6. 对于4 KB的页面大小,(页面,偏移)对是(4,3616),(8,0)和(14,2656)。 对于8 KB的页面大小,它们是(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应该至少为4,096,以确保每次访问X元素时TLB未命中。但是现在N应该大于64K以使TLB抖动,即X应该超过256 KB。

  12. 组合的所有进程的总虚拟地址空间为nv,因此页面需要大量存储空间。 但是,数量r可以在RAM中,因此所需的磁盘存储量仅为nv-r。 这个数量远远超过实际需要的数量,因为实际上很少会有n个进程在运行,而且几乎不需要所有进程都需要最大允许的虚拟内存。

  13. 每k条指令发生一次页面错误,会给平均值增加额外的n /k μsec开销,因此平均指令需要1+n/ k nsec。

  14. 页表包含232/213个条目,即524,288。 加载页面表需要52毫秒。 如果进程达到100毫秒,则包括用于加载页表的52毫秒和用于运行的48毫秒。 因此,52%的时间用于加载页表。

  15. 在这种情况下:
    (a)我们每页需要一个条目,或224 = 16×1024×1024个条目,因为页码字段中有36 =48-12位。
    (b)指令地址将在TLB中达到100%。 在程序移动到下一个数据页之前,数据页将具有100命中率。 由于4 KB页面包含1,024个长整数,因此每1,024个数据引用将有一个TLB未命中和一个额外的内存访问。

  16. TLB的命中率为0.99,页表为0.0099,页面错误为0.0001(即10,000个引用中只有1个会导致页面错误)。 以秒为单位的有效地址转换时间为:
    0.99*1+0.0099*100+0.00016106≈602个时钟周期。
    请注意,有效地址转换时间非常长,因为即使页面错误仅在10,000个引用中出现一次,它也会受页面替换时间的影响。

  17. 考虑,
    (a)多级页表由于其层次结构,减少了需要在内存中的页面实际页面的数量。 实际上,在具有大量指令和数据局部性的程序中,我们只需要顶级页表(一页),一个指令页和一个数据页。
    (b)为三个页面字段中的每一个分配12位。 偏移字段需要14位来寻址16 KB。 这为页面字段留下了24位。 由于每个条目是4个字节,因此一个页面可以容纳212个页面表条目,因此需要12个位来索引一个页面。 因此,为每个页面字段分配12位将解决所有238个字节。

  18. 虚拟地址从(PT1,PT2,偏移)变为(PT1,PT2,PT3,偏移)。 但虚拟地址仍然只使用32位。 虚拟地址的位配置从(10,10,12)变为(2,9,9,12)

  19. 20位用于虚拟页码,剩下12位用于偏移。 这会产生4 KB的页面。 虚拟页面的二十位意味着220页。

  20. 对于一级页表,需要232/212或1M页。 因此,页表必须具有1M条目。 对于两级分页,主页表具有1K条目,每个条目指向第二页表。 只使用其中两种。 因此,总共只需要三个页表条目,一个在顶级表中,一个在每个下级表中。

  21. 代码和参考字符串如下
    在这里插入图片描述
    代码(I)表示指令引用,而(D)表示数据引用

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

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

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

  25. 主存储器有228/213 = 32,768页。 32K哈希表的平均链长为1.要低于1,我们必须使用下一个尺寸,为65536个条目。将32768个条目分布在65536个表槽上将得到0.5的平均链长度,从而确保快速查找。

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

  27. 在这种情况下
    (a)每个引用都将缺页中断,除非页框的数量是512,即整个序列的长度。
    (b)如果有500页框,则将页面0-498映射到固定页框并且仅改变一页框。

  28. FIFO的页框如下:
    x 0172333300
    xx017222233
    xxx01777722
    xxxx0111177
    LRU的页框如下:
    x 0172327103
    xx017232710
    xxx01773271
    xxxx0111327
    FIFO产生六次缺页中断; LRU为7次。

  29. 将选择0位的第一页,在本例中为D.

  30. 计数器是
    Page 0:0110110
    Page 1:01001001
    Page 2:00110111
    Page 3:10001011

  31. 顺序:0,1,2,1,2,0,3。在LRU中,第1页将被第3页替换。在clock中,第1页将被替换,因为所有页面都将被标记,表针位于 在第0页。

  32. 页面的生存时间是2204-1213= 991.如果τ=400,它肯定不在工作集中,并且最近没有被引用,因此它将被移除。 τ=1000的情况不同。 现在页面属于工作集,所以它不会被删除。

  33. 33.考虑,
    (a)对于设置的每个R位,将时间戳值设置为10并清除所有R位。 您还可以将(0,1)R-M条目更改为(0,0 *)。 因此第1页和第2页的条目将更改为:
    在这里插入图片描述
    (b)移除第3页(r=0,m=0),加载第4页:
    在这里插入图片描述

  34. 考虑,
    (a)属性是:(FIFO)加载时间; (LRU)最新参考时间; 和(最优)将来最近的参考时间。
    (b)有标记算法和替换算法。 标签算法使用部分a中给出的属性标记每个页面。 移除算法驱逐具有最小标签的页面。

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

  36. NRU置换第2页.FIFO置换第3页.LRU置换第1页。第二次机会置换第2页。

  37. 共享页面带来了各种复杂情况和选择:
    (a)如果进程B永远不会访问共享页面,或者当页面再次被换出时访问它,则应该延迟进程B的页表更新。 不幸的是,在一般情况下,我们不知道将来B将采取什么流程。
    (b)成本是这种懒惰的缺页错误处理会导致更多的缺页错误。 每个缺页错误的开销在确定此策略是否更有效方面起着重要作用。 (旁白:此成本类似于支持某些UNIX fork系统调用实现的写时复制策略所面临的成本。)

  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. 该程序有15,000个缺页中断,每个中断使用2毫秒的额外处理时间。缺页中断开销一起是30秒。这意味着在使用的60秒中,一半用于缺页中断开销,一半用于运行程序。如果我们以两倍的内存运行程序,我们得到一半的内存缺页中断,只有15秒的缺页中断开销,因此总运行时间将是45秒。

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

  44. 指令可以跨越页面边界,导致两个缺页中断只是为了获取指令。获取的字也可以跨越页面边界,再生成两个缺页中断,总共四个。如果字必须在存储器中对齐,则数据字只能导致一个缺页中断,但是在具有4 KB页面的机器上在地址4094处加载32位字的指令在某些机器(包括x86)上是合法的。

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

  46. 否。搜索键同时使用段号和虚拟页码,因此可以在一次匹配中找到确切的页面。

  47. (a)(14,3)否(或0xD3或1110 0011)
    (b)NA 保护错误:写入读取/执行段
    (c)NA缺页中断
    (d)NA保护错误:跳转到读/写段

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

  49. 此问题涉及虚拟机支持的一个方面。 最近的尝试包括Denali,Xen和VMware。 根本障碍是如何实现接近本机的性能,也就是说,执行的操作系统本身就有内存。 问题是如何快速切换到另一个操作系统,以及如何处理TLB。 通常,您希望为每个内核提供一定数量的TLB条目,并确保每个内核在其正确的虚拟内存上下文中运行。 但有时候硬件(例如,某些英特尔架构)想要在不知道你想要做什么的情况下处理TLB未命中。 因此,您需要在软件中处理TLB未命中或提供硬件支持以使用上下文ID标记TLB条目。

猜你喜欢

转载自blog.csdn.net/dldldl1994/article/details/86263031
今日推荐