In Pursuit of Absolute Simplicity求于至简,归于永恒.
谨以此书献给夫人蕾蕾,女儿雨洁、雨蓉、雨恒和雨宜。
当你在电脑上玩游戏的时候,当你在电脑上与朋友聊天的时候,当你编写完一个程序需要加载运行的时候,你有没有一种像在观看魔术的感觉?编写好的程序能够编译运行,计算出结果,并显示或打印出来。你有没有觉得它很神秘?
如果想揭开这层神秘的面纱,你就得学习操作系统。
图1风靡世界的游戏“第二生命”因为操作系统是掌控计算机运行的系统,在学习它的过程中,读者能够了解到程序在计算机上运行的全景,或者说我们所认为的全景。之所以这么说,是因为精确了解程序在计算机上运行的全景是极其困难的(有人认为这根本就是不可能的)。当然,这里的程序指的是有一定规模的程序,而不是那种只有几行代码的小程序。从某种程度上来说,没有人敢肯定自己清楚计算机在任何一个时刻所处的状态。例如,在多流水线计算机上,如果发生中断或异常,我们根本就得不到一个精准的状态。唯一能做的就是推倒重来。
计算机的心智
人有心智吗?我想所有人都会回答:有!人的心智就是人的灵气。这是每一个人的生命之气。就是这个灵气赋予了人丰富的思维、感受和行动能力。
那么计算机有心智吗?这不是一个诡秘或者搞笑的问题。人们通常认为能够运动的生命都是有灵气的,既然计算机能够完成一些人脑才能够完成的理性任务,它当然也有心图2计算机的心智就是操作系统智!而这个心智就是操作系统。因为操作系统赋予了计算机以活力。虽然读者有可能尚不明白操作系统是怎么一回事,但也许知道没有操作系统,现代计算机是运转不起来的(这里需排除远古时代的古老计算机)。操作系统作为计算机赖以运转的控制中心,称其为计算机的心智可谓恰如其分。
前言前言众所周知,理解或看透一个人的心智是很困难的,所谓的“画虎画皮难画骨,知人知面难知心”。由此推断,既然操作系统是计算机的心智,理解起来恐怕也是困难重重。而这正是许多人在学习研究操作系统时的共同感受。
操作系统的奥秘
记得小时候常常念的一首诗是这样的:
图3理解操作系统有点类似于
数清楚天上的星星
从小时候就开始数了。
数到懂事、数到成熟,
还没有数清。
天上的星星为什么数不清呢?
像记忆和幻想,
永远背负着固执的迷……
对于许多大学是学计算机及相关专业的同学来说,操作系统就像是天上的星星(如图3所示),隐藏着一个固执的迷,永远学不清楚。不过,操作系统真的难以学清楚吗?
.不是的。学不清楚是因为没有看到其背后的奥秘。这个奥秘不是所有人都知道的。即使是研究操作系统的人也不一定意识到它,初学计算机者自然就更加不会注意了。
那么这个奥秘是什么呢?
天上的星星数不清是因为我们试图做的事情是数星星。如果我们换个角度,不去数星星,而是寻找到星星的设计师,让他告诉我们星星的数量,不就数清楚了吗?
这也正是学习操作系统的奥秘。要理解操作系统,就要寻找到操作系统的设计师们,让他们告诉我们操作系统所蕴含的所有秘密。当然,这里的寻找设计师并不是真的找来他们,因为找到所有的设计师是不可能的。这里的设计师指的是一种抽象,一种所有设计师所共有的人生哲学,因为设计师们在设计操作系统时会不自觉地将自己的思维或人生追求构造在操作系统里,从而赋予了操作系统以心智,而操作系统也就在这种心智的指挥下亘古运行着。
操作系统之哲学原理
正如前面所述,让设计师告诉我们操作系统秘密是理解操作系统的最好办法。他们所用的载体就是其所遵循的生活哲学,这些生活哲学就是操作系统所遵循的哲学原理。
本书就是试图从这些哲学原理(也就是人类生活哲学)的视角来阐述操作系统,从而揭开操作系统的神秘面纱,令其不再晦涩难懂。
例如,CPU管理(进程与线程)、内存管理(虚拟存储)、外存管理(文件系统)、I/O管理(输入与输出)等操作系统的核心机制不外乎是资源的管理,它们都遵循着一切人类资源管理的基本原则,即如何有效地发掘资源、监控资源、分配资源和回收资源。
除了提供管理的功能外,操作系统还需要保证自己的正常运转,即它必须尽力使自身不发生失效或崩溃,因为这是提供其他一切功能的基础。这与人类把确保自身健康生活作为开发利用资源的前提是一个道理。
如果我们把握了资源的根本属性,即资源管理必然涉及共享和竞争的管理,理解了操作系统必须首先保障自己的正常运转,就会理解操作系统的一切行为。前者指引着操作系统功能的设计与进化,后者则推动着操作系统可靠性地演变。
资源管理也好,保证自身的正确性也好,它们都有着根本的线索。这条根本线索就是人类在长期的生活实践中摸索出来的管理社会和保障自身安全的各种办法。这些办法是随着人类哲学思维的变化而改进的。因此,只要明白了人类的哲学思维,就能明白操作系统所遵循的哲学原理,进而明白整个操作系统的设计与构造。
除了使操作系统易于理解外,从哲学的层面阐述操作系统的原理还有如下好处:
·操作系统可以变化,但支持其存在的哲学原理是不变的。这样,本书的内容可以在操作系统不断演变的环境下保持有效,而不会像其他书的内容,随着时间的推移而过时。
·对于很多人来说,操作系统所采取的机制、策略和手段看上去十分枯燥,如果从哲学原理上给它们赋予人性的特点,这些机制、策略和手段便不再枯燥。
通过将人生哲学与操作系统联系起来,从操作系统哲学原理的层次阐述操作系统的核心技术,就能够理解掌握操作系统的精髓。
本书内容安排
为清楚地阐述操作系统的哲学原理,也为了使内容显得紧凑,逻辑上一气呵成,本书只选择了操作系统的核心内容进行分析,放弃了对操作系统核心以外内容,如安全、多媒体系统、虚拟机技术、光盘技术等的论述。本书集中精力对操作系统发展的历史背景、进程与线程、内存管理、文件系统、输入与输出、多核环境下的进程调度和操作系统设计进行了哲学原理层面上的分析与论述。对内容的这种安排有如下好处:
·可使本书重点突出、逻辑清晰、内容连贯,便于学生顺利掌握操作系统的核心与关键。
·操作系统的核心内容经过长久的研究与实践,已经变得较为稳定并且形成了公认的标准,讲解起来没有歧义。
·操作系统的非核心部分由于研究的时间短,工业界参与的程度较低,并无公认的标准,论述起来要么不全面,要么显得凌乱,使刚刚接触操作系统的读者感到迷惑。..
·只要掌握了核心内容的原理,读者便能通过自学掌握操作系统核心以外的知识。
本书覆盖全国硕士研究生入学统一考试计算机学科专业基础综合考试大纲中操作系统全部内容。
本书一共分为7篇22章。7篇分别是基础原理篇、进程原理篇、内存原理篇、文件原理篇、I/O原理篇、多核原理篇和操作系统设计原理篇。本书的内容结构如图4所示。 图4本书内容结构基础原理篇
该篇包含第1章至第3章的内容。第1章的内容包括智者的挑战、人造学科、程序是如何运行的、什么是操作系统、魔术与管理、用户程序与操作系统、操作系统范畴和为什么学习操作系统。第2章探讨操作系统演变的主要过程:从单一控制终端单一操作员,到批处理、多道批处理、分时操作系统、实时操作系统、现代操作系统;对商业操作系统演变的过程进行分析,然后探讨操作系统分类和操作系统的未来发展趋势。第3章简要回顾计算机硬件基本知识,探讨什么是“抽象”,讲解用户态与内核态,阐述操作系统结构、系统调用、操作系统的壳等知识。
进程原理篇
该篇对操作系统最为核心的概念“进程”进行讲解,包括第4章至第10章的内容。第4章阐述的内容包括进程出现的逻辑必然性、多道编程的效率、进程的创建和消亡、进程的状态及其转换、进程与地址空间、进程管理和进程模型的缺陷。第5章讲解的内容包括线程、线程管理、线程的用户态、内核态和混合态实现、现代操作系统的线程实现模型、多线程之间的关系、线程主要考虑的问题。第6章的内容包括为什么要通信、管道、记名管道、套接字、信号、信号量、共享内存、消息队列等。第7章的内容包括为什么同步、同步的目的、锁原语的进化、睡觉与叫醒原语、信号量、管程、消息传递和栅栏。第8章讲解的内容包括调度的目标、先来先服务、时间片轮转、短任务优先、优先级调度、混合调度、实时调度等算法,并对优先级倒挂和线程的不确定性进行讨论。第9章讲述如何使用中断启用和禁止、测试与设置来实现锁原语。第10章对死锁的产生、发展、防止与避免进行讲解,并讨论死锁、活锁和饥饿的关系。
内存原理篇
该篇对操作系统的另外一个重要构成部分“内存管理”进行阐述,包括第11章至第14章的内容。第11章讲述内存管理的环境、内存管理的目标、虚拟内存、操作系统在内存中的位置、单道编程的内存管理、固定加载地址、多道编程的内存管理、固定分区、非固定分区、交换、地址翻译、闲置空间管理等内容。第12章的内容包括基址极限的问题、分页管理、页表、页面翻译过程、分页管理系统的优缺点、多级页表、地址翻译速度、锁住页面、内存抖动和页面尺寸设计。第13章对页面更换算法的来龙去脉、欲达到的目的、各种具体的页面更换算法进行细致讲解。第14章的内容包括分段管理系统、分段的优缺点、段号与寻址位数,并对否定之否定在内存管理模式发展过程中的作用进行讨论。
文件原理篇
该篇对操作系统的第三个核心构件“文件系统”进行讲解,包括第15章至第18章的内容。第15章讲述的内容包括磁盘结构、磁盘访问速度、磁盘的操作系统界面、磁盘访问过程和磁盘调度。第16章讲述为什么需要文件系统、什么是文件系统、文件系统的目的、文件的基本知识、文件的存储结构、文件类型、文件访问、文件属性、文件操作、文件夹、相对与绝对路径、共享与链接、内存映射的文件等内容。第17章的内容包括文件系统分布、文件的实现、文件夹的实现、共享文件的实现、磁盘空间的管理等。第18章的内容包括文件安全性能(文件访问控制、访问控制表、能力表)、文件可靠性能(持久性、一致性、日志、交易、随影、一致性检查)和文件系统的效率性能(提前读取、减少磁臂移动距离、日志结构的文件系统LFS)。
I/O原理篇
该篇对计算机与外界进行沟通的机制“输入与输出”进行讲解。本篇仅有一章(第19章),讨论的内容包括输入输出的重要性和目的、I/O硬件的哲学原理、物理I/O模式(专有通道I/O、内存映射的I/O、复合I/O、DMA)、输入输出软件之哲学原理、软件I/O模式(可编程I/O、中断驱动I/O、DMA)、I/O软件分层和设备驱动程序等。
多核原理篇
该篇对新出现的多核技术进行讲解。重点讨论多核环境给操作系统带来的影响。全篇分为多核结构和多核操作系统两章。第20章讲解的内容包括多核处理器结构(超线程结构、多核结构、多核超线程结构)、多核内存结构(UMA、NUMA、COMA、NORMA)、对称多核处理器计算机的启动过程、多处理器之间的通信和SMP缓存一致性等。第21章的内容包括多核进程同步、多核环境下的软件同步原语、旋锁及其实现、队列旋锁、多核环境下的进程调度、多核环境下的能耗管理和多核系统性能。
操作系统设计原理篇
该篇从高屋建瓴的角度对操作系统设计的十条哲学原理进行阐述。显然,操作系统的设计原则有很多,本篇选取的只是这诸多原则里面非常重要的十条。第22章将从操作系统和人类社会两个层面对这十条原理进行论述与比较,以使读者更加清楚地明白操作系统就是人类社会在计算机里面的反映。操作系统的其他设计原则读者可自行发现。
本书的特点
相对于国内外其它操作系统教材,本书的独特性体现在四个方面:逻辑导向,通过逻辑推理将核心原理演绎出来;联系生活,用人所熟知的生活实例来揭示奥秘;抽象提升,从哲学高度进行阐述以将各种原理串成有机整体;知识整合,引入相关编译和计算机组成的知识来加深读者对细腻之处的把握。这些特点赋予了本书风格上更加清新、内容上更加丰富、逻辑上更加严谨、叙述上更加幽默、解说上更加深刻、和层次上更加优美的引人入胜的效果。
读者在阅读学习完本书后,将达到如下目标:
·了解操作系统在计算机软硬件整个体系中的中心主导作用。
·掌握操作系统的基本概念、原理、技术和实现机制。
·理解操作系统原理背后的人文背景与历史动机。
·运用操作系统知识来分析和解决问题。
·掌握操作系统设计的原理,为以后设计操作系统打下基础。
这里需要提醒的是,本书阐述的是操作系统的原理,它不依赖于任何具体的实现,而是凌驾于所有具体商业操作系统的进程实现之上。即本书所阐述的思想和原理对所有操作系统都适用。但具体商业操作系统在应用这些原理时可以有很灵活的方式。事实上,具体的商业操作系统在应用这些原理时确实采取了不同的方式,有的更为精密,也有的偷工减料。另外,由于我们注重的是原理,对个体机制实现时采取的数据结构通常不作琐细的论述,而是点到为止。这是因为数据结构必须以真正的操作系统为蓝本进行讲解,而真正的商用操作系统使用的数据结构通常非常复杂,对此进行繁琐的讲解将把学生弄得晕头转向,而不利于对操作系统核心原理的把握。
当然了,如果要达到能够设计开发真正商业操作系统的境界,读者还需要进行“操作系统工程”或“操作系统实现”的学习。而这种工程或实现的课程通常以具体的操作系统为对象进行讲述。这些具体的操作系统可以是Windows、UNIX、Linux,当然也可以是其他一些非主流商业操作系统。如果能够将本书阐述的原理与操作系统工程或实现相结合,将取得更好的效果。
最后,本作者感谢下列人士为本书审阅书稿:上海交通大学的陈凌峰、张漳、顾夏申、徐燕和美国密歇根大学的鞠晓恩,其中陈凌峰和张漳将本人的讲课做了原始记录。
现在就让我们一起来揭示秘密,数清操作系统里的星星吧。...