您好,欢迎来到聚文网。 登录 免费注册
深入理解UNIX系统内核

深入理解UNIX系统内核

  • 装帧: 平装
  • 出版社: 机械工业出版社
  • 作者: (美)瓦哈利亚(Uresh Vahalia) 著;李雨,薛磊,黄庆新 译 著
  • 出版日期: 2015-05-01
  • 商品条码: 9787111491453
  • 版次: 1
  • 开本: 16开
  • 页数: 466
  • 出版年份: 2015
定价:¥119 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
内容简介
本书由国际资深UNIX专家撰写,深入剖析UNIX操作系统的内核技术,包含丰富的图示与细节展示。作者从操作系统设计的角度来审视UNIX系统内核,针对内核中的每个模块,深入探讨其结构和设计,详细阐释主流UNIX系统如何选择具体模块的实现方法,以及每种方法的优缺点,为读者更好地理解操作系统内核知识、提升操作系统开发能力提供翔实指导。全书共17章:第1章追溯UNIX系统的演变并分析影响系统主要变化的因素;第2~7章介绍进程子系统,包括线程及其在内核和用户库中的实现,以及在现代单处理器和多处理器系统中应用的同步框架;第8~11章介绍文件系统,内容涵盖知名系统的具体实现细节,以及一些使用日志提供更高可靠性和性能的高级文件系统;第12~15章介绍内存管理,涉及内核内存分配、虚拟内存等概念,以及转换后援缓冲和虚拟地址高速缓存;第16~17章主要介绍I/O子系统,内容包括设备驱动程序框架、内核与I/O子系统的交互等细节。本书包含大量示例和案例分析,章后附有练习和参考文献,启发读者进一步思考与研究,可作为高等院校相关专业本科生或研究生的教材,也可供各类开发人员参考。
目录
出版者的话
译者序
序言
前言
第1章  从头说起1
1.1简介1
1.1.1  UNIX简史1
1.1.2  起源1
1.1.3  扩散2
1.1.4  BSD3
1.1.5  System V4
1.1.6  商业化5
1.1.7  Mach5
1.1.8  标准5
1.1.9  OSF和UI6
1.1.10  SVR4及其之后7
1.2  变革使命8
1.2.1  功能8
1.2.2  网络8
1.2.3  性能9
1.2.4  硬件变化9
1.2.5  质量提升10
1.2.6  变革10
1.2.7  其他应用程序领域11
1.2.8  小即是美11
1.2.9  灵活性12
1.3  回顾过去,展望未来13
1.3.1  UNIX系统的优点是什么13
1.3.2  UNIX系统的缺点是什么14
1.4  本书内容说明15
参考文献15
第2章  进程与内核17
2.1  简介17
2.2  模式、空间和上下文19
2.3  进程抽象21
2.3.1进程状态21
2.3.2  进程上下文23
2.3.3  用户凭据23
2.3.4  u区和proc结构24
2.4  执行在内核态中26
2.4.1  系统调用接口26
2.4.2  中断处理27
2.5  同步29
2.5.1  阻塞操作29
2.5.2  中断30
2.5.3  多处理器31
2.6  进程调度31
2.7  信号32
2.8  新的进程和程序33
2.8.1  fork和exec33
2.8.2  进程的创建34
2.8.3  fork的优化35
2.8.4  调用新的程序35
2.8.5  进程终止37
2.8.6  等待进程终止37
2.8.7  僵死进程38
2.9  小结39
2.10  练习题39
参考文献39
第3章  线程和轻量级进程41
3.1  简介41
3.1.1  动机41
3.1.2  多线程和多处理器42
3.1.3  并发和并行43
3.2  基本抽象44
3.2.1  内核线程45
3.2.2  轻量级进程45
3.2.3  用户线程46
3.3  轻量级线程设计时要考虑的问题49
3.3.1  fork的语义49
3.3.2  其他系统调用50
3.3.3  信号传递和处理50
3.3.4  可见性51
3.3.5  栈增长51
3.4  用户级别的线程库51
3.4.1  编程接口52
3.4.2  线程库的实现52
3.5  调度器激活53
3.6  Solaris和SVR4上的多线程54
3.6.1  内核线程54
3.6.2  轻量级进程的实现55
3.6.3  用户线程56
3.6.4  用户线程的实现56
3.6.5  中断处理57
3.6.6  系统调用处理58
3.7  Mach的线程58
3.7.1  Mach抽象:任务和线程58
3.7.2  Mach的C-threads59
3.8  Digital UNIX60
3.8.1  UNIX接口60
3.8.2  系统调用和信号62
3.8.3  pthreads库62
3.9  Mach 3.0的continuation63
3.9.1  编程模型63
3.9.2  使用continuation63
3.9.3  优化65
3.9.4  分析65
3.10  小结65
3.11  练习题66
参考文献66
第4章  信号和会话管理68
4.1  简介68
4.2  信号生成和处理68
4.2.1  信号处理69
4.2.2  信号的生成71
4.2.3  典型场景72
4.2.4  睡眠与信号72
4.3  不可靠的信号73
4.4  可靠的信号74
4.4.1  主要特性74
4.4.2  SVR3实现75
4.4.3  BSD信号管理75
4.5  SVR4上的信号76
4.6  信号的实现77
4.6.1  信号生成78
4.6.2  交付和处理78
4.7  异常79
4.8  Mach的异常处理79
4.8.1  异常端口80
4.8.2  错误处理80
4.8.3  调试器交互81
4.8.4  分析81
4.9  进程组和终端管理82
4.9.1  基本概念82
4.9.2  SVR3模型83
4.9.3  限制84
4.9.4  4.3BSD的进程组和终端84
4.9.5  缺点86
4.10  SVR4的会话体系结构86
4.10.1  动机87
4.10.2  会话和进程组87
4.10.3  数据结构88
4.10.4  控制终端89
4.10.5  4.4BSD的会话实现机制89
4.11  小结90
4.12  练习题90
参考文献91
第5章  进程调度92
5.1  简介92
5.2  时钟中断处理93
5.2.1  callout93
5.2.2  告警95
5.3  调度器目标95
5.4  传统的UNIX调度96
5.4.1  进程优先级97
5.4.2  调度器的实现98
5.4.3  运行队列的操作99
5.4.4  分析99
5.5  SVR4调度器100
5.5.1  类无关层100
5.5.2  调度类的接口101
5.5.3  分时类103
5.5.4  实时类104
5.5.5  priocntl系统调用105
5.5.6  分析106
5.6  Solaris 2.x调度的改善107
5.6.1  可抢占的内核107
5.6.2  多处理器的支持107
5.6.3  隐式调度108
5.6.4  优先级反转109
5.6.5  优先级继承的实现110
5.6.6  优先级继承的局限性112
5.6.7  turnstile113
5.6.8  分析113
5.7  Mach上的调度113
多处理器支持114
5.8  Digital UNIX的实时调度116
多处理器支持116
5.9  其他调度实现117
5.9.1  公平调度方法117
5.9.2  最终期限驱动调度方法117
5.9.3  三级调度器118
5.10  小结119
5.11  练习题119
参考文献120
第6章  进程间通信121
6.1  简介121
6.2  通用的IPC方法121
6.2.1  信号122
6.2.2  管道122
6.2.3  SVR4管道124
6.2.4  进程跟踪124
6.3  System V IPC126
6.3.1  公共元素126
6.3.2  信号量127
6.3.3  消息队列130
6.3.4  共享内存131
6.3.5  讨论133
6.4  Mach IPC133
基本概念134
6.5  消息135
6.5.1  消息数据结构135
6.5.2  消息传递接口136
6.6  端口137
6.6.1  端口命名空间137
6.6.2  端口数据结构138
6.6.3  端口转换138
6.7  消息传递139
6.7.1  转换端口权利140
6.7.2  out-of-line内存141
6.7.3  控制流142
6.7.4  通知143
6.8  端口操作143
6.8.1  销毁端口143
6.8.2  备份端口144
6.8.3  端口集合144
6.8.4  端口插补145
6.9  扩展性145
6.10  Mach 3.0的增强146
6.10.1  一次性的发送权利147
6.10.2  Mach 3.0的通知147
6.10.3  发送权利的用户引用计数148
6.11  讨论148
6.12  小结149
6.13  练习题149
参考文献149
第7章  同步和多处理器151
7.1  简介151
7.2  传统UNIX内核里的同步机制152
7.2.1  中断屏蔽152
7.2.2  睡眠和唤醒152
7.2.3  传统方法的局限性153
7.3  多处理器系统154
7.3.1  内存模型154
7.3.2  同步支持155
7.3.3  软件体系架构156
7.4  多处理器的同步问题157
7.4.1  唤醒丢失问题157
7.4.2  惊群问题158
7.5  信号量158
7.5.1  信号量提供互斥操作159
7.5.2  使用信号量提供事件等待159
7.5.3  使用信号量来控制可计数的资源160
7.5.4  信号量的缺点160
7.5.5  Convoy161
7.6  自旋锁162
7.7  条件变量163
7.7.1  实现问题164
7.7.2  事件165
7.7.3  阻塞锁165
7.8  读写锁165
7.8.1  设计考虑165
7.8.2  实现166
7.9  引用计数167
7.10  其他考虑168
7.10.1  死锁避免168
7.10.2  递归锁169
7.10.3  阻塞还是自旋170
7.10.4  锁什么170
7.10.5  粒度和持续时间170
7.11  案例研究171
7.11.1  SVR4.2/MP171
7.11.2  Digital UNIX172
7.11.3  其他实现173
7.12  小结174
7.13  练习题174
参考文献175
第8章  文件系统接口和框架176
8.1  简介176
8.2  文件的用户接口176
8.2.1  文件和目录177
8.2.2  文件属性178
8.2.3  文件描述符179
8.2.4  文件I/O181
8.2.5  分散-聚集I/O182
8.2.6  文件锁机制183
8.3  文件系统183
8.4  特殊文件184
8.4.1  符号链接184
8.4.2  管道和FIFO185
8.5文件系统框架186
8.6Vnode/Vfs架构187
8.6.1目标187
8.6.2  从设备I/O得到的注解187
8.6.3  vnode/vfs接口概览190
8.7  实现概览191
8.7.1  目标191
8.7.2  Vnodes以及打开文件191
8.7.3  Vnode192
8.7.4  Vnode引用计数193
8.7.5  Vfs对象194
8.8  文件系统相关对象194
8.8.1  每个文件的私有数据194
8.8.2  vnodeops结构195
8.8.3  vfs层中文件系统相关部分196
8.9  挂载文件系统196
8.9.1  虚拟文件系统转换表196
8.9.2  mount函数实现197
8.9.3  VFS_MOUNT过程197
8.10  文件操作197
8.10.1  路径遍历198
8.10.2  目录名查找缓存199
8.10.3  VOP_LOOKUP操作199
8.10.4  打开文件200
8.10.5  文件I/O201
8.10.6  文件属性201
8.10.7  用户凭据201
8.11  分析202
8.11.1  SVR4系统实现的缺点202
8.11.2  4.4BSD模型203
8.11.3  OSF/1方法204
8.12  小结205
8.13  练习题205
参考文献206
第9章  文件系统的实现207
9.1  简介207
9.2  System V文件系统(s5fs)208
9.2.1  目录208
9.2.2  inode209
9.2.3  超级块210
9.3  s5fs内核组织211
9.3.1  内存inode211
9.3.2  inode查找212
9.3.3  文件I/O213
9.3.4  inode的分配和回收214
9.4  s5fs的分析215
9.5  伯克利快速文件系统(FFS)216
9.6  硬盘结构216
9.7  磁盘组织216
9.7.1  块和片段217
9.7.2  分配策略218
9.8  FFS的增强功能219
9.9  分析220
9.10  临时文件系统221
9.10.1  内存文件系统221
9.10.2  tmpfs文件系统222
9.11  特殊用途文件系统223
9.11.1  specfs文件系统223
9.11.2  /proc文件系统223
9.11.3  处理器文件系统225
9.11.4  Trans lucent文件系统225
9.12  旧的缓冲区缓存226
9.12.1  基本操作227
9.12.2  缓冲区头结构228
9.12.3  优点228
9.12.4  缺点228
9.12.5  保证文件系统的一致性229
9.13  小结230
9.14  练习题230
参考文献231
第10章  分布式文件系统232
10.1  简介232
10.2  分布式文件系统的一般特征232
10.3  网络文件系统233
10.3.1  用户视角234
10.3.2  设计目标235
10.3.3  NFS的组件235
10.3.4  无状态设计237
10.4  NFS协议集238
10.4.1  外部数据表示238
10.4.2  远程过程调用239
10.5  NFS实现240
10.5.1  控制流240
10.5.2  文件句柄241
10.5.3  挂载操作241
10.5.4  路径名的查找242
10.6  UNIX语义243
10.6.1  打开文件许可243
10.6.2  已打开文件的删除243
10.6.3  读写操作244
10.7  NFS性能244
10.7.1  性能瓶颈244
10.7.2  客户端缓存244
10.7.3  延迟写245
10.7.4  重传缓存246
10.8  专用NFS服务器247
10.8.1  Auspex的Functional Multiprocessor 架构247
10.8.2  IBM的HA-NFS服务器 248
10.9  NFS安全249
10.9.1  NFS访问控制249
10.9.2  UID重映射250
10.9.3  根用户重映射250
10.10  NFS版本3251
10.11  远程文件共享 252
10.12  RFS架构252
10.12.1  远程消息协议 253
10.12.2  有状态操作253
10.13  RFS实现 254
10.13.1  远程挂载254
10.13.2  RFS客户端和服务器 255
10.13.3  崩溃恢复255
10.13.4  其他问题256
10.14  客户端缓存256
10.15  Andrew文件系统258
10.15.1  可伸缩架构258
10.15.2  存储和命名空间的组织259
10.15.3  会话级语义260
10.16  AFS实现260
10.16.1  缓存与一致性261
10.16.2  路径名查找261
10.16.3  安全性262
10.17  AFS的不足262
10.18  DCE的分布式文件系统263
10.18.1  DFS架构263
10.18.2  缓存一致性264
10.18.3  令牌管理器265
10.18.4  DFS的其他服务266
10.18.5  分析266
10.19  小结267
10.20  练习题267
参考文献268
第11章  高级文件系统271
11.1  简介271
11.2  传统文件系统的局限271
11.2.1  FFS磁盘布局272
11.2.2  磁盘上写操作的主导273
11.2.3  元数据更新274
11.2.4  故障修复274
11.3  文件系统簇(SUN-FFS)275
11.4  日志方法276
11.5  日志结构文件系统277
11.6  4.4BSD日志结构文件系统277
11.6.1  日志写入278
11.6.2  数据检索279
11.6.3  崩溃恢复279
11.6.4  cleaner进程280
11.6.5  分析280
11.7  元数据日志281
11.7.1  正常操作282
11.7.2  日志的一致性283
11.7.3  崩溃恢复284
11.7.4  分析284
11.8  Episode文件系统285
11.8.1  基本抽象285
11.8.2  结构286
11.8.3  日志记录287
11.8.4  其他特性287
11.9  “看门狗”监视器288
11.9.1  目录的“看门狗”进程289
11.9.2  消息通道289
11.9.3  “看门狗”进程的应用290
11.10  4.4BSD的portal文件系统290
11.11  可堆叠文件系统层次291
11.11.1  框架和接口292
11.11.2  SunSoft 原型293
11.12  4.4BSD文件系统接口294
11.13  小结295
11.14  练习题295
参考文献296
第12章  内核内存分配298
12.1  简介298
12.2  功能需求299
12.3  资源映射分配器301
12.4  简单的幂空闲链表分配器303
12.5  McKusick-Karels分配器305
12.6  伙伴系统307
12.7  SVR4的惰性伙伴算法308
12.7.1  惰性合并309
12.7.2  SVR4的实现细节310
12.8  Mach和OSF/1的区块分配器310
12.8.1  垃圾回收311
12.8.2  分析312
12.9  一种针对多处理器系统的分层式分配器312
12.10  Solaris 2.4的Slab分配器314
12.10.1  复用对象314
12.10.2  利用硬件缓存315
12.10.3  分配器足迹315
12.10.4  设计与接口316
12.10.5  实现细节317
12.10.6  分析318
12.11  小结318
12.12  练习题319
参考文献320
第13章  虚拟内存321
13.1  简介321
13.2  按需分页324
13.2.1  功能需求324
13.2.2  虚拟地址空间325
13.2.3  页面的首次访问326
13.2.4  交换区326
13.2.5  转换映射327
13.2.6  页面替换策略328
13.3  对硬件的需求328
13.3.1  MMU缓存330
13.3.2  Intel 80x86 331
13.3.3  IBM RS/6000 333
13.3.4  MIPS R3000 335
13.4  4.3BSD—案例研究336
13.4.1  物理内存337
13.4.2  地址空间338
13.4.3  页在哪里339
13.4.4  交换空间 340
13.5  4.3 BSD 内存管理操作341
13.5.1  创建进程 341
13.5.2  缺页异常处理 342
13.5.3  空闲页面链表 344
13.5.4  交换 345
13.6  分析 346
13.7  练习题347
参考文献348
第14章  SVR4 VM架构349
14.1  简介349
14.2  内存映射文件349
14.3  VM的设计理念351
14.4  基础抽象352
14.4.1  物理内存353
14.4.2  地址空间353
14.4.3  地址映射354
14.4.4  匿名页355
14.4.5  硬件地址转换356
14.5  段驱动程序357
14.5.1  seg_vn357
14.5.2  seg_map 358
14.5.3  seg_dev359
14.5.4  seg_kmem359
14.5.5  seg_kp359
14.6  交换层359
14.7  VM操作361
14.7.1  创建新映射361
14.7.2  匿名页处理361
14.7.3  创建进程363
14.7.4  共享匿名页364
14.7.5  处理缺页异常364
14.7.6  共享内存365
14.7.7  其他组件366
14.8  与vnode子系统的交互367
14.8.1  对vnode接口的修改367
14.8.2  统一文件访问机制368
14.8.3  其他细节370
14.9  Solaris的虚拟交换空间370
14.9.1  交换空间扩展370
14.9.2  虚拟交换管理371
14.9.3  讨论372
14.10  分析372
14.11  性能改进374
14.11.1  缺页异常率偏高的原因374
14.11.2  SVR4对SunOS VM实现的改进375
14.11.3  结果与讨论375
14.12  小结376
14.13  练习题376
参考文献377
第15章  其他内存管理技术378
15.1  简介378
15.2  Mach的内存管理设计378
15.2.1  设计目标378
15.2.2  对外接口379
15.2.3  基础抽象380
15.3  内存共享机制381
15.3.1  写时复制共享382
15.3.2  读写共享 383
15.4  内存对象与Pager384
15.4.1  初始化内存对象384
15.4.2  内核与pager的接口384
15.4.3  内核与Pager的交互385
15.5  外部pager和内部pager386
15.6  页面替换388
15.7  分析389
15.8  4.4BSD的内存管理390
15.9  旁路转换缓冲区的一致性391
15.9.1  单处理器上的TLB一致性392
15.9.2  多处理器问题393
15.10  Mach中的TLB击落算法394
15.10.1  同步与死锁的避免395
15.10.2  讨论395
15.11  SVR4和SVR4.2 UNIX中的TLB一致性396
15.11.1  SVR4/MP396
15.11.2  SVR4.2/MP397
15.11.3  惰性击落算法397
15.11.4  立即击落算法398
15.11.5  讨论399
15.12  其他TLB一致性算法399
15.13  虚拟地址缓存400
15.13.1  修改映射401
15.13.2  地址别名402
15.13.3  DMA操作402
15.13.4  维护缓存一致性403
15.13.5  分析404
15.14  练习题404
参考文献405
第16章  设备驱动和I/O407
16.1  简介407
16.2  概述407
16.2.1  硬件配置408
16.2.2  设备中断409
16.3  设备驱动程序框架410
16.3.1  设备和驱动的分类410
16.3.2  调用驱动程序代码411
16.3.3  设备转换表412
16.3.4  驱动入口点函数413
16.4  输入输出(I/O)子系统414
16.4.1  主设备号和从设备号415
16.4.2  设备文件416
16.4.3  specfs文件系统417
16.4.4  通用snode结构418
16.4.5  设备克隆419
16.4.6  针对字符设备的I/O操作420
16.5  poll系统调用420
16.5.1  poll系统调用的实现421
16.5.2  BSD 4.3系统select系统调用422
16.6  块设备I/O操作423
16.6.1  buf数据结构424
16.6.2  与vnode结构的交互425
16.6.3  设备访问方法425
16.6.4  块设备的裸I/O427
16.7  DDI/DKI规范428
16.7.1  一般建议429
16.7.2  Section 3函数429
16.7.3  其他种类接口430
16.8  更新的SVR4发行版431
16.8.1  多处理器安全的驱动431
16.8.2  SVR4.1/ES的变化432
16.8.3  动态加载和卸载432
16.9  未来方向434
16.10  小结435
16.11  练习题435
参考文献436
第17章  STREAMS437
17.1  动机437
17.2  概述438
17.3  消息和队列439
17.3.1  消息440
17.3.2  虚拟复制440
17.3.3  消息类型441
17.3.4  队列和模块442
17.4  流I/O443
17.4.1  STREAMS调度程序444
17.4.2  优先级组445
17.4.3  流量控制445
17.4.4  驱动程序尾部446
17.4.5  流头447
17.5  配置和设置448
17.5.1  配置一个STREAMS模块或驱动程序448
17.5.2  打开流449
17.5.3  推送一个模块到流上451
17.5.4  克隆设备451
17.6  STREAMS的ioctl命令452
17.6.1  带有I_STR的ioctl命令处理452
17.6.2  透明的ioctl命令453
17.7  内存分配453
17.8  多路复用455
17.8.1  上部多路复用器455
17.8.2  下部多路复用器456
17.8.3  链接流456
17.8.4  数据流458
17.8.5  普通链接和持久链接458
17.9  FiFO和管道459
17.9.1  FiFO中STREAMS的应用459
17.9.2  使用STREAMS的管道460
17.10  网络接口461
17.10.1  传输提供者接口461
17.10.2  传输层接口462
17.10.3  socket463
17.10.4  SVR4的socket实现464
17.11  小结464
17.12  练习题465
参考文献466
摘要
前  言UNIX Internals: The New Frontiers从20世纪70年代早期开始,UNIX系统经历了相当大的变化。它从一个小的、实验室性质的由贝尔实验室几乎免费分发的操作系统开始,逐渐成长,直到当前拥有着一群不断增长的忠实的拥护者。多年来,它从众多的学术界和行业成员中吸收了很多贡献,忍受着在其所有权以及标准化上的争执,并且进化为稳定的、成熟的操作系统。现在,有许多商业的和研究用的UNIX变种系统,每种变种系统虽然都不同,但是又足够相似,可以作为UNIX系统家族中的一种。UNIX程序员对一种UNIX变种的使用经验可以用在很多硬件平台以及其他UNIX变种上。 很多图书已经介绍过UNIX系统的不同特性,但是大多数都只是介绍诸如命令行或编程接口这些用户可见的方面,很少能介绍UNIX系统的内部实现。UNIX系统的内部实现主要是指其核心组成的部分,也就是UNIX内核研究。迄今为止,每本UNIX系统内部实现书籍只针对某一种UNIX的发行版本。比如,Bach的《The Design of the UNIX Operating System》[Bach 86]是介绍System V Release 2(SVR2)版本内核的标志性书籍。Leffler等著的《The Design and Implementation of 4.3BSD UNIX Operating System》[Leff 88]由一些主要的操作系统设计者来详尽介绍4.3BSD版本内核。Goodheart和Cox的《The Magic Garden Explained》著作详细介绍了System V Release 4.0(SVR4)版本的内核。 设计视角本书从系统设计角度来审视UNIX内核。介绍了一些主流的商业性和研究性的UNIX变种。针对内核中的每个模块,本书探索其结构和设计,解释主流UNIX系统如何选择具体模块的实现方法,以及每种方法的优缺点。通过这样的对比使本书有着独特的视角,并允许读者从批判性的角度来检查系统的设计。在研究一个操作系统时,关注其优缺点是很重要的一部分。本书将通过分析一些可选的方法来介绍每种系统的优缺点。 UNIX变种虽然本书最关注SVR4.2的内核实现,但是也详细探索了4.4BSD、Solaris 2.x、Mach以及Digital Unix系统。而且本书介绍了一些其他变种的有趣特性,这主要包括一些没有进入商业发行版的研究性变种。本书分析了从20世纪80年代中期到90年代中期UNIX系统的主要发展。为了完整性,本书同时包含了对传统UNIX功能和实现的简要介绍。在必要时,本书还提供了一个发展记录,以传统方案为起始,分析其缺点和局限并介绍现代的解决方案。 阅读对象本书适合作为大学教材或作为专业参考书。作为大学教材,本书适用于高年级本科生或研究生操作系统课程。本书并非一本介绍性书籍,而且不会说明诸如内核、线程以及虚拟内存这样的概念性知识。每章都包含一系列精心设计的练习题,用于进一步地思考和研究系统设计。许多练习题都是开放性的,并且需要学生进行一些额外的阅读研究。每章也有一个详尽的参考文献清单,通过该清单可以进一步阅读有关内容。 本书也可用作操作系统开发人员、应用程序开发人员以及系统管理员的专业参考书籍。操作系统设计者和架构师可以研究相近系统的内核结构、评估不同设计的优缺点以及使用本书中的一些想法来开发下一代操作系统。应用程序开发人员可以使用操作系统内核的知识,更好地利用其特征来开发更加高效的程序。系统管理员可以在理解不同参数和使用模式对系统行为的影响之后,更加有效地配置和调整系统。 组织结构第1章追溯了UNIX系统的演变并分析了影响系统主要变化的因素。第2章到第7章介绍了进程子系统。其中第2章介绍在传统UNIX系统中(SVR3、4.3BSD和早期变种)的进程和内核架构。第3章到第7章介绍现代系统(SVR4、4.4BSD、Solaris 2.x以及Digital Unix)的特性。第3章讨论线程及其在内核和用户库中如何实现。第4章介绍信号、作业控制以及登录会话管理。第5章介绍UNIX调度器和对实时应用程序的支持。第6章研究进程间通信的技术(IPC),包括System V IPS的特性集。其中还介绍了Mach系统架构,该系统使用IPC作为最基本的原语来构造内核。第7章讨论在现代单处理器和多处理器系统中应用的同步框架。 接下来的四章介绍了文件系统。第8章介绍用户可见的文件系统接口,以及定义了内核和文件系统交互的vnode/vfs接口。第9章提供一些具体的文件系统实现细节,包含原始的System V文件系统(s5fs)、伯克利快速文件系统(FFS)以及一些小的、利用vnode/vfs接口提供服务的特殊用途的文件系统。第10章介绍一些分布式文件系统,比如太阳微系统公司的网络文件系统(NFS)、AT&T的远程文件共享(RFS)、卡内基梅隆大学的Andrew文件系统(AFS)以及Transarc公司的分布式文件系统(DFS)。第11章介绍一些使用日志提供更高可靠性和性能的高级文件系统,同时介绍一种基于可堆叠vnode层的新文件系统框架。 第12章~第15章介绍内存管理。第12章讨论内核内存分配并介绍一些有趣的分配算法。第13章介绍虚拟内存的概念并使用4.3BSD的实现来说明一些问题。第14章介绍SVR4和Solaris的虚拟内存架构。第15章介绍Mach和4.4BSD内存模型,同时分析诸如旁路转换缓冲区和虚拟地址缓存等硬件特性的影响。 最后两章主要介绍I/O子系统。第16章介绍设备驱动程序框架、内核与I/O子系统的交互、SVR4设备驱动程序接口以及内核与驱动程序交互接口规范。第17章讨论STREAMS框架,用于开发网络协议、网络驱动程序和终端驱动程序。 排版约定我在本书中遵循了一些印刷规范。首次出现的术语或概念用楷体。内部内核函数和变量名字以及代码示例都是等宽字体,比如ufs_lookup()。当指定调用语法时,系统调用名是斜体,而参数是等宽字体。在图中,实线箭头代表直接指针,虚线箭头表明箭头的源和目标对象是间接推论的。 尽管我做了最大的努力,但错误和疏忽仍然在所难免。如果你发现有什么错误,或者有任何建议,请通过电子邮件(vahalia@acm.org)发送给我。 致谢许多人为本书的出版做出了贡献。首先,我想感谢我的儿子Rohan以及我的妻子Archana,他们的耐心、爱以及无私的奉献使我得以完成本书。我利用了本属于他们的周末和夜晚时间来进行写作,而他们给予我的一向都是微笑并一直鼓励我。我也要感谢父母对我的爱和支持。 接下来,我要感谢我的朋友Subodh Bapat,他鼓励我承担这本书的写作工作,并花费大量时间给出了专业性建议和持续性激励,非常感谢他允许我使用他的书(《Object-Oriented Networks》[Bapa 94])中提到的工具、模块和宏,还要感谢他对我的草稿一丝不苟的审核以及对我在写作风格上清晰的指导。 许多审稿人贡献了非常多的时间和专业知识并多次审稿,提供了非常有价值的意见和建议,使得本书的质量有了提升。非常感谢Peter Salus的鼓励和支持以及Benson Marguiles、Terry Lambert、Mark Ellis和William Bully有深度的反馈意见。最后也要感谢Keith Bostic、Evi Nemeth、Pat Parseghian、Steven Rago、Margo Seltzer、Richard Stevens以及Lev Vaitzblit审核了本书的部分章节。 我还要感谢我的经理Percy Tzelnic对我在写作本书过程中的支持和理解。最后,我要感谢出版人Alan Apt,是他促成了本书,并在每个阶段都提供了帮助。还要感谢Prentice-Hall和Spectrum Publisher Services出版社的团队成员,特别感谢Shirlery McGuire、Sondra Chavez和Kelly Ricci的支持和帮助。

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网