图书前言

    毋庸置疑,操作系统是计算机专业的重要课程之一,同时也是比较难处理的课程之一。因此,在高等教育的教学改革活动中,这门课程一直是改革的重点,其核心就是课程的定位和教学内容的选择与编排。特别是在操作系统课程的教材上,这个问题显得尤为突出。

    历史上,由于操作系统的多样性和广泛性,使得相当一部分教材都具有总结性、综述性和理论性的特点。虽然这是一个优点,但是由于过多地顾及知识的系统性和全面性而导致了教材庞大,难以在课时有限的教学中使用。近年来,在广大教师的努力下涌现出一批比较精炼的教材,在某种程度上满足了教学的需要。但由于历史条件的限制,加之教学思路没有发生根本改变,所以有相当一部分是上述那种大教材的缩写版,从而使操作系统课程蜕变成了科普知识介绍,其后果就是学了这门课之后,学生的普遍感觉是:“说明白,似乎也明白,但总是云里雾里的不得要领”。目前,这种后果已严重地影响了计算机专业毕业生的质量以及他们后期的发展。 

    近年来,结合教学实践,本书作者对上述问题与同行及一些企业界的朋友进行了广泛的探讨和研究,形成了以下几点基本认识:

    (1) 由于数字计算机是一种强非线性系统,现有的数学工具尚不能为这种系统提供强有力的支持,因此,计算机学科基本还处于技艺和经验阶段,其经验性、实践性极强。因而导致同是操作系统,但其实现方法却差异极大,这一点在早期的操作系统中反映得尤为明显,如果在教材内容上不做适当的删减,过于追求知识的完整性和系统性,势必会使教材内容成为一些实用技术的罗列,从而导致教材内容庞杂、体量巨大。所以,鉴于本科教学时数的限制及学生特点,本科阶段的操作系统课程应该以实际应用为目标,以一个源码开放的实际系统为背景,在重点介绍操作系统与硬件以及与应用程序之间的关系之后,有重点地介绍其各个部分的实现技术。

    (2) 在计算机专业的课程体系中,操作系统课程的定位及其教学目标尚不十分明确。相当一部分学校和教师还是单纯地就操作系统讲操作系统,并没有有意识地将这门课程与其他相关课程联系起来,从而导致学生甚至教师对这门课程重视程度不够(要报考研究生的学生除外),进而也影响了学生的整体水平。其实,它是一门综合性、应用性极强的课程,是一门在学生掌握了计算机原理、程序设计语言及数据结构知识之后,对这些知识进行总结、应用的课程,套用一句影视界的话来说:它应该是计算机专业的一门“领衔”课程。如果这门课程处理不当,就会使其他课程也处于很尴尬的地位,例如,数据结构、面向对象程序设计、微型计算机原理等。因为对这些课程内容的理解及其应用,都需要一个大型综合应用实例,而恰恰在这些课程里又没办法安排这样的实例,因为这些课程都具有某种专门性。由于操作系统就是一个实际的程序,所以操作系统课程承担起上述任务是理所当然的。即在操作系统课程中,除了介绍操作系统本身的概念和实现方法之外,要依托它向学生介绍数据结构、面向对象思想方法以及软件工程方法在工程实践中的应用,以达到触类旁通、互相联系的效果。

    (3) 本科阶段操作系统课程的内容不应该过于抽象。从认识事物的规律来看,人们只有接触到了一定量的某一类实际事物之后,才能对这类事物的抽象具有一定的理解力,否则就会如学生所讲:“听天书一般”。而在学习之前,学生知之甚少的恰恰是操作系统(当然比编译系统要好一些)。所以,在本科阶段,操作系统课程内容应该以某个具体操作系统为实例,以介绍操作系统的最基本理论和实现方法为教学目标更为合适。历史上,国外教学曾经用过UNIX,但由于它后来不再开源,致使操作系统教学缺少了一个鲜活实例。尽管后来有专为教学而设计的MINIX,但也由于历史原因而没有在国内的教学中得到普遍应用,从而使得操作系统的教材和教学变成了目前的状况。

    现在,开源世界的Linux的出现以及它在各方面的出色表现,无疑为操作系统的教学内容改革带来了一个良好契机。近些年来,为了把Linux引入教学,我国的教育工作者做出了不懈的努力并取得了较好的效果,涌现出一批优秀教材。

    本书就是应当前教学及教学改革需要而编写的一本以Linux为背景的操作系统入门书。根据本书的目标,书中的部分章节在重点介绍了微型计算机操作系统的相关基本概念、基本原理和设计思想之后,以基于i386平台的Linux为实例,以关键数据结构为切入点,介绍了操作系统的具体实现方法。本书力求使学生不仅从概念上理解操作系统的相关知识,并且还在数据结构的应用、面向对象思想方法以及软件工程方法应用能力等方面得到进一步提升。本书通过介绍i386处理器对操作系统的支持,使读者加深对操作系统与硬件之间关系的理解。同时,鉴于Linux在嵌入式系统这方面的突出表现,本书还专门介绍了嵌入式操作系统的基本概念和特点。

    全书共分9章,分别介绍了操作系统的基本概念、存储管理、进程、文件系统、互斥和同步、通信、中断/异常和系统调用、设备、嵌入式操作系统等内容。

    另外,我曾写过几本与操作系统相关的书籍,有很多读者来信询问一些与操作系统学习有关的问题,本人也借此谈一些看法。

    (1) 对于搞顶层软件设计的人来说,学习操作系统有意义吗?

    太有意义了。因为你设计的软件在运行时,操作系统是你的应用程序的一部分(只不过不是你设计的)。如果你对你使用的操作系统不了解,那你知道它为你做了些什么你不需要的工作吗?你用什么向客户说明你的软件是安全的?你用什么来保证当系统升级时,你的软件是兼容的?

    (2) 对于搞硬件的人,学习操作系统有意义吗? 

    现在搞硬件的人是没有办法不接触软件的。试想,要设计一个硬件驱动程序,你不了解操作系统的设备管理能行吗?尤其是在嵌入式系统应用如此广泛的今天,你具备嵌入式操作系统的选用、剪裁及改造能力吗?你能成为一个合格的嵌入式系统工程师吗?

    (3) 现在为什么都在介绍Linux,而不介绍Windows及其他操作系统呢?

    没办法,因为在教学上作为依托的软件实例必须是源码开放的,否则会涉及知识产权问题。就目前情况来看,适合作为计算机专业教学使用,且源码开放的只有Linux,而对其他操作系统则只能就其公开的技术作一般的介绍。

    (4) Linux具有普遍意义吗?学了它就能把其他系统也搞明白吗?

    这个问题比较复杂。确实,作为教学使用的实例最好具有普遍意义,以达到解剖一个实例就可以解决该课程全部问题的目的。就这一点来看,Linux并不理想,至少在操作系统中比较重要的微内核概念就不能通过它来体现。另外,Linux的进程、线程的概念不很清晰(但很实用),在学生学习阶段容易造成一些不必要的混乱。但由于操作系统是个实用系统,只要是具体系统就免不了“各村有各村的高招”,对于计算机这种非线性系统来说,不同招数之间的差异还很大。因此,企图以一个实例就把所有操作系统搞清楚的想法是不实际的,加之前面所说的源码开放问题,现在的教学实例也只能是Linux了。但由于不同操作系统的基本作用和原理大致相同,所以学习了Linux之后,再学习其他操作系统也就不难了。

    (5) 学了Linux之后,那些比较注重理论的书还要看吗?

    理论总是重要的,它是实际系统的抽象和升华,具有普遍指导意义。如果读者真想研究操作系统的话,那些对你来说目前似乎没有什么用的理论,将来是会有大用途的,特别是一些人们在长期实践中总结出的设计模式(可以算作理论吧)很有用。

    (6) 学习操作系统能提高编程能力吗?

    能。前面已经讲过,操作系统就是一个真实的大程序实例。在相关课程中很难用实例介绍的数据结构、算法、设计模式,以及软件工程中提到的“高内聚、低耦合”软件设计原则、代码动态链接以及充分利用指针实现的各种虚拟技术等,在操作系统中都有极为充分的体现。如果注意总结,你的软件设计能力会突飞猛进。

    (7) 学习Linux难不难?

    入门,甚至应用都不难,但要精通确实很难。想想看,从Linux出现到现在,从程序设计方法上,它历经了面向过程程序设计、面向对象程序设计两大阶段;从内核结构上,尽管很难改变当初它的宏内核设计,但后来的一些有关内核的新概念,例如,层次化内核和微内核,给了它极大的影响,加之为了嵌入式应用它还在实现实时内核方面作出了很大努力,因此,可以说,Linux是集各种编程思想和方法之大成者。因Linux所采用技术之广泛和繁杂,要精通它确实很难,所以从这个角度看,它并不是一个特别理想的教学实例。在此作者建议初学者在阅读本书的同时,最好看一些介绍其他小型操作系统的书籍和资料,例如,开源的μC/OS-II、T-KERNEL等,以快速了解操作系统的一些基础概念。另外,在阅读本书介绍的一些大型数据结构时,需要某种程度的“不求甚解”,以把握其中的主要内容。这就像逛北京城一样,不要企图在短时间内把偌大的一个北京全熟悉了,尽快先把一些关键性的地标或景观搞清楚,至于那些小胡同及曲径通幽之处,可以慢慢地去熟悉。

    (8) 本书适合哪类读者?如何学习Linux? 

    学无定法,作者只能提一些建议。如果只是单纯以一般的顶层应用为目的,那么操作系统就是一堆函数,你把这些函数的用途及使用方法弄清楚就可以了,这本书可能不适合你;如果想要对操作系统的用途、原理、特点和实现方法有一定程度的了解或是想入门,这本书就比较合适,因为这本书力求做到注重说理、深度适中、文字通俗易懂;如果要深入研究,单靠这一本小书就远远不够了,还需看一些理论性较强或对代码剖析得比较详细的书籍(市面上这类书籍已经逐渐多了起来). 

    对学习方法的建议如下: 如果有条件,最好以Shell编程来熟悉Linux,以阅读数据结构来了解内核架构,以编写守护进程和驱动程序为突破点来理解Linux内核。

    在一本50万字左右的书中既要介绍操作系统基本原理,又要介绍信息量如此巨大的Linux,对水平有限的作者来说实在是一个难题,所以恳请读者对书中的缺点和错误提出批评和指正。同时,也希望阅读本书的读者或使用本书作为教材的教师和同学多来信与作者共同探讨与切磋,以期对本书作进一步的改进。

    作者在编写本书的过程中参考了大量相关文献和网上资料,并引用了其中一些例题、文字和插图,在此对这些文献和资料作者的辛勤劳动表示诚挚的谢意。

    参加本书编写的作者有任哲、房红征、曹梅、张威,全书由任哲负责统稿。另外,李益民、陈志忠老师也对部分内容的编排提出了很好的意见和建议,从而使本书增色不少,在此一并表示感谢。