《现代操作系统》第八章习题答案

  1. USENET 和 SETI@home 都可以被描述为广域分布式系统。然而,USENET 实际上比图 8-1(c) 中的方案更为原始,因为它不需要除了两台机器之间的点对点连接之外的任何网络基础设施。另外,由于它除了确保正确传播新闻文章所需的处理工作之外没有进行任何处理工作,可以争论它是否真正是我们在本章关注的分布式系统的一种。SETI@home 是广域分布式系统的一个更典型的例子;数据被分发到远程节点,然后返回计算结果到协调节点。

  2. 根据 CPU 如何连接到内存,其中一个首先通过,例如,先占用总线。它完成内存操作,然后另一个操作发生,依此类推。无法预测哪个首先执行,但如果系统被设计为顺序一致性,那么执行顺序就不应该有影响。

  3. 一台运行速度为 200 MIPS 的机器将会发出 2 亿次内存引用每秒,消耗 2 亿个总线周期或占据总线容量的一半。只需两个 CPU 就能占据整个总线。缓存将内存请求数降低到 2000 万次每秒,允许 20 个 CPU 共享总线。要在总线上使用 32 个 CPU,每个 CPU 的请求量不能超过 1250 万次每秒。如果只有来自 2 亿个内存引用的 1250 万个出现在总线上,缓存未命中率必须为 12.5/200,即 6.25%。这意味着命中率为 93.75%。

  4. CPU 000、010、100 和 110 无法访问内存 010 和 011。

  5. 每个 CPU 完全管理自己的信号。如果键盘生成一个信号并且键盘未分配给任何特定的 CPU(通常情况),则需要将信号发送给正确的 CPU 处理。

  6. 要执行系统调用,进程会生成一个陷阱。该陷阱中断自己的 CPU。需要以某种方式将一个从属 CPU 触发陷阱的信息传输给主 CPU。这在第一个模型中没有发生。如果存在处理器间陷阱指令,可以用它来向主处理器发送信号。如果不存在此类指令,则当从属处理器处于空闲状态时,它可以收集系统调用的参数,并将其放入内存中的数据结构中,主处理器可以持续轮询。

  7. 这是一个可能的解决方案。
    enter region:
    TST LOCK | Test the value of lock
    JNE ENTER REGION | If it is nonzero, go try again
    TSL REGISTER,LOCK | Copy lock to register and set lock to 1
    CMP REGISTER,#0 | Was lock zero?
    JNE ENTER REGION | If it was nonzero, lock was set, so loop
    RET | Retur n to caller; critical region entered

  8. 正如文中所指出的,我们对于编写高并行桌面应用程序的经验(和工具)很有限。虽然桌面应用程序有时是多线程的,但线程通常用于简化 I/O 编程,因此它们不是计算密集型线程。在桌面应用程序领域,有一些可能大规模并行化的可能性是视频游戏,因为游戏的许多方面都需要大量(并行)计算。一种更有前景的方法是将操作系统和库服务并行化。我们已经在当前硬件和操作系统设计中看到了这方面的例子。例如,网络卡现在具有用于加速数据处理并以线速(例如加密,入侵检测等)提供更高级网络服务的片上并行处理器(网络处理器)。另一个例子是视频卡上的强大处理器,用于将视频渲染从主 CPU 卸载,并为应用程序提供更高级的图形 API(例如 Open GL)。人们可以设想用单芯片多核处理器取代这些特殊用途卡。而且,随着核心数量的增加,可以使用相同的基本方法来并行化其他操作系统和常见库服务。

  9. 可能只需要在数据结构上加锁就足够了。很难想象一段代码可能做的任何关键操作而不涉及某些内核数据结构。例如,所有的资源获取和释放都使用数据结构。虽然无法证明,但很可能只需要在数据结构上加锁就足够了。

  10. 移动该块需要 16 个总线周期,每个 TSL 都进行双向移动。因此,每经过 50 个总线周期,就有 32 个用于移动缓存块的周期被浪费掉了。因此,总线带宽的 64% 被浪费在缓存传输上。

  11. 是的,它会,但中断轮询的时间可能会变得非常长,降低性能。但即使没有最大值,也是正确的。

  12. 它与 TSL 的效果一样好。通过将 1 预加载到要使用的寄存器中,然后原子地交换该寄存器和内存单元。指令执行后,内存单元被锁定(即值为 1),其先前的值现在包含在寄存器中。如果之前已锁定,则单元未发生更改,调用者必须进行循环。如果之前未锁定,则现在已锁定。

  13. 循环由 TSL 指令(5 纳秒)、总线周期(10 纳秒)和向后跳转到 TSL 指令(5 纳秒)组成。因此,在 20 纳秒内,请求 1 个总线周期,占用 10 纳秒。循环占用总线的 50%。

  14. 亲和性调度涉及将正确的线程放在正确的 CPU 上。这样做可能会减少 TLB 缺失,因为 TLB 保存在每个 CPU 内部。另一方面,它对页面错误没有影响,因为如果一个页面对一个 CPU 而言在内存中,对所有 CPU 而言也在内存中。

  15. (a) 2 (b) 4 (c) 8 (d) 5 (e) 3 (f) 4.

  16. 在网格上,最坏的情况是处于相对角落的节点尝试通信。然而,对于一个环形结构,相对角落只相隔两跳。最坏情况是一个角落与中间的节点进行通信。对于奇数 k ,从角落到中间水平跳跃需要\frac{k-1}{2} 跳,再从垂直方向跳 \frac{k-1}{2} 次,总共 k-1 跳。对于偶数 k ,中间是一个由四个点组成的方形,所以最坏情况是从角落到这个四点方块中最远的点。水平上需要 k/2 跳,垂直上也需要 k/2 跳,因此直径为 k 。

  17. 通过中间切割平面,网络可以分为两个系统,每个系统的结构为 8\times 8\times 4。两个部分之间有 128 条链接,双向切割带宽为 128 Gbps。

  18. 如果仅考虑网络传输时间,每个位需要 1 纳秒,或每个数据包需要 512 纳秒延迟。每边需要 320 纳秒来复制 64 字节(每次复制 4 字节),总共为 640 纳秒。加上 512 纳秒的传输时间,总共为 1132 纳秒。如果需要两次额外的复制,总共为 1792 纳秒。

  19. 如果仅考虑传输时间,1 Gbps 的网络传输速度为每秒 125 MB。在 1152 纳秒内传输 64 字节相当于 55.6 MB/ 秒。在 1792 纳秒内传输 64 字节相当于 35.7 MB/ 秒。

  20. 使用程序控制的 I/O 移动 k 字节的时间为 20k 纳秒。使用 DMA 的时间为 2000 + 5k 纳秒。将它们相等并解出 k ,得到断点为 133 字节。

  21. 显然,如果在远程执行系统调用,将发生错误。如果文件不存在,则无法在远程机器上读取文件。同时,在远程机器上设置闹钟不会向调用机器发送信号。处理远程系统调用的一种方法是将其捕获并发送回原始站点进行执行。

  22. 首先,在广播网络上可以发送广播请求。其次,可以维护一个中央数据库,记录每个页面属于谁。第三,每个页面可以有一个主页,由其虚拟地址的高 k 位指示;主页可以跟踪其每个页面的位置。

  23. 在这个划分中,节点 1 有 A、E 和 G,节点 2 有 B 和 F,节点 3 有 C、D、H 和 I。节点 1 和节点 2 之间的划分现在包含 AB 和 EB,权重为 5。节点 2 和节点 3 之间的划分现在包含 CD、CI、FI 和 FH,权重为 14。节点 1 和节点 3 之间的划分现在包含 EH 和 GH,权重为 8。总和为 27。

  24. 打开文件的表格保存在内核中,因此如果一个进程有打开的文件,在解冻并尝试使用其中一个文件时,新的内核并不知道这些文件。第二个问题是信号屏蔽,这也存储在原始内核中。第三个问题是如果有一个未决的闹钟,它将在错误的机器上触发。总的来说,内核中充满了关于进程的各种信息碎片,它们也必须成功迁移。

  25. 以太网节点必须能够检测到数据包之间的碰撞,因此最远分离的两个节点之间的传播延迟必须小于要发送的最短数据包的持续时间。否则,发送方可能完全传输一个数据包并且不会检测到碰撞,即使数据包在电缆的另一端附近发生碰撞。

  26. 中间件在不同的操作系统上运行,所以代码显然是不同的,因为嵌入式系统调用是不同的。它们的共同之处在于为上面的应用层提供一个共同的接口。如果应用层只调用中间件层而不是系统调用,那么所有版本都可以有相同的源代码。如果它们也进行真正的系统调用,这些调用将不同。

  27. 最合适的服务是 1. 不可靠连接。2. 可靠的字节流。

  28. 它是层次结构维护的。全球服务器用于管理 .edu 域名,了解所有大学的信息,而 .com 服务器用于管理以 .com 结尾的域名的信息。因此,要查找 http://cs.uni.edu,计算机首先会在 .edu 服务器上查找 uni,然后前往那里询问 cs,以此类推。

  29. 一台计算机可能有许多等待传入连接的进程。这些进程可以是 Web 服务器、邮件服务器、新闻服务器等。必须找到一种方法,使得可以将传入连接定向到特定的进程。这是通过使每个进程侦听特定的端口来实现的。已经约定 Web 服务器将侦听端口 80,因此定向到 Web 服务器的传入连接将发送到端口 80。这个数字本身是任意选择的,但必须选择一个数值。

  30. 物理输入 / 输出设备仍然存在问题,因为它们不会随虚拟机一起迁移,但它们的寄存器可能包含对系统正常运行至关重要的状态。想象一下已经发出但尚未完成的对设备(如磁盘)的读取或写入操作。网络输入 / 输出尤其困难,因为其他机器将继续向虚拟机管理程序发送数据包,而不知道虚拟机已经移动。即使可以将数据包重定向到新的虚拟机管理程序,虚拟机在迁移期间将无响应,而迁移时间可能很长,因为整个虚拟机,包括它上面运行的宿主操作系统和所有进程,都必须迁移到新的机器上。结果,数据包可能会出现较大的延迟,甚至丢包,如果设备 / 虚拟机管理程序缓冲区溢出。

  31. 一种方法是让 Web 服务器将整个页面(包括所有图像)打包成一个大的 zip 文件,然后第一次发送整个文件,这样只需要一个连接。第二种方法是使用无连接的协议,如 UDP。这将消除连接开销,但会要求服务器和浏览器自己进行错误控制。

  32. 使读取的值取决于进程是否恰好在与上一次写入者相同的机器上,这一点根本不透明。这就要求只有进行更改的进程能看到这些更改。另一方面,每台机器只有一个缓存管理器更容易和更便宜实现。如果它必须维护每个修改文件的多个副本,并且返回的值取决于读取的对象,这样的管理器会变得非常复杂。

  33. 共享内存作用于整个页面。这可能导致虚假共享,在同一个页面上访问不相关的变量会引发频繁的切换。将每个变量放在独立的页面上是浪费的。基于对象的访问消除了这些问题,并允许更精细的共享粒度。

  34. 在将元组插入元组空间时,基于元组中的任何字段进行哈希并不起作用,因为 in 可能大部分是形式参数。一种始终有效的优化方法是注意到 out 和 in 的所有字段都有类型。因此,已知元组空间中所有元组的类型签名,并且需要的 in 的元组类型也是已知的。这建议为每个类型签名创建一个元组子空间。例如,所有的 (int, int, int) 元组放入一个空间,而所有的 (string, int, float) 元组放入另一个空间。当执行 in 时,只需要搜索匹配的子空间。
  • 18
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值