UNIX 高级教程--系统技术内幕
内容简介:
内容提要 本书从系统设计的角度讲述UNIX操作系统技术内幕。 全书介绍了各种商用的和研究性的UNIX变体,对每一个核心部件,探究其结构和设计,然 后讲述大部分的系统是如何实现这些部件的以及各种实现方案的优缺点。它使读者以一种审视 的眼光考察系统,这种比较方法是本书的独到之处。 全书内容共分17章。第1章~第2章追溯UNIX系统的发展,介绍传统UNIX的进程和内 核结构。第3章~第7章介绍SVR4,4.4BSD,Solaris2.x及DigitalUNIX等现代UNIX系统的 特征。第8章~第11章讨论文件系统。第12章~第15章介绍内存管理。最后两章讨论I/o系 统。本书每一章都附有练习和参考文献,启发读者进一步的思考和研究,加深了解系统设计。 本书适于作为高年级本科生和研究生操作系统课教材,也可供操作系统开发人员及系统管 理员参考使用。
目录:
目 第1章 简介 1.1 简介 1.1.1 简史 1.1.2 创始之初 1.1.3 繁衍 1.1.4 BSD 1.1.5 SystemV 1.1.6 商业化 1.1.7 Mach 1.1.8 标准 1.1.9 OsF和UI 1.1.10 SVR4及其之后 1.2 演变的动力 1.2.1 功能 1.2.2 网络 1.2.3 性能 1.2.4 硬件变化 1.2.5 改进质量 1.2.6 模式变化 1.2.7 其他应用领域 1.2.8 简洁就是美 1.2.9 灵活性 1.3 回顾与展望 1.3.1 UNIX好在哪里 1.3.2 UNIX的误区在哪儿 1.4 本书的范围 1.5 参考文献 第2章 进程与内核 2.1 简介 2.2 模式,空间和上下文 2.3 进程抽象 2.3.1 进程状态 2.3.2 进程上下文 2.3.3 用户凭证 2.3.4 u区和proc结构 2.4 内核态下运行 2.4.1 系统调用接口 2.4.2 中断处理 2.5 同步 2.5.1 阻塞操作 2.5.2 中断 2.5.3 多处理器 2.6 进程调度 2.7 信号 2.8 新进程和程序 2.8.1 fork和exec 2.8.2 进程创建 2.8.3 fork优化 2.8.4 执行一个新程序 2.8.5 进程终止 2.8.6 等待进程终止 2.8.7 僵尸(Zombie)进程 2.9 小结 2.10 练习 2.11 参考文献 第3章 线程和轻量级进程 3.1 简介 3.1.1 动机 3.1.2 多线程和多处理器 3.1.3 并发和并行 3.2 基本抽象概念 3.2.1 内核线程 3.2.2 轻量级进程 3.2.3 用户线程 3.3 轻量级进程设计――要考虑的问题 3.3.1 fork的语义 3.3.2 其他的系统调用 3.3.3 信号传递和处理 3.3.4 可视性 3.3.5 堆栈增长 3.4 用户级线程库 3.4.1 编程接口 3.4.2 线程库的实现 3.5 调度器调用 3.6 Solaris和sVR4的多线程处理 3.6.1 内核线程 3.6.2 轻量级进程的实现 3.6.3 用户线程 3.6.4 用户线程的实现 3.6.5 中断处理 3.6.6 系统调用处理 3.7 Mach中的线程 3.7.1 Mach的抽象概念――任务和线程 3.7.2 Mach的C-threads 3.8 DigitalUNIX 3.8.1 UNIX接口 3.8.2 系统调用和信号 3.8.3 pthreads线程库 3.9 Mach3.0的续体 3.9.1 编程模型 3.9.2 使用续体 3.9.3 优化 3.9.4 分析 3.10 小结 3.11 练习 3.12 参考文献 第4章 信号和会话管理 4.1 简介 4.2 信号生成和处理 4.2.1 信号处理 4.2.2 信号生成 4.2.3 典型情景 4.2.4 睡眠和信号 4.3 不可靠信号 4.4 可靠的信号 4.4.1 主要特性 4.4.2 sVR3的实现 4.4.3 BSD信号管理 4.5 sVR4信号机制 4.6 信号机制的实现 4.6.1 信号生成 4.6.2 信号传递和处理 4.7 异常 4.8 Mach中的异常处理 4.8.1 异常端口 4.8.2 错误处理 4.8.3 调试器的交互 4.8.4 分析 4.9 进程组和终端管理 4.9.1 基本概念 4.9.2 SVR3模型 4.9.3 局限性 4.9.4 4.3BSD中的进程组和终端 4.9.5 缺点 4.10 sVR4会话的体系结构 4.10.1 目的(动机) 4.10.2 会话和进程组 4.10.3 数据结构 4.10.4 控制终端 4.10.5 4.4BSD中会话的实现 4.11 小结 4.12 练习 4.13 参考文献 第5章 进程调度 5.1 简介 5.2 时钟中断处理 5.2.1 调出链表 5.2.2 报警 5.3 调度器的目标 5.4 传统的UNIX调度 5.4.1 进程优先级 5.4.2 调度器的实现 5.4.3 运行队列管理 5.4.4 分析 5.5 SVR4的调度器 5.5.1 类无关层 5.5.2 调度类的接口 5.5.3 分时类 5.5.4 实时类 5.5.5 系统调用priocntl 5.5.6 分析 5.6 Solaris2.x调度的改善 5.6.1 抢占式内核 5.6.2 多处理器的支持 5.6.3 隐式调度 5.6.4 优先级逆转 5.6.5 优先级继承的实现 5.6.6 优先继承的局限性 5.6.7 Turnstiles 5.6.8 分析 5.7 mach中的调度 5.7.1 多处理器的支持 5.8 DigitalUNIX的实时调度器 5.8.1 多处理器支持 5.9 其他的一些调度实现 5.9.1 fair-share调度 5.9.2 最终期限驱动调度 5.9.3 三级(ThreeLevel)调度器 5.10 小结 5.11 练习 5.12 参考文献 第6章 进程间通信 6.1 简介 6.2 通用IPC方法 6.2.1 信号 6.2.2 管道 6.2.3 3VR4的管道 6.2.4 进程跟踪 6.3 SystemV的进程间通信 6.3.1 公共元素 6.3.2 信号量 6.3.3 消息队列 6.3.4 共享内存 6.3.5 讨论 6.4 MachIPC 6.4.1 基本概念 6.5 消息 6.5.1 消息的数据结构 6.5.2 消息传递接口 6.6 端口 6.6.1 端口名字空间 6.6.2 端口数据结构 6.6.3 端口变换 6.7 消息传递 6.7.1 端口权力的传递 6.7.2 脱机内存 6.7.3 控制流 6.7.4 通知 6.8 端口操作 6.8.1 释放一个端口 6.8.2 备份端口 6.8.3 端口集合 6.8.4 端口的添加 6.9 扩展性 6.10 Mach3.0的改进 6.10.1 一次发送权 6.10.2 Mach3.0的通知 6.10.3 发送权的用户引用记数 6.11 讨论 6.12 小结 6.13 练习 6.14 参考文献 第7章 同步和多处理器 7.1 简介 7.2 传统UNIX内核中的同步 7.2.1 中断屏蔽 7.2.2 睡眠和唤醒 7.2.3 传统方法的局限性 7.3 多处理器系统 7.3.1 内存模型 7.3.2 同步支持 7.3.3 软件体系结构 7.4 多处理器同步问题 7.4.1 唤醒丢失问题 7.4.2 巨群问题 7.5 信号灯 7.5.1 提供互斥访问的信号灯 7.5.2 使用的信号灯的事件等待 7.5.3 用于控制可计数资源的信号灯 7.5.4 信号灯的缺点 7.5.5 护卫 7.6 自旋锁 7.6.1 自旋锁的使用 7.7 条件变量 7.7.1 实现问题 7.7.2 事件 7.7.3 阻塞锁 7.8 读写锁 7.8.1 设计考虑 7.8.2 实现 7.9 引用计数 7.10 其他考虑 7.10.1 死锁避免 7.10.2 递归锁 7.10.3 阻塞还是自旋 7.10.4 锁什么 7.10.5 粒度和持续时间 7.11 例子分析 7.11.1 SVR4.2/MP 7.11.2 DigitalUNIX 7.11.3 其他实现 7.12 小结 7.13 练习 7.14 参考文献 第8章 文件系统接口和框架 8.1 简介 8.2 文件的用户接口 8.2.1 文件和目录 8.2.2 文件属性 8.2.3 文件描述符 8.2.4 文件I/O 8.2.5 分散聚集I/O(Scatter-GatherI/O) 8.2.6 文件加锁 8.3 文件系统 8.3.1 逻辑磁盘 8.4 特殊文件 8.4.1 符号链接 8.4.2 管道和FIFO 8.5 文件系统框架 8.6 vnode/vfs体系结构 8.6.1 目标 8.6.2 设备I/O的经验 8.6.3 vnode/vfs接口概述 8.7 实现概述 8.7.1 目标 8.7.2 v节点和打开文件 8.7.3 v节点 8.7.4 v节点引用计数 8.7.5 vfs对象 8.8 文件系统相关对象 8.8.1 每个文件的私有数据 8.8.2 vnodeops向量 8.8.3 vfs层中的文件系统相关部分 8.9 安装一个文件系统 8.9.1 虚拟文件系统转换 8.9.2 mount的实现 8.9.3 VFS-MOUNT处理 8.10 对文件的操作 8.10.1 路径名遍历 8.10.2 目录查找缓存 8.10.3 VOP-LOOKUP操作 8.10.4 打开文件 8.10.5 文件I/O 8.10.6 文件属性 8.10.7 用户凭证 8.11 分析 8.11.1 SVR4实现的缺点 8.11.2 4.4BSD模型 8.11.3 OSF/1方法 8.12 小结 8.13 练习 8.14 参考文献 第9章 文件系统实现 9.1 简介 9.2 Systemv文件系统(s5fs) 9.2.1 目录 9.2.2 i节点 9.2.3 超级块 9.3 s5fs内核组织 9.3.1 内存i节点 9.3.2 i节点查找 9.3.3 文件I/O 9.3.4 i节点的分配与回收 9.4 对s55fs的分析 9.5 伯克利快速文件系统(FFS) 9.6 硬盘结构 9.7 磁盘组织 9.7.1 块和碎片 9.7.2 分配策略 9.8 FFS的增强功能 9.9 分析 9.10 临时文件系统 9.10.1 内存文件系统 9.10.2 tmpfs文件系统 9.11 特殊目的文件系统 9.11.1 specfs文件系统 9.11.2 /proc文件系统 9.11.3 处理器文件系统 9.11.4 半透明文件系统 9.12 以往的磁盘缓存 9.12.1 基本操作 9.12.2 缓冲区头结构 9.12.3 优点 9.12.4 缺点 9.12.5 保证文件系统的一致性 9.13 小结 9.14 练习 9.15 参考文献 第10章 分布式文件系统 10.1 简介 10.2 分布式文件系统的一般特征 10.2.1 设计考虑 10.3 网络文件系统(NFS) 10.3.1 用户透视 10.3.2 设计目标 10.3.3 NFS组成 10.3.4 无状态 10.4 协议族 10.4.1 扩展数据表示(XDR) 10.4.2 远程过程调用(RPC) 10.5 NFS实现 10.5.1 控制流 10.5.2 文件句柄 10.5.3 Mount操作 10.5.4 路径名查找 10.6 UNIX语义 10.6.1 打开文件权限 10.6.2 删除打开文件 10.6.3 读和写 10.7 NFS性能 10.7.1 性能瓶颈 10.7.2 客户端高速缓存 10.7.3 延迟写 10.7.4 重传高速缓存 10.8 专用NFS服务器 10.8.1 Auspex功能性多处理器结构 10.8.2 IBM的HA-NFS服务器 10.9 NFS安全性 10.9.1 NFS访问控制 10.9.2 UID重新映射 10.9.3 root重新映射 10.10 NFSV3 10.11 远程文件共享(RFS)文件系统 10.12 RFS结构 10.12.1 远程消息协议 10.12.2 有状态操作 10.13 RFs实现 10.13.1 远程安装 10.13.2 RFs客户和服务器 10.13.3 崩溃恢复 10.13.4 其他问题 10.14 客户端高速缓存 10.14.1 高速缓存一致性 10.15 Andrew文件系统 10.15.1 可扩展的结构 10.15.2 存储和名字空间组织 10.15.3 会话语义 10.16 AFS实现 10.16.1 缓存以及一致性 10.16.2 路径名查找 10.16.3 安全性 10.17 AFS的缺陷 10.18 DCE分布式文件系统(DCEDFS) 10.18.1 DFS体系结构 10.18.2 高速缓冲区一致性 10.18.3 令牌管理器 10.18.4 其他DFS服务 10.18.5 分析 10.19 小结 10.20 练习 10.21 参考文献 第11章 高级文件系统 11.1 简介 11.2 传统文件系统的局限 11.2.1 FFS磁盘布局 11.2.2 写的主导性 11.2.3 元数据更新 11.2.4 崩溃恢复 11.3 文件系统成簇(SunFFS) 11.4 日志方法 11.4.1 基本特征 11.5 日志结构文件系统 11.6 4.4BSD日志文件系统 11.6.1 写日志 11.6.2 数据检索 11.6.3 崩溃恢复 11.6.4 清除进程 11.6.5 分析 11.7 元数据日志 11.7.1 正常操作 11.7.2 日志的一致性 11.7.3 崩溃恢复 11.7.4 分析 11.8 Episode文件系统 11.8.1 基本抽象 11.8.2 结构 11.8.3 记日志 11.8.4 其他特性 11.9 监视器(watchdog) 11.9.1 目录监视器 11.9.2 消息通道 11.9.3 应用 11.10 4.4BSD端口文件系统 11.10.1 使用端口(portals) 11.11 堆栈式文件系统层 11.11.1 框架和接口 11.11.2 SunSoft原型 11.12 4.4BSD文件系统接口 11.12.1 Nullfs和UnionMount文件系统 11.13 小结 11.14 练习 11.15 参考文献 第12章 内核内存管理 12.1 简介 12.2 功能需求 12.2.1 评估标准 12.3 资源映射图分配器 12.3.1 分析 12.4 简单2次幂空闲表 12.4.1 分析 12.5 McKusick-Karels分配器 12.5.1 分析 12.6 伙伴系统 12.6.1 分析 12.7 SVR4LaZy伙伴算法 12.7.1 LaZy合并 12.7.2 SVR4实现细节 12.8 Mach-OSF/1的Zone分配器 12.8.1 垃圾收集 12.8.2 分析 12.9 多处理器的分层分配器 12.9.1 分析 12.10 Solaris2.4的SLab分配器 12.10.1 对象复用 12.10.2 硬件Cache利用率 12.10.3 分配器footprint 12.10.4 设计与接口 12.10.5 实现 12.10.6 分析 12.11 小结 12.12 练习 12.13 参考文献 第13章 虚存 13.1 简介 13.1.1 内存管理的石器时代 13.2 分页 13.2.1 功能需求 13.2.2 虚拟地址空间 13.2.3 页面初始访问 13.2.4 交换区 13.2.5 转换映射图 13.2.6 页面替换策略 13.3 硬件需求 13.3.1 MMU缓存 13.3.2 Inte!80x86 13.3.3 IBMRS/6000 13.3.4 MIPSR3000 13.4 4.3BSD实例研究 13.4.1 物理内存 13.4.2 地址空间 13.4.3 页面在哪里 13.4.4 交换区 13.5 4.3BSD内存管理操作 13.5.1 创建进程 13.5.2 页面失效处理 13.5.3 空闲页面链表 13.5.4 交换 13.6 分析 13.7 练习 13.8 参考文献 第14章 SVR4VM体系结构 14.1 动机 14.2 内存映射文件 14.2.1 mmap及相关系统调382用 14.3 VM设计原理 14.4 基本抽象概念 14.4.1 物理内存 14.4.2 地址空间 14.4.3 地址映射 14.4.4 匿名页面 14.4.5 硬件地址转换 14.5 段驱动程序 14.5.1 seg-vn 14.5.2 seg-map 14.5.3 seg-dev 14.5.4 segkmem 14.5.5 segkp 14.6 交换层 14.7 VM操作 14.7.1 创建一个新映射 14.7.2 匿名页面处理 14.7.3 创建进程 14.7.4 共享匿名页面 14.7.5 页面失效处理 14.7.6 共享内存 14.7.7 其他部件 14.8 与v节点 子系统的交互 14.8.1 v节点接口变化 14.8.2 统一的文件访问 14.8.3 其他问题 14.9 Solaris中的虚拟交换空间 14.9.1 扩展交换空间 14.9.2 虚交换管理 14.9.3 讨论 14.10 分析 14.11 性能改进 14.11.1 高失效率原因 14.11.2 SVR4对SunOSVM实现的改进 14.11.3 结果与讨论 14.12 小结 14.13 练习 14.14 参考文献 第15章 进一步关于内存管理的主题 15.1 简介 15.2 Mach的内存管理设计 15.2.1 设计目标 15.2.2 编程接口 15.2.3 基本抽象概念 15.3 共享内存设施 15.3.1 copy-onwrite共享 15.3.2 读写共享 15.4 内存对象和Pager 15.4.1 内存对象初始化 15.4.2 内核与Pager间的接口 15.4.3 内核与pager交互 15.5 外部pager和内部pager 15.5.1 一个网络共享内存服务器 15.6 页面替换 15.7 分析 15.8 4.4BSD的内存管理 15.9 快表(TLB)一致性 15.9.1 单处理机上的TLB一致性 15.9.2 多处理机问题 15.10 Ma ch的TLB击落算法 15.10.1 同步和死锁避免 15.10.2 讨论 15.11 SVR4和SVR4.2UNIX中的TLB一致性 15.11.1 SVR4/MP 15.11.2 SVR4.2/MP 15.11.3 Lazy击落算法 15.11.4 立即击落 15.11.5 讨论 15.12 其他TLB 一致性算法 15.13 虚地址缓存 15.13.1 映射变化 15.13.2 地址别名 15.13.3 DMA操作 15.13.4 维护缓存一致性 15.13.5 分析 15.14 练习 15.15 参考文献 第16章 设备驱动程序I/0 16.1 简介 16.2 概述 16.2.1 硬件配置 16.2.2 设备中断 16.3 设备驱动程序框架 16.3.1 设备和驱动程序分类 16.3.2 调用驱动程序代码 16.3.3 设备开关表 16.3.4 驱动程序入口点 16.4 I/O子系统 16.4.1 主、次设备号 16.4.2 设备文件 16.4.3 specfs文件系统 16.4.4 公共snode 16.4.5 设备克隆 16.4.6 字符设备I/O 16.5 poll系统调用 16.5.1 poll的实现 16.5.2 4.3BsDselect系统调用 16.6 块I/O 16.6.1 buf结构 16.6.2 与v节点的交互 16.6.3 设备访问方法 16.6.4 到块设备的rawI/O 16.7 DDI/DKI说明 16.7.1 建议 16.7.2 第三部分函数 16.7.3 其他部分 16.8 新的sVR4 版本 16.8.1 多处理器可靠驱动程序 16.8.2 SVR4.1/ES的变化 16.8.3 动态加载和卸载 16.9 发展趋势 16.10 小结 16.11 练习 16.12 参考文献 第17章 流 17.1 目的 17.2 概述 17.3 消息和队列 17.3.1 消息 17.3.2 虚拟拷贝 17.3.3 消息类型 17.3.4 队列和模块 17.4 流I/O 17.4.1 STREAMS调度程序 17.4.2 优先带(PriorityBands) 17.4.3 流量控制 17.4.4 驱动程序尾 17.4.5 流头 17.5 配置和设置 17.5.1 配置一个模块或驱动程序 17.5.2 打开流 17.5.3 插入(Pushing)模块 17.5.4 克隆设备 17.6 STREAMSioctl 17.6.1 I-STRioctl处理 17.6.2 透明ioctl 17.7 内存分配 17.7.1 扩展sTREAMS缓冲区 17.8 多路复用 17.8.1 上部多路复用器 17.8.2 下部多路复用器 17.8.3 链接流 17.8.4 数据流 17.8.5 普通链接和持久链接 17.9 FIFO和管道 17.9.1 STREAMsFIFO 17.9.2 STREAMS管道 17.10 网络接口 17.10.1 传输供应者接口(TpI) 17.10.2 传输层接口(TLI) 17.10.3 sockets 17.10.4 SVR4Socket实现 17.11 小结 17.12 练习 17.13 参考文献
评论