Tanenbaum-Torvalds Debate, Part II

22 May 2013

1 说明

Tanenbaum-Torvalds Debate这个是N年前就已經闻名于世了,这个Part2貌似是Andrew S. Tanenbaum时隔多年又来一发的结果,当然,肯定不是他想来一发的。 原文地址: http://www.cs.vu.nl/~ast/reliable-os/ 以下就是正文了。

2 前言

貌似这次又要来一发微内核之争 了。不过在上技术流前,我还是有几句话要说的。好多人都说或者是暗示我和Linus是仇人见面分外眼红。其实没这回事。我之间见过他一次。他还是一个很不错的人,而且非常聪明。虽说我们在一些技术问题上有点小分歧吧,但是也不至于变成仇人。所以么,观点上的不同不代表我们个人关系不和。所以我没什么针对Linus个人的,也很尊重他所取得的成就。

为防万一有谁不知道这件事情,我先说一下,几年前,微软雇了个叫Ken Brown枪手,写书说Linus的Linux是从我的MINIX 1系统上剽窃的。我可是跳出来说了 ,这纯属污蔑,要为Linus正名。虽说我不怎么感冒Linux的设计理念吧,不过Linux确实是他写的,和我没关系。至于我听到Brown瞎扯说Linus从我这里剽窃东西,我瞬间就怒了。

开始前,容我再再说一句:从本质上来讲我兴趣不在微不微内核上。我其实是想弄个很稳定可靠又安全的操作系统,然后呢,微内核正好躺枪,我觉得实现这个目标得靠它才可以。下面再细说。

3 嘴仗

听说在Colorado的Air Force Academy有这么个标语:

脑袋清楚的时候再说话。1

不知道是不是真有这句话,不过我还是很同意这个观点的。

这么多年了,各种论坛(比如Slashdot)都一直有帖子没完没了的吐槽微内核有多慢,微内核有多难写程序,微内核都没什么商用的,当然还有其他战斗力为渣的废话。其实吧,这些帖子都是那些不知微内核为何物或者是不知微内核为何的人发的。我觉得吧,发这些帖子的人起码也应该先试试看微内核操作系统后,然后再发个帖子,开头带上这句,“我已经试过微内核操作系统了,然后我自己发现了X,Y,Z现象”。这样的吐槽才有战斗力么。

要想体验,最简单的当然是去下载安装MINIX 3啦。免费又开源(而且是BSD的授权协议哦),下了镜像后就可以刻在CD上,然后启动,然后登陆。不过你要是想干点实在的,还是需要给磁盘分个区的(1G就够),然后把系统装上。请千万记得先把安装手册 打印出来读一读。安装差不多要十分钟的样子。然后就按照手册上说的把CD上的软件包都装上。等你安完了进入X系统就能实实在在体验下了。你也可以试着照手册上的方法重新构建整个系统。内核加上用户态的驱动还有所有的用户态的服务(总共125个)需要5-10秒。

请千万记得,如今的MINIX 3可不再是你爷爷当年用的MINIX了。MINIX 1不过是教学用途,到现在还在很多大学里用着。Al Woodhull和我还专门为它写了本书 。MINIX 3可不止于此,目标就是为了建一个超可靠的、能够自愈、而且不会越来越来臃肿 的操作系统,而且可能在100刀笔记本项目 上能用上,造福第三世界的孩子们,还有嵌入式系统。MINIX 1和MINIX 3的关系就像Windows 3.1和Windows XP的关系:同名不同姓的熊孩子。所以,你要是大学时用过MINIX 1,试试3吧,包你满意。它完全是小而精的UNIX系统,包括了X、bash、pdksh、zsh、cc、gcc、perl、python、awk、emacs、vi、pine、ssh、ftp、GNU工具链还有其他400多别的程序。全靠那个小小的微内核,现在马上立刻你就可以拥有!

所以,亲们,请不要再一遍遍的这样吐槽了:“如果Tanenbaum认为微内核NB,干嘛不自己动手写一个?” 爷爷我真的已经写了。做人要低调,其实是我和我的学生、程序员一起写的。虽说它还没有Linux或者BSD这么完整和成熟吧,不过,这就是明证啊,谁说的不能在一个小而易懂的微内核上实现一个在用户态中运行的可靠的、自愈、多服务的UNIX克隆?当然,别把我说的不成熟(我们就3个人,花了一年多一点的时间)和那些与微内核相关的问题混淆了。我们会增加更多的功能,移植更多的软件(我们也欢迎你的加入)。从05年十月起到现在MINI3的网站已经有40多万 访问量了。谁用谁知道。

4 论文

不久前,我带的PhD Jorrit Herder,我同事Herbert Bos,还有我写了篇叫做《我们能否构建可靠而安全的操作系统?》 的文章,然后投了IEEE的《Computer Magazine》,这个可是IEEE计算机学会的旗舰刊物哦。已经通过了,发表在2006五月刊上。这篇文章里面我们说明了,其实对大部分计算机用户来说,可靠性要比性能更重要,而且讨论了4个目前正在进行中的研究项目,都是致力于改善操作系统的可靠性。其中3个用的都是微内核。IEEE把这篇文章放在他们的网站上,然后就有人把链接 给发上Slashdot了,重燃微内核与宏内核这一古老纷争的战火。虽说我是这篇文章的共同作者吧,不过我发誓我绝对不是想要重启“Linux已经过时了”这种争论。

Linus回应 了,所以可能又要来一个小小的争论了。没问题,不过各位亲,请千万记得多关注下技术话题。

5 Linus的论点

Linus的基本观点是微内核需要分布式算法,但是目前分布式算法都很屎。尽管我和Maarten van Steen一起写了一本书 专门解决分布式算法惨不忍睹的问题,我还是得承认分布式算法确实是个大坑。过去十年我也设计、编写和公布了两个分布式系统,Amoeba (LAN环境)和Globe (WAN环境)。分布式算法的主要问题是由于可能会中途丢失消息还有其他一些不确定的事情,比如远程进程死掉了或者仅仅是运行缓慢,造成缺少一个共同的时间基准。但是呢,这些问题对于一个单机上运行的微内核系统环境都不存在。所以,我同意Linus说的分布式算法难度比较大,但是这个和我们讨论的问题没什么关系。

另外,大部分用户空间的组成都是驱动,他们和服务的交互都是很简单直接的。所有的字符设备都遵循一样的协议(读写字节流),所有的块设备也一样(读写块)。用户空间的服务组件都不大:文件服务、进程服务、网络服务、轮回服务,还有数据存储和其他不多的服务。每个的任务都很明确,和系统其他部分的交互也都很明确。比如说数据存储,提供了一个发布/订阅的服务,保证了其他组建之间的松耦合,这可是很有用的。服务组件的数量未来也不会有大量的增加。所以复杂性也是在可控范围内的。我说的这些都不是推测,毕竟我们都已经实现了这样的系统。不信你就自己装MINX 3看代码去。

Linus也说共享数据结构是个好主意,这个我不敢苟同。如果你上过操作系统的课程就肯定记得课程上大把大把的时间还有课本上大把大把的空间都是拿来讨论协作进程间同步和互斥的。只要两个以上的进程可以访问相同的数据结构,你就要非常非常小心否则就等着不得好死吧。哪怕带上信号量、管程、互斥锁还有其他的好方法,想要把问题弄对也难如登天。

我的观点就是你应该拼着命的避免共享数据。系统就应该由多个对外完全隐藏了自己内部数据的小模块组成。这些模块允许外部调用的借口都应该是良好定义的可以满足工作需求的“瘦”接口。这其实也是面向对象编程在干的事情,隐藏信息而不是共享。我认为隐藏信息(如Dave Parnas所言)是个好注意。这样你就可以随意改变数据结构、算法、模块设计,只要你保证借口不变就不会影响系统的正确性。软件工程课上都会教授这点。而Linus说过去20年的面向对象编程都是误导,这点我可不同意。

一旦你想保护一个模块的纯洁数据不被别的模块的脏手玷污,那么第一步很显然就是把模块们放在不同的地址空间,然后通过MMU的硬件来保证。应用在在操作系统上,就是微内核加上一堆通过消息和良好定义的接口和协议通讯的用户态的进程。这种设计就更加干净易维护。Linus由于自己大量的宏内核的经验而没怎么接触过微内核和分布式系统,所以得出了他的结论。我的经验则来自于自己设计、实现和发布过这样操作系统。由于经历不同,所以我们对于什么简单和什么容易有不同的观点。

对于可靠操作系统的的论述也可以参看Jonathon Shapiro的短文《揭露Linus最近的言论》

6 微内核实际应用了么?

简单回答下:当然。周一(五月八日),Slashdot上又是一票类似的无休止的评论:“要是微内核真那么NB,怎么我从没见过?”其实吧,呵呵,有的。除了MINIX 3,还有:

QNX在商业系统中广泛应用。比如,思科最NB的路由器 就是用的他们,另外我打包票,思科是很很关心性能问题的。

在军事和航空领域的佼佼者就是Green Hills的Integrity,这两个领域可靠性要求都是很高的。

PikeOS 也是另外的一个微内核的实时操作系统,广泛应用于国防、航空还有工业的应用。

Symbian也是另外一个流行的微内核系统,主要应用在手机上。不过不是纯的微内核,算是混合内核吧,因为驱动都是在内核里,不过文件系统、网络还有电话服务都是在用户空间。

我可以三天三夜讲不停,不过很显然在对可靠性和安全性要求较高的应用上,设计者基本都是选择微内核的操作系统。Linus个人可能不太关注嵌入式实时系统领域(这一领域十分看重性能、可靠性和安全性),这些领域的市场都是很大的,很多相关的公司都认为微内核是实现这些目标的途径。

回到下PC领域吧,还有个L4Linux,由Technical University of Dresden(TUD)的Hermann Härtig的团队开发。可以将整个Linux运行在L4微内核上的用户空间里,而性能只低了几个百分比。使用微内核可以允许TUD的师生们在L4基础上构建新的系统,比如:DROPS (重实时性)和NIZZA (重安全性),这些系统都可以完全访问Linux而不用修改代码来增加新特性。这样,他们可以实现在新的设备上运行旧程序。也有其他团队使用L4来进行操作系统研究的,比如Wombat ,半虚拟化的Linux用于支持在嵌入式系统运行遗留的旧程序。还有TUD-OS 以及更多更多。

微软也对微内核感兴趣。它可是比任何人都明白维护一个宏内核都多让人想死。Windows NT 3.1就是个三心二意的微内核尝试,不过搞砸了,性能在90年代初期的硬件上不足,所以就放弃这一尝试了,当然,暂时的。目前,它正在目前的硬件上再次尝试,结果就是Singularity。我知道很多人都说要是微软真要这么干下去,那就蠢死了。不过推动这个项目的人,Galen Hunt和Jim Larus都不笨,人家知道Windows一团糟,要找个新路线。哪怕是负责Vista的都知道有问题,把驱动往用户空间里移,这可是我一直提倡的。

大约十年前,IBM开始从头开发一个新的高性能的操作系统用来服务它的超级大客户。一个明确的目标就是把系统功能从内核内转换成服务组件和应用程序的组合,这很类似微内核。这个系统,K42,已经部署在能源部和其他地方了。

Mac OS X也是类似微内核的。在内部,就是由Mach的微内核和之上的Berkeley UNIX组成的。因为所有东西都运行在内核态(就为了那么点可怜的性能),所以不是一个真正的微内核,不过Carnegie Mellon University很多年前就已经把 Berkeley UNIX的放Mach的用户空间里运行了。所以再来一次又不是不可能,也就想L4Linux一样损失一点性能。把苹果的BSD的代码(Darwin)往L4上移植变成真的微内核系统也已经有人正在做 了。

虽说一直都是展望的巨人,行动的矮子,GNU HURD也是微内核的。两个都是,前一个版本基于Mach,后一个L4。第三个版本或许基于另一个微内核,Coyotos。HURD是Richard Stallman的设计作品,他也是emacs、gcc,还有其他广泛使用的软件,以及GPL的作者以及著名的麦克阿瑟天才奖 得主。

另一个开发中的微内核系统是Coyotos,EROS的后继。相对可靠性更加集中于安全性,不过么,放不断膨胀的内核里面,这两个相关的问题都会越来越明显。

我就不说虚拟化的东西了,比如XenTrango ,和微内核有不少区别,但是也都秉承内核态代码越少越好的特点。这一特点一直是我强调的构建可靠和安全系统的关键。

看看 MINIX 3, QNX, Integrity, PikeOS, Symbian, L4Linux, Singularity, K42, HURD, Coyotos还有那一坨坨其他的一个理念的系统,显然不止我一个觉得微内核有特点。你要是好奇怎么微内核不流行,我只能说,很多系统都是有惯性的。为什么Linux和Mac OS X不能取代Windows?一样的,一堆惯性放那的。巴西的汽车都可以用家里种的乙醇,所以巴西相对就比较少依赖汽油 。怎么美国就不这么做这样就可以不用依赖朝三暮四的中东?嗯,惯性。让人们改变,即使让他们换成更优秀的方式也都难如登天。

7 我正在说明什么?

其实么,MINIX 3 还有我的研究不是有关微内核的,是有关构建高可靠、可自愈的操作系统。我希望等我的工作完成了,电脑就用不上重启键了。电视机没有重启键,音响也是,汽车也是。他们也都由软件实现功能,但是却用不上重启键。计算机之所以需要就是因为计算机软件老爱崩溃。我知道计算机软件和汽车软件有区别,不过用户就希望他们都能工作,不希望被人告知为什么汽车就可以正常工作而计算机就不可考。我就是想构建一个平均死机一次的时间比一般计算机的寿命还要长的操作系统。这样一般用户就不会有机器死机的体验了。MINIX 3有很多特别的可靠性的特性 。虽说我们还没有完全完成吧(比如,虚拟内存计划在今年晚期完成),我想提高可靠性是目前操作系统设计者所面临的最大挑战。一般用户是不会关心什么新特性的或者是榨取硬件最后一丝的性能的,但是却会关心计算机可以100%的完美工作从不死机。不信就问你奶奶去。

那么微内核和这个理想有个什么关系呢?只不过微内核可以实现自愈的系统。这就是我所关心的和我的研究的内容。把操作系统中的一大部分改造成为用户进程,每个驱动一个进程外加各种服务组件,这种凡是其实并不能减少代码中的bug数量,但是却可以显著的减少每个bug可能带来的严重破坏的能力,同时也减少了可信计算基的大小。在我们的设计中,如果大部分驱动失效了,再生服务都可以重新开始一个新的拷贝,然后保存下已死的驱动的内存镜像方便调试,并且记录下时间,发送邮件给管理员或者开发者等等额外的工作。系统则可以继续运行,最不济也可以优雅的关闭系统而不损失任何工作结果和数据。其他的一些部分,比如重生服务本身、文件服务还有进程服务是很重要的,因为一旦他们不能正常工作就会导致系统崩溃,但是显然是不可能允许出错的视频驱动、打印机或者扫描仪驱动来损坏系统的。这些程序应该都可以重新启动然后继续正常工作。我们的目标就是系统可以检测和修复自己本身的错误。这在微内核的系统上很容易实现。而在宏内核上就相对有难度,不过华盛顿大学的研究人员已经利用Nooks 做了很多工作,Karlsruhe大学的团队也利用虚拟机技术 完成了很多有意思的工作。

8 Linus论Linux

最近更新,Linus似乎也明白了Linux正在越来越膨胀,这里 有他自己的评论。

9 作业

在自以为是的讨论微内核能做什么和不能做什么前,最好试一试MINIX 3,好歹可以明白的更多些。这可以增加你吐槽的战斗力。要想更深入了解MINIX 3的设计,可以看IEEE上挂着的文章这个模块化编程的文章 刚出现在USENIX ;login上,或者看这个技术报告

你要是看到了这里,我只能感谢你能花这么多时间看我写的东西了。

Andy Tanenbaum, 12 May 2006

Footnotes:

1

应该意思就是,说话别不过脑子。