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

  1. 计算机硬件的改进主要归功于更小的晶体管。一些限制因素包括:(a) 光的波动性可能限制传统光刻技术制造集成电路的能力,(b) 固体中个别原子的迁移性可能导致非常薄的半导体、绝缘体和导体层的性能退化,(c) 背景辐射活性可能破坏分子键或影响非常小的储存电荷。当然还有其他因素。

  2. 对于高度交互式的程序,事件模型可能更好。其中,只有 (b) 是交互式的。因此,(a) 和 (c) 是算法驱动的,(b) 是事件驱动的。

  3. 不是。差异更多地与 DNS 服务器缓存并且以分级方式组织有关。路径可以很容易地按自顶向下的顺序给出,但倒序的惯例现在已被广泛接受。

  4. 可能 stat 是多余的。可以通过 open、fstat 和 close 的组合来实现。对于其他操作,模拟将非常困难。

  5. 如果将驱动程序放置在线程之下,那么驱动程序无法像 MINIX 3 那样独立运行。它们必须作为某个其他线程的一部分运行,更类似于 UNIX 风格。

  6. 是可能的。所需的是一个管理信号量的用户级进程,也就是信号量服务器。要创建信号量,用户向其发送一条消息,请求一个新的信号量。要使用它,用户进程将信号量的标识传递给其他进程。然后,它们可以向信号量服务器发送请求操作的消息。如果操作阻塞,不会发送回复,从而阻塞调用者。

  7. 模式是 8 毫秒的用户代码,然后 2 毫秒的系统代码。通过优化,每个周期现在是 8 毫秒的用户代码和 1 毫秒的系统代码。因此,一个周期从 10 毫秒减少到 9 毫秒。将这样的周期乘以 1000,一个 10 秒的程序现在只需要 9 秒。

  8. 外部名称可以任意长度且可变长。内部名称通常是 32 位或 64 位长度,且总是固定长度。外部名称不需要唯一。例如,UNIX 文件系统中的链接可以指向同一对象。内部名称必须唯一。外部名称可以是分层的。内部名称通常是表的索引,因此形成一个扁平的命名空间。

  9. 如果新表的大小是旧表的 2 倍,它不会很快填满,从而减少需要升级表的次数。另一方面,可能不需要这么多空间,因此可能会浪费内存。这是经典的时间与空间的权衡。

  10. 这样做是有风险的。假设 PID 正好在最后一个条目上。在这种情况下,退出循环会使 p 指向最后一个条目。然而,如果未找到 PID,则 p 可能指向最后一个条目或超出最后一个条目,这取决于编译代码的细节,启用了哪种优化等等。在一个编译器上可能行得通,但在另一个编译器上可能失败。设置一个标志更好。

  11. 可以这样做,但不是一个好主意。一个 IDE 或 SCSI 驱动程序可能很长。如此长的条件代码会使源代码难以跟踪。最好将每个驱动程序放在单独的文件中,然后使用 Makefile 来确定应该包含哪个文件。或者至少可以使用条件编译来包含一个驱动程序文件或另一个。

  12. 是的。它会使代码变慢,而且更多的代码意味着更多的错误。

  13. 不容易。同时进行的多个调用可能会干扰彼此。如果静态数据由互斥锁保护,可能是可能的,但这意味着对简单过程的调用可能会意外阻塞。

  14. 是的。每次调用宏时,代码都会被复制。如果调用多次,程序会变得非常庞大。这是典型的时间和空间的权衡:一个更大,更快的程序而不是一个更小,更慢的程序。然而,在极端情况下,较大的程序可能无法适应 TLB,导致抖动,从而运行更慢。

  15. 从将单词的低 16 位和高 16 位进行异或运算得到一个 16 位整数 s 。对于每一位,有四种情况:00(结果为 0),01(结果为 1),10(结果为 1)和 11(结果为 0)。因此,如果 s 中 1 的个数是奇数,则奇偶校验为奇数;否则为偶数。创建一个包含 65,536 个条目的表格,每个条目包含一个字节和奇偶校验位。宏的定义如下:
    #define parity(w) bits[(w & 0xFFFF) ^ ((w>>16) & 0xFFFF)]

  16. 没有情况可以。" 压缩 " 后的颜色值大小与原始值一样大,而且可能需要一个庞大的调色板。这完全没有意义。

  17. 8 位的调色板包含 256 个条目,每个条目占用 3 个字节,总共 768 字节。每个像素的节省是 2 个字节。因此,对于超过 384 个像素的图像,GIF 会获胜。16 位的调色板包含 65,536 个条目,每个条目占用 3 个字节,总共 196,608 字节。在这里,每个像素的节省是 1 个字节。因此,超过 196,608 个像素的图像,16 位压缩会获胜。假设宽高比为 4:3,平衡点是一个 512\times 384 像素的图像。对于 VGA ( 640\times 480 ),16 位颜色所需的数据量比真实的 24 位颜色要少。

  18. 对于在路径名缓存中的路径,它没有影响,因为绕过了 i-node。如果没有读取它,则它是否已经在内存中并不重要。对于不在名称缓存中但涉及固定的 i-node 的路径,固定 i-node 可以帮助,因为它消除了磁盘读取的需求。

  19. 记录最后修改日期、大小,可能还有一个计算出的签名(如校验和或 CRC)可以帮助确定文件自上次引用以来是否发生了变化。警告:远程服务器可能提供有关文件的虚假信息,可能需要本地重新生成计算出的签名。

  20. 可以给文件赋予版本号或校验和,并将这些信息与提示一起存储。在访问远程文件之前,将检查版本号或校验和是否与当前文件一致。

  21. 文件系统通常会尝试将新数据写入紧随上次使用过的最近可用的磁盘块。如果两个文件同时被写入,这可能导致数据块在磁盘上交错排列,从而导致两个文件都被碎片化,从而更难以读取。可以通过在内存中缓冲数据以最大化写入大小,或将数据写入临时文件,然后在程序终止时将每个输出复制到永久文件来减轻这种效果。

  22. Brooks 谈论的是在大型项目中程序员之间的沟通会减慢一切速度。这个问题在一个单人项目中不会出现,因此生产力可能会更高。

  23. 如果一个程序员可以以 10 万美元的成本生成 1000 行代码,那么一行代码的成本为 100 美元。Windows 8 由 5000-1 亿行代码组成,这相当于 50-1000 亿美元。这似乎非常庞大。可能微软已经通过使用更好的工具提高了程序员的生产力,使得一个程序员每年可以生成数千行代码。此外,Windows 8 的许多部分未经修改地从 Windows 7 中取出,因此 Windows 8 中新代码的数量只是其总体规模的一小部分。另一方面,微软的年收入约为 700 亿美元,所以在 Windows 8 上花费数十亿美元是可能的。

  24. 假设内存每 GB 成本 10 美元(与当前价格对比)。那么一个具有 100GB 硬盘的低端机器需要价值 1000 美元的 RAM。如果 PC 的其他部分成本为 500 美元,则总成本为 1500 美元。这对于低端市场来说太贵了。

  25. 嵌入式系统可能只运行一个或少数几个程序。如果所有程序都可以一直保持加载到内存中,可能就不需要内存管理器或文件系统。此外,仅需要驱动程序用于少数几个 I/O 设备,编写 I/O 驱动程序作为库程序可能更有意义。库程序可能会更好地编译为独立程序,而不是共享库,消除了对共享库的需求。在特定情况下,可能可以消除许多其他功能。

你可能感兴趣的:(《现代操作系统》习题答案,学习,笔记,linux,unix,c语言)