第1章 系统 1
1.0概述 1
1.1系统和复杂性 2
1.1.1不同领域中系统的共同问题 2
1.1.2系统、组件、接口和环境 5
1.1.3复杂性 6
1.2复杂性的来源 7
1.2.1相互影响的需求 8
1.2.2保证高利用率 10
1.3处理复杂性Ⅰ 11
1.3.1模块化 11
1.3.2抽象化 13
1.3.3层次化 15
1.3.4分级化 15
1.3.5组合起来:用名字关联 16
1.4求同存异:计算机系统与其他系统的比较 16
1.4.1计算机系统组合没有限制 17
1.4.2 d(技术)/dt是前所未有的 18
1.5处理复杂性Ⅱ 21
1.5.1为什么模块化、抽象化、层次化和分级化还不够 21
1.5.2迭代法 21
1.5.3保持简单 23
1.6本书其他内容 24
习题 25
第2章 计算机系统的组成部分 26
2.0概述 26
2.1 3种基本抽象 26
2.1.1存储器 27
2.1.2解释器 32
2.1.3通信链路 36
2.2计算机系统中的命名 37
2.2.1命名模型 38
2.2.2默认上下文引用和显式上下文引用 41
2.2.3路径名、命名网络和递归名字解析 44
2.2.4多重查找:在分层的上下文中搜索 46
2.2.5名字比较 47
2.2.6名字发现 48
2.3用名字和层次结构组织计算机系统 49
2.3.1硬件层:总线 51
2.3.2软件层:文件抽象 55
2.4总结经验,面向未来 58
2.5案例分析:UNIX文件系统中的层次和命名 58
2.5.1 UNIX文件系统应用程序编程接口 59
2.5.2块层 60
2.5.3文件层 61
2.5.4 inode编号层 62
2.5.5文件名层 62
2.5.6路径名层 64
2.5.7连接 65
2.5.8重命名 66
2.5.9绝对路径层 67
2.5.10符号连接层 68
2.5.11实现文件系统API 70
2.5.12 Shell,隐式上下文,搜索路径,名字发现 73
2.5.13进一步阅读推荐 74
习题 75
第3章 命名方案的设计 77
3.0概述 77
3.1命名方案设计中的考虑因素 77
3.1.1模块化共享 77
3.1.2元数据与名字重载 80
3.1.3地址:定位对象的名字 82
3.1.4生成唯一的名字 83
3.1.5预期用户与用户友好的名字 86
3.1.6名字、值和绑定的相对寿命 87
3.1.7回顾和展望:名字是基本的系统组件 89
3.2案例研究:统一资源定位器(URL) 90
3.2.1网页浏览作为参考经历;名字发现 90
3.2.2 URL的解释 90
3.2.3 URL大小写敏感性 91
3.2.4部分URL的错误上下文引用 92
3.2.5 URL中的名字重载 94
3.3战争故事:名字使用中的病症 95
3.3.1名字冲突赶走了笑容 95
3.3.2来自重载的脆弱名字,以及市场对策 95
3.3.3来自重载的更加脆弱的名字,伴随市场崩溃 96
3.3.4用户友好的名字中的大小写敏感性 97
3.3.5电话号码的用尽 98
习题 100
第4章 使用客户及服务增强模块化 102
4.0概述 102
4.1客户/服务组织方式 103
4.1.1从软模块化到强制模块化 103
4.1.2客户/服务的组织方式 108
4.1.3多客户端和多服务器 114
4.1.4可信中间方 114
4.1.5一个简单的例子服务 116
4.2客户端和服务端之间的通信 117
4.2.1远程过程调用 (RPC) 117
4.2.2 RPC不等于过程调用 119
4.2.3通过中间方的通信 121
4.3总结及前景 122
4.4案例研究:因特网域名系统(DNS) 123
4.4.1 DNS中的名字解析 124
4.4.2层次化的名字管理 128
4.4.3 DNS的其他特点 128
4.4.4 DNS中的名字发现 129
4.4.5 DN S响应的可信性 130
4.5案例研究:网络文件系统(NFS) 131
4.5.1命名远程的文件和目录 131
4.5.2 NFS的远程过程调用 133
4.5.3扩展UNIX文件系统来支持NFS 136
4.5.4一致性 137
4.5.5 NFS版本3及后续版本 139
习题 139
第5章 使用虚拟化技术强制模块化 142
5.0概述 142
5.1在一个计算机内部使用虚拟化技术进行客户端服务器组织 142
5.1.1虚拟化计算机的抽象概念 144
5.1.2仿真与虚拟机 148
5.1.3路线图:逐步虚拟化 148
5.2使用SEND、RECEIVE以及有界缓存区的虚拟连接 149
5.2.1有界限缓存区的SEND与RECEIVE的接口 150
5.2.2使用有界缓存区进行顺序合作 150
5.2.3竞争状态 153
5.2.4锁与前后原子性 156
5.2.5死锁 158
5.2.6实现ACQUIRE以及RELEASE 160
5.2.7使用单一写原理实现前后原子性动作 162
5.2.8使用异步连接在同步岛之间进行合作 165
5.3在内存上强制模块化 166
5.3.1使用域强制模块化 166
5.3.2使用多个域控制共享 167
5.3.3使用内核态与用户态更多强制模块化 169
5.3.4门与模式转换 170
5.3.5为有界缓存区强制模块化 171
5.3.6内核 172
5.4虚拟化内存 175
5.4.1虚拟化地址 176
5.4.2使用页映射翻译地址 177
5.4.3虚拟地址空间 179
5.4.4硬件与软件对比以及旁路转换缓存 183
5.4.5段(高级主题) 184
5.5使用线程虚拟化处理器 185
5.5.1多个线程之间共享一个处理器 186
5.5.2实现YIELD 189
5.5.3建立和终结线程 193
5.5.4使用线程强制模块化:抢先式调度 197
5.5.5使用线程和地址空间强制模块化 198
5.5.6线程分层 199
5.6顺序合作的线程原语 200
5.6.1通知丢失问题 200
5.6.2使用事件计数器以及顺序器避免通知丢失问题 203
5.6.3实现AWAIT、 ADVANCE、TICKET、 READ (高级主题) 207
5.6.4轮询、中断与顺序合作 209
5.7案例分析:在Intel x86 上强制模块化的演进 211
5.7.1早期设计:没有对强制模块化的支持 211
5.7.2使用段强制模块化 212
5.7.3基于页的虚拟地址空间 213
5.7.4概述:进一步的演进 213
5.8应用:使用虚拟机强制模块化 215
5.8.1虚拟机的使用 215
5.8.2实现虚拟机 216
5.8.3虚拟化的例子 217
习题 218
第6章 性能 221
6.0概述 221
6.1面向性能的设计 221
6.1.1性能量度 222
6.1.2一种系统化的面向性能的设计方法 224
6.1.3利用工作负载的特性减少延迟 225
6.1.4利用并发性减少延迟 227
6.1.5提高吞吐率:并发性 228
6.1.6排队与过载 229
6.1.7消除瓶颈 231
6.1.8示例:I/O瓶颈 233
6.2多层存储 237
6.2.1内存特征 238
6.2.2利用虚存管理多层存储 239
6.2.3给虚存系统增加多层存储管理的功能 241
6.2.4分析多层存储系统 244
6.2.5存储访问的局部性与工作集 245
6.2.6多层存储管理策略 247
6.2.7不同策略的比较分析 251
6.2.8其他页替换算法 254
6.2.9多层存储管理的其他方面 256
6.3调度 256
6.3.1资源调度 257
6.3.2调度的量度 258
6.3.3调度策略 260
6.3.4实例研究:调度磁盘摇臂 267
习题 269
关于第二部分 273
附录A:二元分类的权衡 275
进一步阅读推荐 278
问题集 315
术语表 357