第贰拾贰章 重组 (上)
“原来是这么写的呀!”奥尔森不高兴的说,“你当时如果说一下拼写,我就不会弄错了!” “可是也没见你问啊!”范含说,“我以为你早就知道了呢。” “我怎么会知道?”奥尔森说,“明明是你生造出来的词。” “确实是生造的,”范含承认,“不过这个发音很标准,完全符合发音规则,直接拼就能写出来。” “如果没有同音词的话。”奥尔森强调,“既然你没有主动拼写,我当然会以为就是英语里面已经有的词。” “也对……平时说话确实不需要拼读。”范含说,“实际上我在看到文件的时候才去翻字典查这个‘Eunuch’,以前还从来没遇到过。” “我猜也是这样,”奥尔森说,“现在你该解释一下为什么要造这个词了,文件里面相应的部分都要修改。” “呵呵……真是不好意思,”范含大笑,“真没想到你的人居然会想出那么多借口来阐述命名为这个‘Eunuch’的重要意义。” “你还有脸笑!”奥尔森说第一个单词的时候口气还有点儿不高兴,到了最后也忍不住笑出声来。 “不笑了不笑了,”范含板起脸,问,“你知道‘Unique’的意思吧?” “知道,就是OnlyOne。”奥尔森回答。 “和这个有点关系,”范含开始瞎编,“最初我想好的名字是叫‘Unix86’的,对,后面跟两个阿拉伯数字,一个八一个六。” “什么意思?”奥尔森问。 “就是运行在x86体系上面的Unix。”范含说。 “什么是x86?”奥尔森又问。 “就是咱们的这个处理器架构呀?!”范含回答,“以后会慢慢形成一整套处理器系列的。” “为什么非得叫x86?”奥尔森继续问。 “呃……”范含轻轻抽了自己一耳光,又说漏了,不过还是强打精神圆谎,“实际上,呃,我是先想好‘Unix86’这个名字,呃,再给拆成‘Unix’和‘x86’两部分的。” “怎么那话又绕回来了!”奥尔森说,“你就直截了当的说,‘Unix86’到底是什么意思?!” “当然就是‘八荒六合唯我独尊’的意思了。”范含总算有急智,找着一辙,“这个‘8’就是‘八荒’,‘6’就是‘六合’……我记得教过你这个成语吧?” “教过,”奥尔森说,“上次我还用过呢。” “呼……这就好办了。”范含长出一口气,“这个cao作系统呢,应该是高度可移植的,所以就去掉了后面表示硬件体系的‘86’,只叫‘Unix’了。” “真的么?”奥尔森还是有点怀疑。 “真的,”范含特诚恳的回答,“你看我什么时候撒过谎?” “嗯……这个名字的事就这么算了。”奥尔森说,“cao作系统算是有了,你该考虑那一堆杀手级应用了。” “怎么?不是VAX才需要么?”范含奇怪,“现在这样的机器就是做出来也不能算‘杀手’。” “可是如果不做,VAX项目根本不会上马。”奥尔森解释,“现在就启动VAX项目,对DEC来说是一场赌博。虽然我是百分之百相信你,但是其他人,至少要看见一点苗头,才肯同意。” “好吧,那我就接着搓神灯吧。”范含答应下来,“不过首先得花几天工夫琢磨一下用户需要什么。” “你怎么不想想这些‘太监们’能干什么?”奥尔森问。 “用得着么?”范含口气坚定地反问,“除了硬件限制,还有什么是这个系统干不了的么?” “唔……这倒是。这个系统的设计确实很灵活。”奥尔森承认,“是有那么一点‘八荒六合唯我独尊’的架势……这个成语我用得没错吧?” “没错,”范含说,“我再教你一个。” “哪个?” “千秋万载,一统江湖!” ------- 奥尔森正催着手下人写内核,根据协议,在法律上这些人都算做是FOR临时雇佣,这也是当初就商量好的,免得到后来在源代码的版权上纠扯不清。 考虑当前条件,太过分的要求范含也没提,只要能勉强实现“协作式多任务”就行。 实际上这个系统有点像最初的苹果MacOS,每个进程启动的时候都向内核申请一块固定大小的内存,申请失败就不能运行。反之,申请成功的话,内核就允许其“三规”:在规定时间到规定地点完成规定动作。 这样一来,大部分内存管理的工作就都由应用程序自己负责,在自己那一亩三分地上面怎么折腾都行,就是不能越界,否则杀无赦……其实内核只要能做到这一点就肯定已经比DOS强得多了。 所以,这个内核的内存管理模块相当简单,只要把主内存当作一个堆,能维护好就的了。 进程调度也不复杂,除了Shell之外,别的进程都扔进唯一的一个循环队列里面,轮流执行。这种“协作式多任务”的特点就在于要求所有的进程都不能有“人品问题”,即“占着茅坑不拉屎”。只要暂时用不着CPU,就必须主动引退,让其他进程执行。 在前一阵子指挥员工写那堆工具的时候,有个意外的惊喜。 范含发现,对于如何编写“举止良好”的代码这一点上,根本用不着谆谆教导。现在的程序员一个个觉悟都挺高,主动“勤俭持家”,恨不得一个时钟周期分两回用。看来没什么好cao心的了。 文件系统这回也打算实现,因为机器的标准配置方案里面有了可以随机访问的外存。 几个月前刚拿内存技术从IBM那里换来了磁盘技术,现在第一批温彻斯特硬盘刚出厂,容量256KB……对,是“K”,不是“M”,也不是“G”……确实惨了点。 这一部分设计的时候是范含亲自cao刀,主要参考了Minix文件系统1.0版,用来应付“极低端”配置还是可以的。不过,感觉比较奢侈的地方仍有很多,这些就只能自己动手丰衣足食了。 磁盘还是照猫画虎的分成引导块、超级块、i节点块、文件信息块和数据块,这些没有必要改。不过文件信息不需要那么多,于是尽可能的精简了一些。 由于是单用户,所有者的用户标识和组标识当然是没必要了,链接数也不需要,因为现在还不打算支持符号链接……都去掉。 另外,文件权限也只需要记载所有者自己的“可读”、“可写”、“可执行”权限就成了,“rwx”只用一组,三位。真正的Unix上面则需要三组,每个文件除了主人自己的权限之外,还要记录工作组内其他用户和全体用户的权限。 文件类型也省略了不少,除了标记是普通文件还是目录,还增加了两种设备文件的标记:“字符设备”和“块设备”。其他的如“符号链接”、“命名管道”和“套接字”,既然暂时用不到,那就不管。 这两部分一共用了一个字节。 长度用两个字节表示,单个文件最大不能超过64k。就现在而言,作为权宜之计,还是比较恰当的。毕竟目前一个硬盘也只能放下四个这种文件而已。 文件占用的磁盘扇区的数量,用一个字节表示。本来这个数量应该按照“块”而不是扇区来统计,一个块可以包含多个扇区。不过现在的磁盘空间没有可供浪费的余地,每个扇区就算一块了。后来PC时代的硬盘一个扇区都是512字节,而现在只能做到256B。 还有一部分应该用来记录文件所占据的所有磁盘块,这个稍微费点劲。 在Minix上面,用了九个元素的短整型数组,前面七个是直接索引,如果文件大小在7k以下,可以快速的直接访问。第八个是一次间接索引,其指向的块记录了其他块的索引;第九个是二次间接索引,顾名思义,就是记录了指向其他记录了指向其他块的索引的索引。 现在用不着这么烦,范含考虑再三,决定只用两个一次间接索引,两个256字节的块,刚好可以储存256个索引用来指向256个数据块,毕竟最大的文件也只需要256块就够了。 这样就有八个字节了,这是范含省吃俭用的结果,好像不能再少了。 为了以后兼容起来不麻烦,还是要尽可能的照顾方方面面,该浪费的地方就是要浪费。 Minix文件系统只保留文件的最后修改时间一个值,没有创建时间、最后访问时间之类的,这次范含也只用一个。只不过,这一个值就占了八个字节,双精度浮点型。公司里面的其他人都觉得这次是过份小心了。 没办法,为了把“千年虫”问题扼杀在萌芽阶段,眼下付出点代价还是值得的。 所谓“千年虫”问题,指的是由于原来DOS系统使用两个字节存储年份,使得2000年会被当作1900年对待从而引发的问题。这两个字节,实际上是两个字符,比如1968年会被存储为字符“6”和字符“8”,而并不是数字“六十八”。 二十世纪末,就因为这个原因,全世界着实恐慌了一阵。结果,除了一些小问题,基本上算是平平安安。从某种意义上讲,“千年虫”问题是炒作出来的问题,并不是真得那么严重。 各类Unix系统就不存在“千年虫”问题,取而代之的是“2038”问题。 这是因为在Unix系统内部,日期和时间是合在一起表示为一个值的。具体说,是采用四个字节32位带符号整数表示从1970年1月1日0时开始流逝的秒数。2的31次方秒大约是68年,所以到了2038年,也面临死线。 这类问题的解决方案没等到2000年就已经提出来了,就是采用双精度浮点型表示日期/时间值,数值的意义通常是从某个起始时间开始流逝的天数。计量时间的零点,通常选择在1899年12月31日0时,至少COM标准就是这么确定的。范含这次的选择却是1753年1月1日,即目前历法“儒略历”正式采用的头一个整年。 整数部分很好理解,小数部分也很好理解,0.5表示半天,不就是12个小时么?采用这种方式,能够以微秒的精度计算宇宙年龄,自然一劳永逸。 业内人士对于这些问题多半是很清醒的,除了一些旧代码和老式的数据库应用之外,影响其实有限。当然,即便如此,解决这个问题也仍然需要很大代价。毕竟热力学第二定律在那儿摆着呢:打烂一个旧世界容易,伟人们大手一挥就能办到,相比之下,建立一个红彤彤的新世界,恐怕不那么简单。 遗憾的是,并非所有人都是“业内人士”。 除了一撮整天宣传“末日审判”的职业传教士,一撮炒作几百年前江湖骗子诺查丹马斯胡言乱语的神秘主义者,一撮唯恐天下不乱以便混水摸鱼多发文章好骗取稿费的“新闻工作者”之外,还有无数对于计算机技术了解甚少却胆量甚大的社会活动家大放厥词。在这种氛围中,真正理智的声音已经被彻底淹没了。 那一阵儿,真是闹得慌。 另外,学术自由已经成为了全球共识,没谁敢规定写手就不能研究计算机。 那还是在1999年的时候,世界同种刊物中发行量最大的《科幻世界》杂志曾经刊登了著名科幻作家何夕的一部著名作品:《祸害万年在》。全文分作上下两个部分和一个尾声。上篇讲述公元1999年底,面对“千年虫”问题,人类在联合国的指挥之下,通过回拨时钟,将问题延迟了六十年,主人公之一何百夕教授带领全球的计算机工作者一同努力,在2060年到来之际终于来得及将两个字符的年份换成四个字符;下篇讲述公元9999年底,面对“万年虫”问题,人类在联合国的指挥之下,通过回拨时钟,这一次将问题延迟了九十年,主人公之一何万夕教授带领全球的计算机工作者一同努力,在10090年来临之际终于来得及将四个字符的年份换成两个字节的带符号短整型;尾声则简略的描写了公元32767年12月31日,已经使用了计算机三万余年的人类面对“32768年虫”问题时那无可奈何的恐慌。行文至此,戛然而止。 虽然不知道其他同行们的反应,不过在记忆里,当时的同学们以及后来的同事们看到此文的时候,无不捧腹狂笑。直到今天,每当想起这篇文章,范含脸上的笑容仍然灿烂得有如那天边的明月。 ------- 该cao心的都cao心了,剩下的就看那帮程序员了。在整个系统没完成之前,自己还能轻松一阵子,这段时间正好可以拿来琢磨琢磨别的。 比如……眼前的这块“板砖”。 一个长方形的木头盒子,下方有十三个按键:0-9、“ ”、“=”、“Clear”,还有一个开关;上方是用十四根发光二极管拼成的两个“8”字。 看来这就是“二十以内加法计算器”了。 “实际上是十五以内加法。”法金描述。 “怎么用啊?”范含问。 “先按一个数……”法金回答。 范含按了个“6”。 “按加号……”汤姆提醒。 范含照样按了。 “再按一个数……”杰瑞说。 范含这次按了一个“8”,然后开口问,“最后按等号是吧?” “嗯。” 结果显示出来了:14。 “不错嘛!”范含言不由衷的称赞几句,“里面的东西就是那个两位的微处理器?” “呃……不是,”法金回答,“处理器是四位的。” “哦?”范含诧异,“不是说好先造个两位的玩玩么?” “试过了,”汤姆回答,“不行。” “为什么?” “首先为了表示每个输入的加数,就需要四位。”杰瑞说,“对外的数据线就是四位的。” “用两位数据线分两次读也可以,不过外部电路就要复杂一些了。”法金解释,“对于这样的应用来说,实在划不来。再说难度也不大,目前的技术完全能办到。” “其次,为了表示十五以内的数,至少需要四位,”汤姆说,“内部用了一个四位的寄存器。” “两个两位寄存器和一个四位寄存器是一码事,”法金解释,“没有本质的区别。” “指令长度如果只用两位,那最多就只有四条。”杰瑞说,“为了这个目标,我们去掉了减法的功能,只剩下复位、赋值、加、取值,刚好四条。” “虽然如此,但是指令寄存器和其他寄存器一样,都是四位的。”法金解释,“故意留着一半不用,何必呢?” “如此说来,指令、数据线、字长都是四位,当然算四位处理器了?”范含总结。 “对。” 恐怕这次又是自己的问题,范含想,不能怪他们“抗命不遵”。 勉强用两位的架构实现不是不可以,但是他们三人刚才的话说得已经很明白了,得不偿失。再说,那样造出来的东西还必须附加一大堆外部电路,恐怕就不能算作是“通用处理器”了。 复杂度是一个整体,单纯削减一个方面的工作量只会增加其他方面的工作量而已,在所有方面之间找到一个平衡才是正解。正如拿笔在纸上手算平方根,用十进制阿拉伯数字计算,几乎人人都会。但是用六十进制的巴比伦数字和用二进制数来算,同样的麻烦。 看来这些员工并不是应声虫,像大多数日本人那样,对于上司明显不合理的命令也会不折不扣地执行。不过这也是日本的环境使然,干好了是上司的功劳,干砸了也是上司承担责任,自己尽到了部下的义务就可以了。 “很好很好,干得太好了!”范含大肆赞扬三人,“这才是积极主动的工作态度呀!” “哪里哪里……”法金谦虚。 是金子就会闪光,法金虽然进公司最晚,表现却最突出,现在已经隐隐约约成为硬件研发部门的领军人物了。 “申请专利了么?”范含赶紧问。 “申请了,也批准了。”法金说,“就是……” “什么?” “虽然还没有接到正式的律师函,”法金说,“不过德州仪器扬言要起诉我们侵权。” “啊?”范含大吃一惊,“不会吧?!”