深入理解计算机系统(CSAPP)
  • 本电子书信息
  • 出版信息
    • 出版者的话
    • 中文版序一
    • 中文版序二
    • 译者序
    • 前言
    • 关于作者
  • 第 1 章:计算机系统漫游
    • 1.1 信息就是位 + 上下文
    • 1.2 程序被其他程序翻译成不同的格式
    • 1.3 了解编译系统如何工作是大有益处的
    • 1.4 处理器读并解释储存在内存中的指令
    • 1.5 高速缓存至关重要
    • 1.6 存储设备形成层次结构
    • 1.7 操作系统管理硬件
    • 1.8 系统之间利用网络通信
    • 1.9 重要主题
    • 1.10 小结
  • 第一部分:程序结构和执行
    • 第 2 章:信息的表示和处理
      • 2.1 信息存储
      • 2.2 整数表示
      • 2.3 整数运算
      • 2.4 浮点数
      • 2.5 小结
      • 家庭作业
    • 第 3 章:程序的机器级表示
      • 3.1 历史观点
      • 3.2 程序编码
      • 3.3 数据格式
      • 3.4 访问信息
    • 第 4 章:处理器体系结构
    • 第 5 章:优化程序性能
    • 第 6 章:存储器层次结构
  • 第二部分:在系统上运行程序
    • 第 7 章:链接
      • 7.1 编译器驱动程序
      • 7.2 静态链接
      • 7.3 目标文件
      • 7.4 可重定位目标文件
      • 7.5 符号和符号表
      • 7.6 符号解析
      • 7.7 重定位
      • 7.8 可执行目标文件
      • 7.9 加载可执行目标文件
      • 7.10 动态链接共享库
      • 7.11 从应用程序中加载和链接共享库
      • 7.12 位置无关代码
      • 7.13 库打桩机制
      • 7.14 处理目标文件的工具
      • 7.15 小结
      • 家庭作业
    • 第 8 章:异常控制流
      • 8.1 异常
      • 8.2 进程
      • 8.3 系统调用错误处理
      • 8.4 进程控制
      • 8.5 信号
      • 8.6 非本地跳转
      • 8.7 操作进程的工具
      • 8.8 小结
      • 家庭作业
    • 第 9 章:虚拟内存
      • 9.1 物理和虚拟寻址
      • 9.2 地址空间
      • 9.3 虚拟内存作为缓存的工具
      • 9.4 虚拟内存作为内存管理的工具
      • 9.5 虚拟内存作为内存保护的工具
      • 9.6 地址翻译
      • 9.7 案例研究:Intel Core i7 / Linux 内存系统
      • 9.8 内存映射
      • 9.9 动态内存分配
      • 9.10 垃圾收集
      • 9.11 C 程序中常见的与内存有关的错误
      • 9.12 小结
      • 家庭作业
  • 第三部分:程序间的交互和通信
    • 第 10 章:系统级 I/O
      • 10.1 Unix I/O
      • 10.2 文件
      • 10.3 打开和关闭文件
      • 10.4 读和写文件
      • 10.5 用 RIO 包健壮地读写
      • 10.6 读取文件元数据
      • 10.7 读取目录内容
      • 10.8 共享文件
      • 10.9 I/O 重定向
      • 10.10 标准 I/O
      • 10.11 综合:我该使用哪些 I/O 函数?
      • 10.12 小结
      • 家庭作业
    • 第 11 章:网络编程
      • 11.1 客户端—服务器编程模型
      • 11.2 网络
      • 11.3 全球 IP 因特网
      • 11.4 套接字接口
      • 11.5 Web 服务器
      • 11.6 综合:TINY Web 服务器
      • 11.7 小结
      • 家庭作业
    • 第 12 章:并发编程
      • 12.1 基于进程的并发编程
      • 12.2 基于 I/O 多路复用的并发编程
      • 12.3 基于线程的并发编程
      • 12.4 多线程程序中的共享变量
      • 12.5 用信号量同步线程
      • 12.6 使用线程提高并行性
      • 12.7 其他并发问题
      • 12.8 小结
      • 家庭作业
  • 附录 A:错误处理
  • 参考文献
  • 实验
    • 实验总览
      • 常见问题
    • 实验 1:Data Lab
      • README(讲师版)
      • README(学生版)
      • Writeup
    • 实验 2:Bomb Lab
      • README(讲师版)
      • Writeup
    • 实验 3:Attack Lab
    • 实验 4:Architechture Lab
    • 实验 5:Cache Lab
    • 实验 6:Performance Lab
    • 实验 7:Shell Lab
    • 实验 8:Malloc Lab
    • 实验 9:Proxy Lab
由 GitBook 提供支持
在本页
  • 练习题 9.11
  • 练习题 9.12
  • 练习题 9.13
  • 练习题 9.14
  • 练习题 9.15
  • 练习题 9.16
  • 练习题 9.17
  • 练习题 9.18
  • 练习题 9.19
  • 练习题 9.19
  1. 第二部分:在系统上运行程序
  2. 第 9 章:虚拟内存

家庭作业

上一页9.12 小结下一页第 10 章:系统级 I/O

最后更新于4年前

练习题 9.11

在下面的一系列问题中,你要展示 9.6.4 节中的示例内存系统如何将虚拟地址翻译成物理地址,以及如何访问缓存。对于给定的虚拟地址,请指出访问的 TLB 条目、物理地址,以及返回的缓存字节值。请指明是否 TLB 不命中,是否发生了缺页,是否发生了缓存不命中。如果有缓存不命中,对于“返回的缓存字节”用 “—” 来表示。如果有缺页,对于 “PPN” 用 "—”来表示,而 C 部分和 D 部分就空着。

虚拟地址:0x027C

A. 虚拟地址格式

B. 地址翻译

参数

值

VPN

TLB 索引

TLB 标记

TLB 命中?(是/否)

缺页?(是/否)

PPN

C. 物理地址格式

D. 物理地址引用

参数

值

字节偏移

缓存索引

缓存标记

缓存命中?(是/否)

返回的缓存字节

练习题 9.12

对于下面的地址,重复习题 9.11:

虚拟地址:0x03a9

A. 虚拟地址格式

B. 地址翻译

参数

值

VPN

TLB 索引

TLB 标记

TLB 命中?(是/否)

缺页?(是/否)

PPN

C. 物理地址格式

D. 物理地址引用

参数

值

字节偏移

缓存索引

缓存标记

缓存命中?(是/否)

返回的缓存字节

练习题 9.13

对于下面的地址,重复习题 9.11:

虚拟地址:0x0040

A. 虚拟地址格式

B. 地址翻译

参数

值

VPN

TLB 索引

TLB 标记

TLB 命中?(是/否)

缺页?(是/否)

PPN

C. 物理地址格式

D. 物理地址引用

参数

值

字节偏移

缓存索引

缓存标记

缓存命中?(是/否)

返回的缓存字节

练习题 9.14

假设有一个输入文件 hello.txt,由字符串 “Hello, world!\n” 组成,编写一个 C 程序,使用 mmap 将 hello.txt 的内容改变为 “Jello, world! \n”。

练习题 9.15

确定下面的 malloc 请求序列得到的块大小和头部值。假设:1)分配器保持双字对齐,使用隐式空闲链表,以及图 9-35 中的块格式。2)块大小向上舍入为最接近的 8 字节的倍数。

请求

块大小(十进制字节)

块头部(十六进制)

malloc(3)

malloc(11)

malloc(20)

malloc(21)

练习题 9.16

确定下面对齐要求和块格式的每个组合的最小块大小。假设:显式空闲链表、每个空闲块中有四字节的 pred 和 succ 指针、不允许有效载荷的大小为零,并且头部和脚部存放在一个四字节的字中。

对齐要求

已分配块

空闲块

最小块大小(字节)

单字

头部和脚部

头部和脚部

单字

头部,但是没有脚部

头部和脚部

双字

头部和脚部

头部和脚部

双字

头部,但是没有脚部

头部和脚部

练习题 9.17

开发 9.9.12 节中的分配器的一个版本,执行下一次适配搜索,而不是首次适配搜索。

练习题 9.18

9.9.12 节中的分配器要求每个块既有头部也有脚部,以实现常数时间的合并。修改分配器,使得空闲块需要头部和脚部,而已分配块只需要头部。

练习题 9.19

下面给出了三组关于内存管理和垃圾收集的陈述。在每一组中,只有一句陈述是正确的。你的任务就是判断哪一句是正确的。

    • a)在一个伙伴系统中,最高可达 50% 的空间可以因为内部碎片而被浪费了。

    • b)首次适配内存分配算法比最佳适配算法要慢一些(平均而言)。

    • c)只有当空闲链表按照内存地址递增排序时,使用边界标记来回收才会快速。

    • d)伙伴系统只会有内部碎片,而不会有外部碎片。

    • a)在按照块大小递减顺序排序的空闲链表上,使用首次适配算法会导致分配性能很低,但是可以避免外部碎片。

    • b)对于最佳适配方法,空闲块链表应该按照内存地址的递增顺序排序。

    • c)最佳适配方法选择与请求段匹配的最大的空闲块。

    • d)在按照块大小递增的顺序排序的空闲链表上,使用首次适配算法与使用最佳适配算法等价。

  1. Mark&Sweep 垃圾收集器在下列哪种情况下叫做保守的:

    • a)它们只有在内存请求不能被满足时才合并被释放的内存。

    • b)它们把一切看起来像指针的东西都当做指针。

    • c)它们只在内存用尽时,才执行垃圾收集。

    • d)它们不释放形成循环链表的内存块。

练习题 9.19

编写你自己的 malloc 和 free 版本,将它的运行时间和空间利用率与标准 C 库提供的 malloc 版本进行比较。