1991 年,21 岁的芬兰大学生 Linus Torvalds 写下第一行 Linux 内核代码时,多半没有想到它会成长为今天这样的庞然大物。

当年 8 月 25 日,Torvalds 在 Minix Usenet 新闻组里发了一封帖子,称自己正在做一个自由的操作系统,“就是个兴趣爱好,不会搞得像 GNU 那么大那么专业”。

事情的发展显然远超他的预期,如今小到传感器,大到超级计算机,从智能手机、手表、汽车等日常用品到航天器等设备,Linux 内核的身影已无处不在。

随着迄今为止最大版本 Linux Kernel 5.8 于今年 8 月初的发布,Linux 内核已拥有超过 2 万名贡献者,历史 commit 数超过 100 万次,迎来一个新的里程碑。

上周恰逢 Linux 29 周年纪念日,Linux 基金会发布了一份详尽的 Linux 内核报告,涵盖了自 1991 年 9 月 17 日首次发布以来,到 2020 年 8 月 2 日最新版本的 Linux 内核历史。

版本控制:从 BitKeeper 到 Git

Linux 基金会从 2008 年开始每年发布 Linux 内核报告,但此前一直难以将其发展过程完整串联起来。

今年,借助 Daniel German 博士的 cregit 工具,他们成功追溯到了第一个版本,Linux 内核的发展时间线变得清晰。根据版本控制方式,可大致分为以下三个阶段:

  • pre-version control(前版本控制):1991 年 9 月 - 2002 年 2 月 4 日
  • BitKeeper:2002 年 2 月 4 日 - 2005 年 4 月 15 日
  • Git:2005 年 4 月 16 日至今

版本控制对社区协作能力影响重大,这在 2000 年代初是一件令人颇为苦恼的事情。使用版本控制系统,也就是 BitKeeper 之前,贡献者需要将补丁提交至邮件列表,待 Torvalds 接受后放进源码树,再发布整个树的新版本。在这种方式下,具体是谁在做贡献、贡献的数量和路径都不够透明。2002 年 2 月 4 日,BitKeeper 的使用标志着 Linux 内核 commit 历史的开启。然而 BitKeeper 为专有软件,这一决定在社区中遭受了长期质疑。直到 2005 年,BitKeeper 拥有者 Larry McVoy 决定收回无偿使用 BitKeeper 的许可。Torvalds 本人当时又对现成的 CVS 和 Subversion 等集中式版本控制工具感到不满,因此自己动手,用十天时间写出了 Git 的第一个版本。Git 目前已成为开发者们非常熟知且广泛使用的分布式版本控制系统。Linus Torvalds 则表现得更多的是迫于无奈,他曾声称自己“根本不想做源代码管理,觉得这是计算机世界中最无趣的事情”。自从版本控制系统由 BitKeeper 改为 Git 后,Linux 内核每年的贡献者和 commit 数量都在稳步增长。历年的内核报告数据显示,2005 年 5 月发布的 2.6.12 版本平均每小时收到 2 次 commit。15 年后,2019 年的平均数是每小时 9.4 次。而在最新的 5.8 内核中,平均每小时 commit 数达到了 10.7 次。

繁杂且自成体系的内核代码

首个内核版本 linux-0.01.tar.Z 由 88 个文件和 10,239 行代码组成,运行在 i386 这样单一的硬件架构上。到了 5.8 版本,这一数据扩张为 69,325 个文件和 28,442,673 行代码,并能够在 30 多种主要的架构上运行。数量上的庞大仅是 Linux 内核代码的表象,它自身更是形成了一套复杂的体系,不熟悉的人往往不知从何处下手,极有可能“牵一发而动全身”。这或许也是内核维护者难寻的原因之一。Linux 内核发布第一天起的某些代码仍在当前版本中使用,例如 Torvalds 和大学好友 Lars Wirzenius 共同编写的 vsprintf 例程,它也是为数不多存在至今的首次 commit 中的源代码。今年的内核报告提到,有 2,964 个能被追溯至 1991 年的 token 如今在 5.8 版本中也能找到。5.8 版本超过一半的代码写于近 7 年内,但之前所有年份都对此版本有贡献。过去的代码不断在后续的版本中留下痕迹。持续膨胀的内核文件量和代码行数未见得完全是一件好事,为了使系统不变得臃肿,内核维护者需要做一些修枝剪叶的工作。Linux 内核中未使用的代码和文件都会被视情况删除,有一些版本还会进行大的清理,例如 2018 年的 4.17 版本,删除了 8 个架构,净减少代码大约 180,000 行。不仅仅是源码,Linux 内核维护者还会关注空白行和代码注释,以确保源码的可读性。

开发者原创证书和标签管理

2004 年对开发者原创证书(Developer Certificate of Origin,简称 DCO)的标准化是 Linux 内核史上的一个关键变化点。DCO 的引入为开发者和用户提供了法律保护,同时又不至于增加程序负担。它极大地提高了跟踪补丁进入内核的路径的能力,加上版本控制系统向 Git 的过渡,DCO 有效地减轻了开发者做贡献的开销,因此变得很受欢迎,后来也被许多其他开源项目采用。随着 DCO 的标准化使用,现在几乎所有的 commit 都有一个 Signed-off-by 标签。通常每个 commit 平均会有两个该标签,能够反映代码在合并之前的维护者层次结构,有助于追溯补丁进入代码的路径。Signed-off-by 之外,Linux 内核还增加了表示审查的标签(Reviewed-by 和 Acked-by)。审查对内核代码的质量来说相当重要,标签的加入令这个过程更加清晰,有越来越多的维护者选择使用标签来表示已审查。在审查 git 仓库时,Linux 基金会发现了一些比较有趣的标签,像是 "Enithusiastically-ack'd by"、"Thanksto"、"Based-on-the-Original-screenplay-by"、"Catched-by-andrightfully-ranted-at-by" 等等。但这些标签并没有像上述两类一样被广泛采用。

行之有效的发布模式

Linux 内核的发布模式已渐趋成熟,现在基本固定为 Prepatch(或"-rc")、Mainline、Stable 和 Long Term Stable 四类版本。社区曾对发布周期进行了大量的探讨和实验,并逐渐找到了行之有效的发布模式,发布周期也几乎完全可预测——每个发布周期由时长两周的“合并窗口”开始,这时,新功能经适当的 review 后可被纳入接下来要发布的 git 仓库。一旦它被标记为 rc1,那么集成测试、调试和稳定化的周期就开始了。然后每周对 rc 候选版本进行标记,直到达到目标质量和稳定性。发布后,随着下一个合并窗口的到来,这个周期又开始循环。内核的主线树由 Linus Torvalds 维护,这棵树引入了所有新功能。新的主线(Mainline)内核每 2 到 3 个月发布一次。但这样的发布节奏较慢,难以满足大多数用户的需求。因此,从 2005 年开始,每周发行一次稳定版(Stable)内核。用户还想要维护时间更长的版本,于是 2006 年发布的 2.6.16 版本成为第一个长期支持(LTS)版本内核。此后每年都有一个新的 LTS 内核,该内核将由内核社区维护至少 2 年(从 4.4 版本开始延长至 6 年)。Linux 内核官网公布了所有现存 LTS 版本的发行日期、EOL 日期及维护者(目前 6 个 LTS 版本都由 Greg Kroah-Hartman 和 Sasha Levin 这两人维护)。

贡献者:长尾的力量不可忽视

不少组织都在为 Linux 内核做贡献,贡献者排行榜前列几乎都被 Intel、Red Hat、IBM、SUSE、Google、Samsung、AMD、Oracle、华为和 ARM 这样的大企业占据。从 2007 年到 2019 年,Linux 内核共接受了来自 1,730 个组织的 780,048 次 commit。排在最前面的 20 个组织占了 68% 的 commit 量。在过去十年中,每年有超过 400 个组织为 Linux 内核做出贡献。其中相当一部分可能只有过一次 commit。从每年的 commit 比例来看,其中 1/3 贡献来自神秘的长尾。也就是图中最上面浅灰色 “Others” 的部分。Linux 基金会指出,企业的贡献会根据业务需求和战略的不同而有所变化。前 20 名贡献者中,有些是 2007 年之后才加入,有些在此前做过很多贡献的公司,被收购后便不再继续参与。贡献者的多样性为内核发展赋予了一些弹性。除了组织贡献者,Linux 内核社区成员也致力于增加个人贡献者的多样性,他们通常愿意花费自己的时间来指导新的开发者。Linux 基金会有一个 Kernel Mentorship(LKMP)项目,用来帮助新加入开源的开发者进行实验、学习,并为开源社区做出贡献。

内核社区的共同目标:高质量、可靠性

报告的最后,Linux 基金会指出,内核社区的重点是保持一个共同的目标,即拥有一个没有回归的高质量操作系统,愿意根据需要创建新的流程和工具,以帮助提高效率,并继续提升 Linux 内核的可靠性。内核测试现在也引入了一些自动化测试工具:静态分析工具如 sparse(语义解析器)、smatch(源匹配器)和cocicheck(语义补丁,测试特定的 bug),由 0-day 和 Hulk Robot 这样的自动测试机器人在 Linux 内核树上运行。机器人在发现和跟踪 bug 上起到不少作用。这些测试工具能够帮助开发人员跟上上游内核的速率变化,并继续改进内核版本,提升其稳定性。Linux 内核如今被应用于诸多领域,基金会认为,改进基础设施,进行正确的安全分析,是接下来要应对的重大挑战之一。目前 Linux 内核已拥有一个很好的基础,它应当继续引领创造最佳实践,以促进整个开源软件行业的发展。

linux中的vsprintf_Git29 年超 100 万次 commit,Linux 内核何以发展至今?相关推荐

  1. Cloud一分钟 |百度遭北京信管局行政处罚;双11计算能力超100万核;腾讯回应高管被抓系谣言...

    Hello,everyone: 11月14日早,星期三,新的一天祝大家工作愉快! CSDN一分钟新闻时间: 百度遭北京信管局行政处罚 进入电信业务不良名单 相关部门表示:"后续相关公司如果再 ...

  2. 电脑值得收藏的10个网站,知乎超100万人推荐,让你办公事半功倍,还请低调使用!!!

    今天用到了几个工具网站觉得还不错,今天就来推荐10个知乎超百万人推荐的网站,里面很多网站也是自己一直都在使用的,觉得还不错,帮助了很多,下面就一起来看看是那些吧! 10个网站,知乎超100万人推荐 1 ...

  3. df python 增加数据_美国确诊超100万!教你用Python画出全球疫情动态图(附数据下载)...

     CDA数据分析师 出品   [导语]:今天我们教你用Python绘制全球疫情动态图,技术部分请看第二部分. 获取数据:扫描下方公众号回复关键字"全球疫情" 目前,全球新冠疫情还十 ...

  4. 美国确诊超100万!教你用Python画出全球疫情动态图

    目前,全球新冠疫情还十分严峻.截止4月29日,疫情突破多个标志性的统计节点.其中,全球累计确诊近296万例,累计死亡超20万例:美国累计确诊超100万例,西班牙和意大利累计确诊均超过20万例. 01 ...

  5. linux中yum进程占cpu百分之九十,在Deepin Linux系统中kworker进程占用CPU达到100%的解决...

    如果你在Deepin Linux.Debian.Ubuntu系统中遇到kworker进程占用CPU达到100%,可以用以下解决方法解决问题,本文主要内容为问题起因.microcode介绍.解决方法及总 ...

  6. 8 天扩容超 100 万核,腾讯会议正在刷新历史

    8 天紧急扩容超过 10 万台云主机,投入的计算资源超过 100 万核,这在腾讯云的历史上尚属首次,这应该也是中国云计算史上前所未有的记录. 受疫情影响,在家办公需求暴涨.从 1 月 29 日开始到 ...

  7. 华为一季度每天入账20亿,首次披露云业务用户超100万

    雷刚 发自 凹非寺  量子位 报道 | 公众号 QbitAI 2019第一季度,华为云,100万用户. 这是华为首次披露云业务业绩. 在华为公布的第一季度业绩中,云业务的业绩和进展在最后被重点提及. ...

  8. 阿里Q1财报:云计算付费用户首超100万

    2017年8月17日晚间,阿里巴巴集团公布2018财年第一季度(2017年4月至6月底)财报,阿里云达到一个重要里程碑,云计算付费用户数量首次超过100万.同时,企业级市场被云计算人工智能等新技术全面 ...

  9. java统计点击量每秒100万_这速度嗖嗖嗖!V神:以太坊网络每秒处理量将超100万次...

    以太坊创始人V神近日在一次会议中表示,采用分片技术(Sharding)和Plasma等第二层扩展解决方案后,以太坊网络最终将能每秒处理100万次交易,并且有可能超过每秒1亿次.同时,他也认为第一层和第 ...

最新文章

  1. proftpd mysql_Proftpd(MySQL验证+配额)
  2. 六十三、Vue中非父子(兄弟)组件间传值,插槽的使用和作用域插槽(非常重要)
  3. QDir类cleanPath函数用法
  4. C++内存管理——指针数组
  5. DataGrid与GridView的区别应用小实例
  6. 新iPhone背部Logo将改为整体居中:方便用户使用反向充电
  7. Java-ReentrantLock-NonfairSync/FairSync
  8. 云终端要如何和服务器配置起来使用的
  9. Android深度探索--HAL与驱动开发----第三章读书笔记
  10. NPOI SetColumnHidden隐藏列不起作用的原因
  11. java使用btree_最新阿里、百度Java面试题(基础+框架+数据库+分布式+JVM+多线程)...
  12. VLAN tagged和untagged
  13. mdl文件是c语言,MDL文件扩展名 - 什么是.mdl以及如何打开? - ReviverSoft
  14. 2021年危险化学品生产单位安全生产管理人员试题及解析及危险化学品生产单位安全生产管理人员模拟试题
  15. python输入生日输出星座_怎么利用python输出星座
  16. 【离散数学】二元关系中的自反闭包,对称闭包,传递闭包
  17. python协成_python基础26 -----python进程及协成
  18. xp系统和win7系统哪个好
  19. android连接打印机
  20. Bellman-Ford与SPFA

热门文章

  1. python 知识点总结
  2. Nginx源码阅读(ngx_http_process_request_line)
  3. 使用代理同步Chromium代码的心得(V2.0)
  4. Google ARCore SDK
  5. redis 流 stream的使用总结 - 基础命令
  6. go WaitGroup 简单示例
  7. 左神算法:用栈来求解限制后的汉诺塔问题(Java版)
  8. C# 实验四 获取系统时间、点击加一秒功能
  9. Python基础之:Python中的异常和错误
  10. 深入理解编译优化之循环展开和粗化锁