很多人接触计算机的时间太晚,很多东西已经成型了,很多人看到的已经是它成型时的特性了,至于它为啥会是这样,很多人不知道。我之所以写了Bill Joy(TCP/IP、RPC、分布式文件系统)、Alan Kay(GUI、MVC、面向对象),其实就是想借这些成为历史里程碑的人,用他们串成技术的演变史,让大家理解,技术原来最初是为了干这个才产生的。但是,往往事情会走歪,改变了创始人的初衷。这也算是人生的常态吧。
我这篇文章借OS/2来说说系统虚拟机技术的来龙去脉。我以后还想写写另外一个神人:Lars bak,他是StrongTalk编程语言和语言虚拟机的作者,他是Java Hotspot JVM语言虚拟机的作者,他是JavaScript V8语言虚拟机作者,他是Dart编程语言和语言虚拟机作者,他还是J2ME CLDC设计者,他现在也是物联网平台ToitWare的作者。
(1)多用户-虚拟机
1964年,IBM最具里程碑的产品:S/360计算机发布,使用了跨时代的磁芯内存技术、集成电路主板技术。(当时还是晶体管做CPU。1971年Intel才推出硅芯片CPU)
在S/360之间,计算机型号之间是不兼容的,也就是说你为某个型号的计算机编写的程序在其他型号的计算机上是运行不起来的。所以IBM为了做最大的兼容性,IBM还发明了System/360操作系统,这算是世界上第一款真正的操作系统(过去没有集成电路技术、磁芯技术,所以计算单元简单、存储单元简单,也很难产生复杂的调度管理、复杂的文件系统、复杂的IO外设管理,所以也不需要完整的操作系统)。
当时计算机非常昂贵,所以很多人青睐分时处理技术,让CPU时间切片轮询来服务所有用户。但是IBM没有采取当时大家流行的分时处理技术,而是采取了现在被人们叫做虚拟机的技术,一个用户一个虚拟机。S/360最多可以16个虚拟机。其实现在回过头来看,S/360当时采取的系统虚拟机技术,本质上比Docker原理重,比XEN原理轻,应该和KVM的原理差不多。
(2)多用户-分时轮询
1974年,Unix发布。
Unix的作者Kenneth Thompson他们一开始是为强电气巨头通用电气合作开发分时操作系统Multics的。但是由于搞的太复杂因而这个操作系统迟迟没有出来。而由于IBM发布S/360大型计算机,逼得通用电气错过了竞争时间窗口,因而通用电气宣布退出计算机这个弱电气-微电子行业。所以Multics也就停止合作开发了。
没有项目没有资金资助的Kenneth眼看就要失去工作。他一边寻找其他项目,一边还想心痒痒写操作系统。但是因为项目组解散,通用电气把大型主机的支持也撤走了,汤普森无计算机可使用。他发现贝尔实验室知识产权部门有一台小型机,那台小型机平时就是写写专利申请书,使用量并不大。因为贝尔实验室的主要考核就是专利和论文,这是邀功点啊,所以知识产权部门就拥有了一台小型机。怎么才能蹭计算机使用呢?他发现知识产权专利部门的人员老抱怨PDP-11上的编辑软件用来写论文专利不好使,而且文件系统比较脆弱,容易异常后丢失信息。
所以汤普森利用圣诞节放假(知识产权部门也休假不用计算机)、老婆回娘家(家里没人管)的三周,一周写好文件系统,一周写好引导程序(为了把Unix文件系统挂接到PDP-11小型机上),一周写好一个编辑器(为了知识产权部门写专利申请书)。
但是为了心痒痒一直使用PDP-11小型机,他又写了分时CPU管理,这样分时轮询-多用户并行工作就实现了,知识产权部门人员在编写专利申请书的时候,汤普森就通过电传打字机连接电缆登录上来,用自己的用户账号继续编写自己的Unix操作系统代码。所以Unix开始有了多用户管理功能。
因为多用户使用,但内存太少,需要开发一个内存管理模块来替代PDP-11的内存管理模块,所以他又写了新的内存管理模块。而外设与外设驱动,还是PDP-11的VMS操作系统在管(这里预埋一下:这个VMS操作系统就是咱们一会要讲到的NT的创造者大卫卡特勒的作品)。
有了文件系统和引导程序,有了CPU分时轮询-多用户管理,有了内存管理,有了外设管理与外设驱动,一个完整的操作系统Unix就是这样诞生了。你看,操作系统也没那么复杂吧。所以不要太迷信、太神话一件你不了解的事。
(3)PC操作系统:OS/2的诞生
1977年,苹果公司在首届西岸电脑展览会上展出Apple II,这是世界上第一台个人电脑。1980年,苹果公司公开上市。1980年,IBM赶快应对,采取了业界开放标准,制造个人电脑兼容机。1981年,IBM兼容机出台,用了微软的MS-DOS操作系统、Intel的CPU、3COM的以太网网卡。IBM电脑是世界上第一台能连接以太局域网的个人电脑。IBM总算扳回一局。
1984年,苹果公司发布Lisa电脑,这是世界上第一台图形GUI界面的个人电脑。1985年,微软也发布了Windows1.0 GUI界面的操作系统。IBM一看这状况,得赶紧追啊。所以这次IBM继续和微软保持合作,研发下一代操作系统:OS/2。
但是我不明白的是,为啥上次IBM使用微软的MS-DOS,这次就不使用微软的Windows了,而是想和微软合作研发新一代操作系统?
微软1980年和IBM合作,本来是把小型机上的Unix代码移植到个人电脑上,于是在1980年和SCO合作搞了一个Xenix,可惜后来闹掰,微软没有借鸡生蛋成功,最后被迫匆忙从外面买了一个DOS改名为MS-DOS。随口说一句:现在最正宗的unix代码就在SCO手里,这是辗转AT&T到Novell最后才到SCO手里的。再随口说一句:微软还曾经如法炮制过,和世界上第一个C/S模式的关系数据库公司Sybase合作开发基于Windows的关系数据库,最后微软掌握了核心技术后把Sybase踢走,这就是后来的MS SQLServer。Sybase也不幸于2008年被SAP收购。
(4)多窗口多任务、多用户、多操作系统应用
时间到了1984年,微软一边在改进MS-DOS,一边在和IBM合作研发OS/2,一边在研发自己的Windows,三个操作系统啊,这让微软头疼的要死。
1987年,OS/2 1.0版本发布。虽然还是字符-命令行界面,但是已经提供了很多Open API了,这和MS DOS的中断套路已经不可同日而语了。但其实微软早就留了一手,在1987年微软也发布了Windows2.0,不仅是图形窗口界面,而且还可以支持多窗口多任务。1988年,微软和IBM在OS/2的1.1版本上才实现了图形界面。
但是,1988年,小型机公司DEC的首席工程师大卫卡特勒跳槽到了微软,开始秘密开启Windows NT的研发。当时因为微软在维护三个操作系统:MS-DOS、Windows、OS/2。多GUI窗口多任务、多用户、多操作系统应用,这么多交叉,平常人想想就头疼。所以微软的想法是怎么搞一套操作系统内核,上面能支持三个操作系统的应用。这就是当年WindowsNT为啥要搞Client/Server模式的内核的原因。
1990年,OS/2的1.2版本发布了,加入了HDFS文件系统,支持长文件名和高容量硬盘。这就是卡特勒在微软交的投名状,这也是未来NT操作系统上的文件系统:NTFS。
(5)虚拟机技术路线 VS 内核Client/Server路线
1991年,IBM和微软闹掰了。因为IBM发现微软已经把所有力量聚焦去开发自己的Windows操作系统去了。因为1990年,Windows3.0发布后广受好评,微软自然先要孵化自己的金母鸡。所以1991年OS/2 1.3版本的发布,是IBM自己独立完成的。
IBM的人主要做了优化工作:让安装和配置也比过去容易得多,而且让程序本身变小。另外,IBM改进了内存-虚拟文件置换算法使性能更快,再加上1990年OS/2 1.2版本的HDFS文件系统(支持长文件名和高容量硬盘),可以这么说,OS/2应该是当时世界上最强劲的个人电脑操作系统。要知道,在1991年:Windows NT还没有推出(1993年才发布)、Win95也没有推出(1995年才发布),乔布斯在1985年就已经被赶出苹果公司了。
1992年,IBM乘胜追击发布了OS/2 2.0版本,这是世界上第一个全32位的个人电脑操作系统。
OS/2 2.0虽然是GUI图形界面,但是仍然可以跑起来MS-DOS的程序(要知道MS-DOS一开始就是给IBM兼容机用的)。而且IBM采取了1964年S/360大型机上的虚拟机技术思想,可以让每一个DOS程序分别在各自的虚拟DOS机器上执行,任何一个ODS程序崩溃都不会造成其他应用程序一起挂掉。
更牛的是,OS/2 2.0还可以完全兼容微软的Windows应用程序。也就是说:OS/2用虚拟机的技术,比Windows NT更早地实现了DOS、Windows、OS/2应用程序都能在一个操作系统里跑。而NT的设计思想是用Client/Server的内核架构来支持多种操作系统的应用。
(6)扯着蛋了
1992年IBM发布OS/2 2.0,这既是巅峰,也是噩梦。为啥?因为步子大了扯着蛋了。
IBM不知道怎么想的,在2.0还做了两件莫名其妙的事:
用完全面向对象技术重新开发了一套GUI界面:Workplace Shell
用完全面向对象技术重新开发了一套文件系统
用完全面向对象技术重新开发GUI,这个想法我能想通,毕竟世界上第一款GUI技术,就是发明了面向对象开发语言Smalltalk来搞的。但是用面向对象技术重新开发文件系统,这又是哪里出的招儿呢?
这不禁让我想起盖茨曾经的宏大理想:
UI技术:用XML描述语言,一统桌面UI和Web UI
文件系统技术:把数据库查询引擎和存储引擎技术,与文件系统查询和存储技术,一统
最后,Vista难产,盖茨灰溜溜退休。而盖茨耗费的2001-2007这6年,互联网发展的如火如荼,而盖茨自命为首席架构师搞Vista操作系统。
嘿嘿嘿,真是同样的配方同样的味道,同一个坑,IBM跳一次,在十年后微软再跳一次。你说历史就是这样,历史并不一定都对。
(7)红巨星爆炸,新星产生
1996年,IBM发布了OS/2 4.0,但这已经是强弩之末,没有什么大的革新。也许,IBM已经被曾经步子太大伤了心了。
1997年,曲终人散,OS/2团队各奔东西。1998年,江湖上出现了一个公司:VMWare,专门做PC机上的虚拟机技术。
2008年,一个男人加盟VMWare,担任VMWare CTO,他就是曾经在微软担任:NT研发、OS/2研发的研发项目负责人:保罗马里茨。
(8)事情还没完
2008年,微软发布了自己的虚拟机技术:Hyper-v。
为啥要这么干呢?是因为在2005年Intel在硬件层支持了虚拟化技术。所以当时商用VMWare虚拟机技术和开源XEN虚拟机技术,都不用宿主操作系统了,可以直接安装在裸金属服务器上了。也就是说:虚拟机的位置和操作系统的位置是同层的。这怎能不让盖茨小心呢?嘿嘿嘿,这下大家也都理解了原NT研发项目负责人保罗马里茨为啥要加入VMWare了吧。
而且2008年还发生了两件大事:
第一件事:Linux把KVM虚拟机技术放入到了最新的Linux内核中
第二件事:基于Linux CGroups技术的LXC,也在2008年发明了。这就是后来的Docker赖以生存的基础
以后我写Lars bak的时候,我会写写Docker、wasm。