Linux与学术界
作者/ Wolfgang Mauerer
Wolfgang Mauerer资深Linux专家,有数十年Linux开发经验。从1997年最初发表关于内核的系列文章开始,他就醉心于解释Linux核心的内部机制、编写相关的文档。此外,他还著有LaTeX排版方面的图书,其撰写的大量文章已经被翻译成7种语言。
编写操作系统不是一项容易的任务,我相信读者同意这一点,这是对软件工程师最复杂的挑战之一。参与创造Linux内核的开发者中,许多人在其领域中都属于顶尖者之列,这使得Linux成为现存最好的操作系统之一。开发者拥有学位是很常见的,而计算机科学的学位是很具代表性的。1
1请注意,我对此没有进行任何定量分析,但许多开发者的履历表很容易在因特网上找到,这些(还有常识)支持了我的疑问。
操作系统也是学术研究中的活跃主题。类似于每一个其他的研究领域,操作系统的研究伴随着一定量的理论,这很自然,你不能以实用方式解决所有问题。与许多其他关注基本问题的领域相比,但操作系统研究的问题究其本质是实用性的,而且影响到实际的事物。如果操作系统研究不能有助于改进操作系统,那么它还有什么用?而且因为操作系统本质上是一种实用产品(毕竟,谁会需要一种理论上的操作系统呢?理想计算机当然不需要使用操作系统,而真实的计算机更不需要理论操作系统),操作系统研究的结果必定会影响实践。研究圈量子引力(loop quantum gravity)的人可能不需要考虑其工作的实际影响,但这与操作系统研究的情况不同。
考虑到这一点,我们可以料想Linux和学术界应该是紧密关联的,但遗憾的是,事实并非如此。在内核源代码中引用学术的工作是少有的事情,而研究论文对内核的引用也并不多见。
这特别令人惊讶,因为学术界过去曾经与UNIX有着密切的关系,特别是BSD系列的UNIX。可以很公平地说,BSD是学术研究的产物,而且长期以来,学术界都是该项目背后的驱动力量。
由Linux基金会发表的一份研究KHCM表明,在Linux的最新版本的所有修改中,来自于学术界的贡献大约占0.8%。考虑到大量的思想在学术界传播,0.8%的比例也太低了些,为Linux内核和学术界的利益考虑,这种情形是值得改进的。开源就是共享,而共享好的思想也是一个有价值的目标。
Linux与学术界的关系最初有点磕磕绊绊。Linus Torvalds编写Linux最初的动机之一是他对Minix的不满,这是一个简单的教学用操作系统。这导致了Torvalds和Minix的创造者Andrew Tanenbaum之间的一场著名的辩论。
Tanenbaum建议称Linux是过时的,因为其设计并未遵守学术界预期未来操作系统应该遵守的规则,其论据收集在一个Usenet新闻组中,发表的标题是“Linux is obsolete”。很自然,这导致了Linus Torvalds的回复,其论点之一如下:
Re 2: 你的工作是教授和研究人员:这是minix的一些脑残设计的好借口。
尽管Linus不久就承认这个回复有点鲁莽,但它反应了内核社区在某些时候对学术研究所表现的态度。实际的操作系统和以操作系统为目标的研究似乎有点不怎么搭调。
有时候可能真是这样:许多学术研究都不会集成到实际产品中,特别是涉及一些基础性的问题时。但此前提到过,研究也有实用性的分支,这些通常有助于改进内核。遗憾的是,操作系统的研究人员和实现人员在一定程度上失去了联系,而Rob Pike,贝尔实验室前UNIX团队的一个成员,甚至悲观地声称系统软件研究已经边缘化了。2
2参见www.cs.bell-labs.com/who/rob/utah2000.pdf。由于Pike还声称操作系统领域唯一的进步来自微软公司,我当然不相信他所有的主张,但其演讲仍然包含了许多值得注意和正确的想法。
由于种种原因,向内核贡献代码对研究人员来说是比较困难的,一个原因是他们必须考虑许多不同的操作系统。跟上Linux内核开发的脚步已经比较困难了,何况要跟踪当今所有最重要的操作系统,这实际上是不可能的。因而,研究人员对其思想的实现通常仅限于概念证明。将这些思想集成到内核中,需要两个社区的共同努力。例如,考虑交换令牌机制集成到内核的过程。该机制是在研究中提出的(在下一节讨论),但在Linux内核中是由Rik van Riel实现的,他是一位内核开发者,工作于内存管理领域。该方法被证明相当成功,很可以作为学术界与Linux内核之间进一步协作的样板。
两个社区之间的交互是复杂的,这是由内核开发的以下两个方面决定的。
许多开发者不会考虑没有具体代码的提议,并拒绝进一步讨论相关问题。
即使代码提交到邮件列表,也有相当一部分工作是在初始提交后开始的。将提议的代码针对具体的系统进行改编,在学术界评价不高,因此研究人员有一种避免该步骤的自然倾向。
最终,会得出这样的结论:内核开发与学术研究之间的接口,需要每方各出一人,才能彼此协作。如果这是不可能的,那么如果研究人员能够设法尽可能适应内核开发的文化,也会很有好处。
一些例子
本节介绍一些例子,主要涉及一些转化为内核代码的研究成果,它们对改进内核的特定方面提供了帮助。请注意,本节所选择介绍的内容当然不全面。而且,说到学术研究在内核领域的影响力,即使是有,实际上也是可以忽略的。本节主要是强调两者可以彼此受益。
交换令牌首先由S. Jiang和X. Zhang在论文“Token-Ordered LRU : An Effective Replacement Policy and its Implementation in Linux Systems”(发表于Performance Evaluation,卷60,2005年1—4期)中提出。随后,Rik van Riel在内核版本2.6.9中实现了该机制。有趣的是,该论文扩展了内核版本2.2.14来示范其方法的有效性,但相应的代码从未包含在主线内核中。
slab分配器是直接基于一篇论文,其中描述了Solaris中slab系统的实现:“The Slab Allocator : An Object-Caching Kernel Memory Allocator”,发表于1994年夏天USENIX会议的会议录中。
预测I/O调度器的技术首先由论文“Anticipatory Scheduling : A Disk Scheduling Framework to Overcome Deceptive Idleness in Synchronous I/O”提出,发表于2001的第18届ACM Symposium on Operating Systems Principles会议。
Linux采用了一种LRU技术的变体来确定活动页,并将其与不活动页进行区分。由S. Jiang、F. Chen和X. Zhang发表的论文“CLOCK-Pro : An Effective Improvement of the CLOCK Replacement”(发表于2005年USENIX年度技术会议的会议录)描述了一种页面替换算法,不仅根据最后访问页的时间来对页进行排序,还合并考虑了页被访问的频率。基于该论文的补丁已经由Rik van Riel和Peter Zijlstra设计,该方法还一直被认为是一个可能的合并候选者(参见www.lwn.net/Articles/147879/)。读者在前文尚未得知该技术的原因很简单:该补丁尚未进入到主线内核。但它们确实是一些实例,表明了Linux开发者有时候确实在活跃地试图将研究成果集成到内核中。
这些论文提出的思想已经直接集成到Linux内核,作为现存代码的直接扩展。比较老一些的论文对内核也有间接的影响,如下所示。
块层作为文件系统和磁盘之间的一个间接层,其一般结构基于由W. de Jonge、M. F. Kaashoeck和W. C. Hsieh发表的论文“The Logical Disk : A New Approach to Improving File Systems”。实质上,该论文讲述了将物理磁盘上的块与操作系统所观察到的逻辑磁盘解耦的技术,这构成了逻辑卷管理器和设备映射器的基础。
Ext文件系统族的许多关键概念发源于其他文件系统,一个具体的例子是M. K. McKusick、W. N. Joy、S. J. Leffler和R. S. Fabry(在ACM Transactions on Computer Systems,1984年)发表的论文“A Fast File System for UNIX”。该论文介绍了对磁盘上多种可能块长的利用,并引入了将一个逻辑数据序列映射到磁盘上的一组顺序排布的块的思想。
与考察直接来自于研究的思想相比,跟踪较陈旧论文对内核的间接影响自然要困难得多。思想越通用,如果能够流行起来,就可能变得越普遍,也就越难识别出该思想的应用。在某些时候,思想可能已经被相应的领域吸收,与常识无法区分。当然,如果要追根溯源的话,可能就得引用到任何提及计算机趋向于使用二进制数字进行工作的论文,这有必要吗?
本质上,UNIX操作系统的大多数核心思想都呈现在Linux中。现在,这些思想中许多都已经传播得非常普遍,但在UNIX发明时,这些思想还是新的。例如,其中就包括几乎一切都可以表示为文件的思想。命名空间是另一个间接来自于学术研究的技术:在该特性被主线内核采纳的很多年前,它们作为Plan 9的一个不可分割的部分被发明,Plan 9是UNIX的后继者,由UNIX的一部分发明者共同开发。3/proc也是以Plan 9为模型。
3请注意,Plan 9不是在一个经典的学术机构中开发的,而是在贝尔实验室的研究部门,现在附属于朗讯科技公司。但其使用的方法论与学术机构非常类似:发表有关Plan 9的论文,举行相关演讲,组织相关的会议。因而,本附录将其归类到学术界。cm.bell-labs.com/plan9网站包含了有关Plan 9的更多信息。
许多作为Linux一部分的UNIX基本思想,都并不被认为是研究成果,但这不是本节直接关注的内容。但可以饶有趣味地观察到,Linux的许多概念都有其根源,例如在Vahalia对许多种UNIX系统内部实现的讨论中([Vah96],高度推荐!)。Salus的陈述([Sal94])阐明了UNIX的历史,可用于理解许多东西的设计方式。
采用研究成果
前述的例子说明了可能将研究成果集成到Linux内核。但考虑到操作系统研究的数量级,对比集成到Linux内核中的成果数量,似乎有些障碍阻止了将成果从一方传递到另一方。其中一个原因就是两个社区的运作方式相去甚远。据我所知,这一点尚未得到应有的关注(至少在本文撰写时是这样)。因此,本节将突出强调两个社区的一些本质性的差别。
请注意,内核源代码在Documentation/ManagementStyle文档中包含了一些信息,讲述了内核开发者如何处理项目管理问题。该文档也涉及这里讨论的一些问题。
不同的社区
对许多人来说,软件开发和操作系统研究看起来都是干巴巴、纯粹技术性的事情,但二者都有巨大的社会性成分:对任何工作的接受,都是基于社区对该工作的接受,也就是被各个开发者/研究人员接受。这要求个人对来自其他个人的贡献进行评价,大多数读者可能都会同意,在这个存在着多种多样不同或复杂性格的世界上,这总是一件困难的事情。在理想化的世界上,评价可以完全基于客观准则进行,但实际上事实并非如此:人只是人而已,同情、个人品位、熟悉、厌恶、偏见和彼此沟通能力都会发挥关键的作用。
解决该问题的一种途径是直接忽略它,假装我们在一个理想世界中,评价是在一个纯粹技术性的客观层面上完成。这样,所有问题都会自动消失。这个解决方案被采纳的频度之高异乎寻常,特别是在官方声明中。
但即使证实了问题的存在,也并不容易解决。看一看下面学术界通常怎样判断一项工作是否有价值(根据是否被会议接纳或以论文形式发表,而确定相关工作的价值)。
在获得研究成果(这是有希望的)之后,成果会归纳到一篇论文中,提交到一份期刊(或会议,或类似的什么,但为简单起见,这里的讨论只关注出版物)。
论文发送到一个或多个审稿人,对工作进行评价。他们必须判断论文的正确性、有效性、在科学上的重要性,还可以指出应该改进的地方。审阅者通常是匿名的,与作者本人或其职业不应该有直接关联。
根据审稿人的评价,编辑可以决定拒绝或接受论文。在后一种情况下,编辑可能要求作者针对审稿人的建议做一些改进。在改进之后,可能会进行另一轮同行审查。
通常,审稿人知道作者的身份,但反之则不然。
在内核社区中,如果工作包含在某个官方代码树中,则被认为是值得的。要将代码加入这些代码树中,基本上需要经由下述流程。
代码发送到适当的邮件列表。
邮件列表上的每个人都可以要求修改代码,如果需要,还可以对改进进行公开讨论。
修改代码,以达到社区的要求。这可能会比较棘手,因为对什么是改进、什么会降低代码的品质,通常有一些正交的意见。
重新提交代码,重新开始讨论。
在代码达到所期望的形式并达成一致意见之后,将被集成到官方代码树中。
请注意,有些人可能在其领域中有着长期而卓著的声誉(自然,这又是一个社会性因素),这在学术界和内核社区都能缩短实际的处理过程,但这里不关注此种情况。
在学术界和内核开发社区有着相似性,二者都有其长处和短处。例如,在两个社区的评审过程中,有一些重要区别。
- 审阅向内核提供的代码不是一个正式的过程,没有一个权威机构来发起代码评审。审阅的进行完全是自愿、没有协调的,如果没有人对提交的代码感兴趣,邮件列表可能保持缄默。
尽管学术界的审阅通常也是自愿进行、没有报酬的,但不可能完全忽略提交的论文。论文保证会得到一些反馈,尽管有可能非常肤浅。
在内核社区中,代码提交者和审阅者彼此了解对方的身份,还可以直接交互。在学术界,通常不是这样,作者和审阅者之间的交流需要通过编辑这个桥梁,他们之间的交互是间接的。此外,在编辑决定取舍之前,作者和审阅者之间的交流讨论很少。
在学术界,审阅的结果只有提交者、审稿人和编辑知道。在内核社区,整个代码评审过程都是公开的,每个人都可以阅读到。
在这两种环境下,审阅者都可能向提交者提出苛刻的批评。在学术界,提交者向审阅者作出的陈述措辞通常会更为谨慎,而在内核社区,则取决于提交者和审阅者的身份。
对改进任何工作的质量,批评都是有价值和必要的,但接受批评是一件复杂的问题。对该问题的处理,是内核开发和学术界的另一个重要区别。
以各种新奇的、通常是无礼的言辞给他人制造困扰,已经成为一些内核开发者的“商标”,而相关的陈述可以在因特网上公开获得。这导致了一个严重的问题,因为没有人愿意被当众侮辱,开发者可能为此避而远之。几个领头的Linux开发者都关注到了这个问题,但因为邮件列表上所有人都是成年人,除了呼吁更公平之外,不能以其他任何形式解决该问题,而对公平的呼吁并不是总能被接受。
在学术界,受到匿名审稿人的苛刻批评当然也不令人愉快,但私下里受到指责,比当众被人批评要容易接受得多。
读者从以下的文档片段可以看出,在解决这个问题时,内核开发者并不争取做到完全的“政治正确”:
Documentation/ManagementStyle
The option of being unfailingly polite really doesn't exist. Nobody will
trust somebody who is so clearly hiding his true character.
彼此拖后腿可能是个好事情,在正确运用的情况下,有一点智力挑战的意味。但这也很容易做得过火,导致人身攻击,任何人当然都不愿意接受。但遗憾的是,在内核社区中,每个人都应该对此有所准备。
与学术界相比,内核社区的评审过程在社会性上可能更具挑战性,它也趋向于更有效率,只要人们不被这种方式赶走:内核邮件列表上的补丁在被认为可接受之前,会经历许多次迭代,每次迭代过程中,审阅者都会标识出遗留的问题,作者可以更改。因为Linux内核的目标是做到世界上最好,重要的是只集成真正优质的代码。这样的代码通常并非一开始就能得到,只有经历一段时间的改进和精炼之后才行。评审过程的整个目的就在于,形成尽可能最好的代码,这种做法在实际上通常会有效。
学术论文的审阅,其效果通常是不同的。如果期刊拒绝了提交的论文,作者当然会进行修订以改正缺点。但读者可以自行考虑一下,论文进行实质性修订的概率。一方面,提交者需要发表尽可能多的论文来获得学术声誉;另一方面,研究工作可以提交到大量不同的期刊(可能不那么知名),而这些期刊依赖于作者为发表论文而支付的费用作为经济基础!对内核代码来说,情况是不同的:或者你能够使代码进入到内核,或者大量的工作被浪费掉。4这自然提供了一个很大的激励,使得工作重心能够投入到对代码的改进上。
4完全可能在内核代码树之外维护代码,在许多情况下这已经被证明是有用的,但开发者(及其雇主)最终和最具回报价值的目标仍然是将其工作集成到主线内核中。
尽管初看起来,学术界和内核社区用于评估和保证提交的论文/代码的质量的方法类似,但它们之间有大量的差别。对于两者思想的交流,不同的“文化”氛围可能是一个相当大的障碍。在内核社区和学术界合作时,尤其应该考虑这个因素。
众所周知,Linux操作系统的源代码复杂、文档少,对程序员的要求高,要想看懂这些代码并不是一件容易事。《深入Linux内核架构》结合内核版本2.6.24源代码中最关键的部分,深入讨论Linux内核的概念、结构和实现。具体包括进程管理和调度、虚拟内存、进程间通信、设备驱动程序、虚拟文件系统、网络、时间管理、数据同步等方面的内容。本书引导你阅读内核源代码,熟悉Linux所有的内在工作机理,充分展现Linux系统的魅力。本文选自《深入Linux内核架构》。