在Linux内核出现之前出现过很多优秀的内核,甚至同时期直至今日,那些竞争关系的内核仍然存在。2007年我刚学习Linux时,还在犹豫是否要学习和使用FreeBSD,现在我绝对不会有疑惑了。可以说UNIX是Linux发展壮大的原因,Minix是Linux发展的方法。Linux从对Minix的深入研究发源而来,但是实际地推出大量借鉴了UNIX的交互方式和技术模式。UNIX本来也完全可以压倒性地压制Linux,因为那时的UNIX内核有多个封闭版本,并且都是商业运行,很多非常强大。Linux之所以能够后来逐步超越UNIX,是因为Linux的开源属性和Torvalds的杰出领导。
直到今天一个软件想要获得最广泛的应用,开源仍旧是不二手段。通过这种方式能够让自己的软件取得比更加友好强大的商业软件更大的市场空间。但是代价就是难以找到盈利模式。UNIX就像一个创新发源地,很多需要花费巨资的Linux的标准化工作,例如POSIX都由UNIX背后的企业去完成,一些新奇的技术也是由在商业系统研究的过程中发表的paper,被Linux直接借鉴实现。近年Android的发展也让Linux从谷歌获得了大量的改进和修复(最典型的是cgroup)。久而久之就形成了Linux独特的价值观:求全第一,求精第二。
Plan9是由贝尔实验室开发的系统,参与阵容可谓豪华:Rob Pike(现在在Google工作,负责Go语言的开发);Ken Thompson(C语言和UNIX创始人);Dennis Ritchie(C语言和UNIX创始人);Brian Kernighan(awk之父);Doug Mcilroy(UNIX管道提出者,UNIX开发参与者)。我在使用Linux时最大的震撼就是一切皆文件的思想,然而这在Plan9中已然是价值观上的定海神针。Plan9中最本质的思想是“一切皆是文件”,甚至CPU是一个文件;内存是一个文件;网络是一个文件,任何的东西都是一个文件。这在Linux中已经尽量做到这一点,在Plan9中被极度地强化。
Linux和UNIX是一个多用户分时操作系统,就是多个用户共享一个操作系统资源。不管是CPU、内存、网络,都需要通过调度器分配调度。比如A机器的文件需要使用B机器的CPU来处理,方法就只有通过某种协议,将A机器的文件下载到B机器中,然后B机器处理完以后再回传到A机器中。Plan 9的“一切皆是文件”看起来很好的解决了这个问题。A机器想使用B机器的CPU,只需要将B机器的CPU挂载到A机器的CPU的文件中就能完成这个需求了。当然,两个机器之间也有一个协议“9P”来进行文件挂载和表示,但是这个操作对上层的操作系统来说已经是透明的了。
Plan9是一个分布式操作系统,它能把网络上一切资源当作文件来进行使用,这其实就是云的概念了。但是看起来好的东西在实际使用中不一定好,很多时候人们会更倾向于使用socket,就像它本可以用Python语言一句话完成一个socket,但是它在某些极端情况下还得用C语言的socket,因为那样更加可控并且效率高。当你挂载了远端的CPU到本机时,用起来像用本地的CPU一样,这看起来是优点,但同时也是缺点,使用这个系统的人会莫名其妙地发现自己的程序很慢,但是他很难想到是被调度到远端的CPU上去执行了,如果想要加速程序运行速度,就得深入地研究CPU挂载的流程和原理。实际上不是那么方便,这有时候就是对失误的一个很好的阻碍。
我们做云系统的时候就会发现,很多时候为了可靠性和稳定性都会在一定程度上牺牲易用性。一个操作系统最重要的素质就是稳定性,否则任何的上层进程出了问题,还得去找系统级的原因,那样就会极大地阻碍这个系统的实际有效应用。
除了Plan 9之外,Linux系统还有很多重量级的竞争对手:Haiku、BeOS、Amiga、OS/2、Arthur、XTS-400、Infemo、Symbian、Palm OS等。Linux系统目前在嵌入式和服务器领域取得的成功并不是因为它一开始就是这个定位,而是只有这两个大方向显著适合Linux系统,因为Linux系统什么都能做。而其他的竞争对手通常都有共同的特点,那就是专业或者商业。比如BeOS为多媒体而专门设计得十分精良,还差一点被苹果公司用作桌面系统,它的定位可以说是非常精准,但是市场无数次的证明了胜出的不一定是好的。但是其派生的开源系统Haiku延续它发展了一段时间,但是也失败了。就连微软、IBM联合重金研发,诞生的当今软件工程圣典《人月神话》的OS/2项目也迅速归于失败。Inferno操作系统继承自Plan 9、Amiga系统同期拥有不亚于苹果的技术实力,也都因为过度依赖于某个公司的开发,经营不善而没落。我们熟知的Palm OS和Symbian也都饱尝了封闭拒绝进步带来的恶果。1990—2000年是一个时代,这个时代产生了许多未来操作系统的种子选手。
信息行业几乎已经证明了一件事,在一个领域几乎只能容纳一两家巨头。那时的先驱者不一定认识到这个问题。他们或者是因为经营问题、销售问题、定位问题、技术问题,又或者是因为资金问题,他们都失败了。Linux系统走了完全不同的路,这条路可以说是操作系统选手里面Minix最早尝试的,但是有完整的源代码。无疑是Minix的这种模式直接导致了Linux的诞生,其他操作系统走过的弯路,Linux不必再走。Linus本人是一个有情怀的技术人,他没有选择试图成立公司,他可能失去的是一个伟大的公司,但是他却收获了一个伟大的产品,并且极大地促进了整个人类信息技术的进步。
Linux系统是一个工具,也是一个现象、一个平台。它很可能是最近20年对信息产业贡献最大的开源项目。路由器、手机、监控系统、互联网的服务器,甚至桌面系统都逐渐的在应用Linux系统,甚至除了桌面系统,在大部分的信息系统里,Linux系统已经几乎成为了唯一的选择。大部分的应用场景都是使用Linux作为一个操作系统平台,而在之上运行企业自己的应用。根据这个应用对底层的需求层次不同,开发者对Linux知识了解程度的需求是截然不同的。纯粹逻辑的应用是几乎完全不需要感知到Linux的存在的。编写逻辑,编译部署到Linux系统上就可以运行。但是包括运维、嵌入式,尤其是涉及更高的性能要求或者稳定性要求等时,就需要借助Linux内核或者系统底层提供的机制了。
Linux内核提供的机制比较常用的部分,在用户端基本会有底层库进行封装提供,甚至一些内核没有提供的能力,底层库也会提供。所以当你需要底层知识时,可能使用的是底层库提供的机制,也可能是底层库提供不了的,此时就由内核直接提供。通常情况下底层库都需要尽可能地封装内核提供的功能,但是由于Linux内核的特性,它尽可能地集中了功能,并且直接通过文件系统接口暴露,这就导致了例如/proc、/dev等文件系统的使用可以非常方便地直接调用到内核的功能,底层库也就没有必要封装了(虽然大部分它们也都封装了)。
所以当我们深入到Linux时,通常会同时接触到底层库和内核的用户空间接口。而要使用这些底层功能,通常需要对这些功能本身的实现原理有一定的了解。本书就是在这个点上提供的知识分析。