本书以UNIX系统V为背景,全面、系统地介绍了UNIX操作系统内核的内部数据结构和算法。本书首先对系统内核结构做了简要介绍,然后分章节描述了文件系统、进程调度和存储管理,并在此基础上讨论了UNIX系统的高级问题,如驱动程序接口、进程间通讯与网络等。\r\n 本书可作为大学计算机科学系高年级学生和研究生的教材或参考书,也为从事UNIX系统研究与实用程序开发人员提供了一本极有价值的参考资料。\r\n\r\n
第1章 系统概貌\r\n\r\n1.1 历史\r\n1.2 系统结构\r\n1.3 用户看法\r\n1.3.1 文件系统\r\n1.3.2 处理环境\r\n1.3.3 构件原语\r\n1.4 操作系统服务\r\n1.5 关于硬件的假设\r\n1.5.1 中断与例外\r\n1.5.2 处理机执行级\r\n1.5.3 存储管理\r\n1.6 本章小结\r\n\r\n第2章 内核导言\r\n\r\n2.1 UNIX操作系统的体系结构\r\n2.2 系统概念介绍\r\n2.2.1 文件子系统概貌\r\n2.2.2 进程\r\n2.3 内核数据结构\r\n2.4 系统管理\r\n2.5 本章小结\r\n2.6 习题\r\n\r\n第3章 数据缓冲区高速缓冲\r\n\r\n3.1 缓冲头部\r\n3.2 缓冲地的结构\r\n3.3 缓冲区的检索\r\n3.4 读磁盘块与写磁盘块\r\n3.5 高速缓冲的优点与缺点\r\n3.6 本章小结\r\n3.7 习题\r\n\r\n第4章 文件的内部表示\r\n\r\n4.1 索引节点\r\n4.1.1 定义\r\n4.1.2 对索引节点的存取\r\n4.1.3 释放素引节点\r\n4.2 正规文件的结构\r\n4.3 目录\r\n4.4 路径名到索引节点的转换\r\n4.5 超级块\r\n4.6 为新文件分配索引节点\r\n4.7 磁盘块的分配\r\n4.8 其他文件类型\r\n4.9 本章小结\r\n4.10 习题\r\n\r\n第5章 文件系统的系统调用\r\n\r\n5.1 系统调用open\r\n5.2 系统调用read\r\n5.3 系统调用write\r\n5.4 文件和记录的上锁\r\n5.5 文件的输入/输出位置的调整——lseek\r\n5.6 系统调用close\r\n5.7 文件的建立\r\n5.8 特殊文件的建立\r\n5.9 改变目录及根\r\n5.10 改变所有者及许可权方式\r\n5.11 系统调用stat和fstat\r\n5.12 管道\r\n5.12.1 系统调用pipe\r\n5.12.2 有名管道的打开\r\n5.12.3 管道的读和写\r\n5.12.4 管道的关闭\r\n5.12.5 例\r\n5.13 系统调用dup\r\n5.14 文件系统的安装和拆卸\r\n5.14.1 在文件路径名中跨越安装点\r\n5.14.2 文件系统的拆卸\r\n5.15 系统调用link\r\n5.16 系统调用unlink\r\n5.16.1 文件系统的一致性\r\n5.16.2 竞争条件\r\n5.17 文件系统的抽象\r\n5.18 文件系统维护\r\n5.19 本章小结\r\n5.20 习题\r\n\r\n第6章 进程结构\r\n\r\n6.1 进程的状态和状态的转换\r\n6.2 系统存储方案\r\n6.2.1 区\r\n6.2.2 页和页表\r\n6.2.3 内核的安排\r\n6.2.4 u区\r\n6.3 进程的上下文\r\n6.4 进程上下文的保存\r\n6.4.1 中断和例外\r\n6.4.2 系统调用的接口\r\n6.4.3 上下文切换\r\n6.4.4 为废弃返回(abortive return)而保存上下文\r\n6.4.5 在系统和用户地址空间之间拷贝数据\r\n6.5 进程地址空间的管理\r\n6.5.1 区的上锁和解锁\r\n6.5.2 区的分配\r\n6.5.3 区附接到进程\r\n6.5.4 区大小的改变\r\n6.5.5 区的装入\r\n6.5.6 区的释放\r\n6.5.7 区与过程的断接\r\n6.5.8 区的复制\r\n6.6 睡眠\r\n6.6.1 睡眠事件及其地址\r\n6.6.2 算法sleep和wakeup\r\n6.7 本章小结\r\n6.8 习题\r\n\r\n第7章 进程控制\r\n\r\n7.1 进程的创建\r\n7.2 软中断信号\r\n7.2.1 软中断信号的处理\r\n7.2.2 进程组\r\n7.2.3 从过程发送软中断信号\r\n7.3 进程的终止\r\n7.4 等待进程的终止\r\n7.5 对其他程序的引用\r\n7.6 进程的用户标识号\r\n7.7 改变过程的大小\r\n7.8 shell程序\r\n7.9 系统自举和进程init\r\n7.10 本章小结\r\n7.11 习题\r\n\r\n第8章 进程调度和时间\r\n\r\n8.1 进程调度\r\n8.1.1 算法\r\n8.1.2 调度参数\r\n8.1.3 进程调度的例子\r\n8.1.4 进程优先权的控制\r\n8.1.5 公平共事调度\r\n8.1.6 实时处理\r\n8.2 有关时间的系统调用\r\n8.3 时钟\r\n8.3.1 重新启动时钟\r\n8.3.2 系统的内部定时\r\n8.3.3 直方图分析\r\n8.3.4 记帐和统计\r\n8.3.5 计时\r\n8.4 本章小结\r\n8.5 习题\r\n\r\n第9章 存储管理策略\r\n\r\n9.1 对换\r\n9.1.1 对换空间的分配\r\n9.1.2 进程的换出\r\n9.1.3 进程的换入\r\n9.2 请求调页\r\n9.2.1 请求调页的数据结构\r\n9.2.2 偷页进程\r\n9.2.3 页面错\r\n9.2.4 在简单硬件支持下的请求调页系统\r\n9.3 对换和请求调页的混合系统\r\n9.4 本章小结\r\n9.5 习题\r\n\r\n第10章 输入/输出子系统\r\n\r\n10.1 驱动程序接口\r\n10.1.1 系统配置\r\n10.1.2 系统调用与驱动程序接口\r\n10.1.3 中断处理程序\r\n10.2 磁盘驱动程序\r\n10.3 终端驱动程序\r\n10.3.1 字符表clist\r\n10.3.2 标准方式下的终端驱动程序\r\n10.3.3 原始方式下的终端驱动程序\r\n10.3.4 终端探询\r\n10.3.5 建立控制终端\r\n10.3.6 间接终端驱动程序\r\n10.3.7 注册到系统\r\n10.4 流\r\n10.4.1 流的详细的示例\r\n10.4.2 对流的分析\r\n10.5 本章小结\r\n10.6 习题\r\n\r\n第11章 进程间通信\r\n\r\n11.1 进程跟踪\r\n11.2 系统V IPC\r\n11.2.1 消息\r\n11.2.2 共享存储区\r\n11.2.3 信号量\r\n11.2.4 总的评价\r\n11.3 网络通信\r\n11.4 套接字\r\n11.5 本章小结\r\n11.6 习题\r\n\r\n第12章 多处理机系统\r\n\r\n12.1 多处理机系统的问题\r\n12.2 主从处理机解决方法\r\n12.3 信号量解决方法\r\n12.3.1 信号量定义\r\n12.3.2 信号量实现\r\n12.3.3 几个算法\r\n12.4 Tunis系统\r\n12.5 性能局限性\r\n12.6 习题\r\n\r\n第13章 分布式UNIX系统\r\n\r\n13.1 卫星处理机系统\r\n13.2 纽卡斯尔连接\r\n13.3 透明型分布式文件系统\r\n13.4 无存根进程的透明分布式模型\r\n13.5 本章小结\r\n13.6 习题\r\n\r\n附录A 系统调用\r\n\r\n参考文献\r\n索引
UNIX系统是由KenThompson和DennisRitchie于1974年在《ACM通讯》中的一篇文章中首次提出的[Thompson 74L从那时起,UNIX系统得到迅速传播并在计算机工业中得到广泛采用。越来越多的计算机厂家在他们的机器上提供对UNIX系统的支持。UNIX系统在大学里尤其普遍,它通常被用于操作系统的研究及实例分析。
许多专著和文章曾讨论了系统的各个部分,其中有《贝尔系统技术杂志》1978年和1984年的两个专刊[BSTJ 78)[BLTJ 84)。还有许多书介绍了UNIX系统的用户接口,特别是如何使用电子邮件、如何准备文件及如何使用称为“shell”的命令解释程序等; 《The UNIX Programming Environment》[Kernighan 84](该书已由机械工业出版社引进出版,中译本名为《UNIX编程环境》)和《Advanced UNIX Programming》[Rochkind 85]等书讨论了程序设计环境。本书则着重描述构成操作系统基础(称为内核)的内部算法和数据结构以及它们与程序员接口之间的关系。因此,本书适用于几种环境。首先,它可用作高年级本科生或一年级研究生的操作系统课程的教材。使用本书的同时若能参考系统源代码则将获益匪浅,但也可以独立地学习本书。其次,系统程序员可将本书作为参考书,从而能更好地理解内核是如何工作的,并可以将UNIX系统中采用的算法与其他操作系统的算法加以比较。最后,UNIX系统上的程序员能够更深入地了解他们的程序是如何与系统相互作用的,从而编出更有效、更高级的程序。
本书的内容及组织形式取自我在AT&T贝尔实验室在1983年和1984年期间讲授的一门课程。尽管这门课集中于阅读系统源代码,但我发现一旦掌握了算法的基本思想,源代码的阅读和理解就会容易得多。在本书里,我已努力使算法的描述尽可能地简单,从而反映出算法所描述的系统的简单性和精巧性。因此,本书并不是用英文逐行地翻译系统;它描述了各种算法的主要流程,更重要的是,它描述了各种算法是如何相互作用的。算法用类似C语言的伪码来表示,从而有助于读者理解自然语言的描述;算法的名字对应于内核内部的过程名。书中的各种插图描绘了系统对各种数据结构进行操作时它们之间的关系。在稍后的一些章中,采用了许多小的C语言程序来说明一些系统的概念,这些程序用户是容易明白的。为节省篇幅和清晰起见,这些例子一般不检查错误条件,而这一点在写程序时是一定要做的。我已经在系统V上运行了这些程序;除了某些演示系统V的特殊特点的程序以外,这些程序也应该能在UNIX系统的其他版本上运行。
原来为课程所准备的许多习题已放在每章的最后,它们是本书的重要组成部分。有些习题是直接了当的,用于说明正文中引入的概念。有些习题比较困难,用来帮助读者在一个较深的层次上理解系统。最后,还有些习题具有研究性质,设计这些题目是为了提出问题以供研究探讨。难度大的题目都标有*号。
本书对UNIX系统的描述基于AT&T所支持的系统V,第2版。还包括了一些第3版的新特点。这是我最熟悉的系统,但我还尽力描述了其他版本对UNIX系统的有意义的贡献,特别是BSD对系统的修改。本书回避了与特殊的硬件特性有关的问题,力图以通用的术语描述内核硬件的接口,并忽略特定机器的特殊特点。但是,当与机器有关的问题对理解内核的实现十分重要时,本书则讨论得相对详细一些。至少,对这些问题的探讨会突出操作系统中最依赖于机器的部分。
本书的读者必须具有用高级语言进行程序设计的经验,这是理解本书内容的必备条件,最好还有汇编语言的经验。建议读者具有用UNIX系统工作的经验,并了解C语言[Kemighan 78]。但是,在编写此书时,我努力使没有这种背景的读者也能理解本书的内容。本书的附录含有系统调用的简单描述,它们足以使读者理解书中的表达方式,但并不作为完整的参考手册。
本书的内容按如下方式组织。第1章,系统概貌,简要地描述了用户所看到的系统的特点,并给出了系统结构。第2章描述了内核结构的一般概貌,并引入一些基本概念。其余的章节按系统结构所表示的组成部分,描述其中各个成分。这些章可分为三部分:文件系统、进程控制和高级问题。本书先讨论文件系统,因为其概念比进程控制容易一些。这样,第3章描述了系统缓冲区高速缓存机制,这是文件系统的基础。第4章给出文件系统内部使用的一些算法和数据结构。这些算法使用了第3章中解释的算法,并讨论了管理用户文件所需要的内务操作。第5章说明提供文件系统用户接口的系统调用;这些系统调用使用了第4章的算法来存取用户文件。
第6章转向进程控制,其中定义了进程的上下文,讨论了控制进程上下文的内部内核原语。特别地讨论了系统调用接口,中断处理及上下文切换。第7章给出了控制进程上下文的系统调用。第8章讨论了进程调度问题。第9章的内容是存储管理,其中包括对换和请求调页系统。
第10章讨论了通用驱动程序接口,特别地讨论了磁盘驱动程序和终端驱动程序。尽管从逻辑上说设备是文件系统的一部分,但是,因为进程控制的问题要在终端驱动程序中出现,所以,对设备的讨论推迟到这一章。这一章也是通向本书其余章节中所给出的更高级的问题的桥梁。第11章讨论进程间通信和网络问题,其中包括系统V的消息、共享存储区及信号量,还有BSD的套接字。第12章解释了紧密耦合的多处理机UNIX系统。第13章研究了松散耦合的分布式系统。
前九章的内容可以在一学期的操作系统课程中完成。其余各章的内容可以在高级讨论班中进行讨论,并同时作各种课题研究。
至此,本人要作几点说明。可以确切地说,本书没有作系统性能方面的讨论,也没有提出任何用于系统安装的配置参数。这些数据会因机器类型、硬件配置、系统版本和实现、以及应用类型等的不同而不同。同时,我有意地尽量避免预测UNIX操作系统的未来发展。所讨论的高级问题并不意味着AT&T就要提供这些特别的,特性,甚至也不意味着那些特殊的领域正在开发研究中。