加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱资讯网 (https://www.52junxun.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

unix结构分析 Kernighan《UNIX 传奇:历史与回忆》杂感

发布时间:2022-12-16 10:55:13 所属栏目:Unix 来源:
导读:  在 60~70 年代,高端计算机的代表有 CDC 6600(60-bit)、 IBM 7094/360/370 系列(36-bit 或 32-bit)、 Clay-1 (64-bit)等等,它们的售价数百万美元起,折合今天上千万美元一台,也就是人民币上亿元,运行着
  在 60~70 年代,高端计算机的代表有 CDC 6600(60-bit)、 IBM 7094/360/370 系列(36-bit 或 32-bit)、 Clay-1 (64-bit)等等,它们的售价数百万美元起,折合今天上千万美元一台,也就是人民币上亿元,运行着科学计算和“海量”数据处理等关键任务。与之对比,16-bit 的 PDP-11 小型机的价格只有这些大家伙的百分之一,Unix 最初定位是面向程序员的交互式操作系统,其核心功能(卖点)是文档制备(document preparation),说白了就是排版打字,核心业务和 90 年代国内街头常见的电脑打字铺子高度重合。70 年代的科研院所没有认真对待这种运行在“低端”设备上的、很长时间没有商业支持的“hobbyist”操作系统是完全可以理解的。但是unix结构分析,Unix 靠着群众路线,走农村包围城市的道路,最终鲤鱼跃龙门,成就一代霸主地位,把以前那些大家伙们扫进了历史的垃圾堆。由于 Unix 售价低廉,对大学等教育机构只收几百美元的工本费(磁带和邮寄),还附带完整源码和详细的程序员手册,大约从 1975 年开始,它开始在大学中流传,在学生中占领了思想阵地,大家认为在 Unix 上写代码或改进 Unix 系统是很酷的事情,有无数的毕业论文以此为题(下文提及的 Marshall Kirk McKusick 博士即是一例),然后随着这些学生毕业进入工业界,也慢慢把 Unix 带入了各大公司。这个故事在这本《Unix 传奇:历史与回忆》里有生动的论述,我就不剧透了。
 
  惯性的力量是强大的,2000 年起 Linux 在服务器领域逐渐取代 Unix 其实也是靠着类似的惯性 。公司初创的时候买不起高端的 Unix 服务器,拿 PC 机装个免费的 Linux 就能开展业务。等到业务量大起来了,往往选择买更强大的 PC 服务器,继续运行 Linux,而不是迁移到 Unix。如此新陈代谢下来,Linux 市场份额越来越大。另外一个数据:从 2018 年起,Top 500 的超级计算机全部都是 Linux 系统。
 
  甚至与目前大家对 Unix 的印象相悖,Unix 一开始也不是安全、可靠、高性能的代名词。1988 年世界上第一个通过因特网传播的计算机病毒 Morris 蠕虫 感染了全球 1/10 的联网 BSD Unix 主机。Marshall Kirk McKusick 等人在 1984 年发表的经典论文《A Fast File System for UNIX》中提到,传统的 Unix V7 文件系统只能发挥 2% 的磁盘最大带宽,也就是 20KB/s,比软盘快不了多少。而他实现的 Berkeley 快速文件系统(FFS),提高了可靠性,还把性能提高了 10 倍以上,即便如此,也只发挥了 50% 磁盘带宽,有兴趣的读者可以听 Dr. McKusick 自己讲这个故事。我还听说一些商业公司的例子,这里就暂且按下不表了。
 
  Unix 早期历史
 
  最早 PDP-7 上的 Unics 内核是 Ken 一个人写的,之后 dmr 加入一起开发了 PDP-11 上的 Unix,并同时负责 C 编译器的开发;可以说,早期的 Unix 内核是 Ken 和 dmr 的“二人转”,从 V4 到 V6 的内核源码有两个子目录,ken 和 dmr,分别存放二人各自维护的源文件。到了 V7 才根据功能划分——而非源码作者——组织内核源文件。
 
  Unix 的诞生可以说是机缘巧合,在正确的时间出现在了正确的地方, 有 Ken Thompson 在 2019 年 5 月自己亲口讲述这个小故事。注意,有人把这个故事误传为 Ken 花 3 周写出来了 Unix,这是理解错误。Three weeks away from an OS,是说 Ken 花 3 周写了一个编辑器、一个汇编器、一个 shell,这样就把 Unix 空缺的部分填上了,而 Unix 内核在这之前就已经写好了。我总结就是 Bell Labs “有钱又有闲”。Bell Labs 当时属于 AT&T 公司,由于 AT&T 垄断了美国全国的电话业务,“收电话税”富得流油,Bell Labs 也资金充足。在 PDP-7 上写了 Unics 之后,Ken 纠结了几个人一起忽悠领导买了一台名义上用于打印专利申请表的 PDP-11,实际上用它来继续搞操作系统开发。另一方面,也正因为 AT&T 的垄断地位,其受政府的严格监管,经营范围不能涉及销售计算机软件(含操作系统),Unix 才可以以接近免费的价格“开源”给大学,并且开发由 Ken 和 dmr 这样的绝顶程序员主导。假如 Unix 一开始就是商业产品,我猜这个传奇就不会发生了:一是价格不会那么低,用户群不会这么大;二是从知识产权保护的角度,估计也不会提供源码;三是会为了增加销量而实现甲方种种不合理需求,不会保持简洁优雅的高品味。
 
  我把《Unix 传奇:历史与回忆》的时间线整理成下表:
 
  版本发布日期内核行数目标大小主要改动
 
  PDP-7 Unics
 
  1970-01
 
  3,000 汇编
 
  单用户
 
  第 1 版 Unix PDP-11/20
 
  1971-01
 
  4,700 汇编
 
  文档排版工具 roff
 
  第 2 版 Unix
 
  1971-11
 
  首次提供 C 编译器、新的排版工具 nroff
 
  第 3 版 Unix
 
  1972-06
 
  多用户?管道、Yacc
 
  第 4 版 Unix PDP-11/45
 
  1973-11
 
  6,500 C 和 600 汇编
 
  内核改用 C 语言重写,CACM 1974论文。troff
 
  第 5 版 Unix PDP-11/40
 
  1974-06
 
  7,600 C 和 1,100 汇编
 
  25KB
 
  开始进入大学。C 语法把 =+ 换成 +=,已经很接近现代版本。
 
  第 6 版 Unix PDP-11/70
 
  1975-05
 
  10,500 C 和 1,700 汇编
 
  28KB
 
  《莱昂氏UNIX源代码分析》、日本人写的《Unix内核源码剖析》、国人写的《返璞归真——UNIX技术内幕》;MIT 的现代克隆 xv6。C 语言新增 long 类型。
 
  PWB/Unix
 
  1977-07
 
  10,000 C 和 1,000 汇编
 
  lex、make。C 语言新增 unsigned、union、typedef 关键字。
 
  移植 Interdata 7/32
 
  1978
 
  9,000 C 和 3,200 汇编
 
  52KB
 
  澳大利亚的卧龙岗大学把 v6 移植到了新的 32-bit 硬件平台。
 
  第 7 版 Unix
 
  1979-01
 
  17,000 C 和 2,100 汇编
 
  51KB
 
  第一个便于移植的版本,awk、pcc、tar。C 语言新增short、enum 关键字。
 
  32V Unix
 
  1979-05
 
  14,700 C 和 1,200 汇编
 
  59KB
 
  V7 首次移植到 VAX-11/780,但没有使用分页式虚拟内存。
 
  System III
 
  1980-06
 
  17,800 C 和 1,600 汇编
 
  第一个有商业支持的版本
 
  表中的发布日期和内核源码行数来自:
 
  搁在今天,以早期 Unix 内核的代码量和复杂度而论,估计会被归入嵌入式操作系统或者微控制器上的实时操作系统。根据 Andrew S. Tanenbaum 在 ~ast/brown/ 的观察,优秀的个人程序员可以独立实现早期 Unix 内核的完整功能,他举了几个例子,包括:
 
  我估计进入 2010 年之后,实现 Unix v6 这种级别的操作系统的工作量可以当本科生的毕业设计,但当不了硕士的毕业论文。
 
  当然,这里边要数 Ken 和 dmr 首创 Unix 的含金量最高,后面的跟风之作只能算 Unix-clone,毕竟模仿是最大的恭维。Ken 和 dmr 首次完成了用高级语言实现操作系统的创举,并“年纪轻轻”就获得了 1983 年的图灵奖(获奖的时候二人只有 40 岁出头,而在 40 岁之前获得图灵奖的目前只有 Donald Knuth 和 Robert Tarjan 两人)。在 Unix 之前,操作系统都是用汇编语言写的,针对特定硬件平台,不可移植,“拿高级语言写操作系统”会被当成疯子;在 Unix 之后,我不知道哪个主流操作系统(MS-DOS 除外)不是主要用 C 写的。可以说 Unix 重新定义了“操作系统”,就凭这一点就足以永载史册。
 
  TCP/IP 也有类似的情况,Vinton Cerf 和 Robert Kahn 凭借在 1974 年设计了 TCP/IP 获得了 2004 年图灵奖,他们的论文《A Protocol for Packet Network Intercommunication》其实与后来 1981 年 9 月发布的 RFC 793 定稿在细节上有不小的出入,但首创之功属于他二位。 Bill Joy 于 1982 年左右在 4.2BSD Unix 上实现了第一个广为使用的 TCP/IP 协议栈,后来创建了 Sun 公司,成了亿万富翁。Van Jacobson 在 1988 年成功提出了 TCP 拥塞控制,解决了当年的大面积网络瘫痪问题,他于 2012 年成为 Internet 名人堂 的创始成员。适合嵌入式系统的 lwIP 是 Adam Dunkels 2001 年的硕士论文。而到了 2020s,实现一个玩具级的 TCP/IP 已经降级为大学本科编程大作业的内容 。
 
  参考资料
 
  这本《Unix 传奇:历史与回忆》当然是最好的参考文献,是当事人回忆的一手资料。另外也可交叉印证以下内容。
 
  Unix 的遗产
 
  上大学的时侯有一阵我对各种“底层实现”产生了比较浓厚的兴趣,但事实证明钻研古代 Unix 源码的性价比不高。我先是囫囵吞枣读了 CACM 1974 年那篇经典论文,然后不自量力试图去读《莱昂氏UNIX源代码分析》,结果只大致读懂了 malloc 和 printf 这两个基础库函数的实现,后面操作系统内核的实际内容由于缺乏对 PDP-11 的理解实在读不下去,只好半途而废。记得还从图书馆借阅过浙江大学胡希明老师编著的《Unix 结构分析》,这恐怕是全球惟一一本对 Unix System V 做源码分析的书(System V 至今没有正式开源)。第一部分文件系统的实现(一次间接、二次间接)还勉强能跟上,第二部分开始讲 VAX-11/780 上的内存管理,又让我放弃了。我认为一头扎进工业级的源码去学习是非常低效的,只能算是没有办法的办法。我当年在 tuhs.org 上漫无目的地看 Unix 源代码,除了让我感叹 C 语言这么多年没啥变化之外,也没学到啥有用的知识,现在只记得有一处 C 语言的用法让我记忆犹新:位于 的 printn() 函数,打印 b 进制的整数 n,其中最后一句是:
 
      putchar("0123456789ABCDEF"[(int)(n%b)]);
  我当时就觉得没有必要花时间去弄懂 PDP-11 和 VAX-11 这种比我年龄还大的早已被淘汰的机型,现在就更不必说了。因此我建议对 Unix v6 有兴趣的读者可以去看 MIT 的人在 x86 上重新实现的 xv6,代码量约一万行。xv6 适当简化以突出重点,学习的性价比较高。
 

(编辑:我爱资讯网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章