图书目录

第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  处理复杂性I 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  DNS响应的可信性 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