- 出版者的话
- 中文版序一
- 中文版序二
- 译者序
- 前言
- 关于作者
- 第 1 章:计算机系统漫游
- 第 2 章:信息的表示和处理
- 第 3 章:程序的机器级表示
- 第 4 章:处理器体系结构
- 第 5 章:优化程序性能
- 第 6 章:存储器层次结构
- 第 7 章:链接
- 第 8 章:异常控制流
- 第 9 章:虚拟内存
- 第 10 章:系统级 I/O
- 第 11 章:网络编程
- 第 12 章:并发编程
- 附录 A:错误处理
- 实验 1:Data Lab
- 实验 3:Attack Lab
- 实验 4:Architechture Lab
- 实验 5:Cache Lab
- 实验 6:Performance Lab
- 实验 7:Shell Lab
- 实验 8:Malloc Lab
- 实验 9:Proxy Lab
家庭作业
练习题 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)在按照块大小递增的顺序排序的空闲链表上,使用首次适配算法与使用最佳适配算法等价。
- Mark&Sweep 垃圾收集器在下列哪种情况下叫做保守的:
- a)它们只有在内存请求不能被满足时才合并被释放的内存。
- b)它们把一切看起来像指针的东西都当做指针。
- c)它们只在内存用尽时,才执行垃圾收集。
- d)它们不释放形成循环链表的内存块。
练习题 9.19
编写你自己的 malloc 和 free 版本,将它的运行时间和空间利用率与标准 C 库提供的 malloc 版本进行比较。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论