- 浏览: 366278 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
abc08010051:
结果呢?烂尾跑路了?
关于actor模型的优缺点分析(1) -
qinhanlei:
hi, 感谢分享,受益匪浅! 顺便请问一下,您使用的是什么绘图 ...
skynet任务调度分析 -
maxer025:
楼主,github 地址?
WebIM第一版本及下一步工作 -
boyhailong:
博主的分析能力真是强 skynet的很多东西我表示还是看不太懂 ...
skynet任务调度分析 -
ranweizheng:
亲这篇里面没有说当(.class 元素 元素) 与( .cla ...
css样式表中的样式覆盖顺序
读Dennis Ritchie写的unix演变史,结合当前做的项目,有很多感触。
1. 文件系统
Dennis Ritche写的unix演变中,非常强调文件系统的作用。文件系统是什么?文件系统是一个可自由命名的、可持久的数据库。计算机系统最主要的信息就是数据,代码也是数据,而文件系统作为一种数据库,就是整个计算机系统的核心。
文件系统组织了所有的信息,包括console、真正的文件、network socket等,提供了一种统一的定位、查询、修改、创建、删除各种信息的机制。在学习各种语言时,如果一种语言提供了很简单、高效、统一的方法看到其内部结构,则这种语言会很让人着迷。比如python的命名空间机制提供了代码的组织方式,而通过dir可以很容易遍历命名空间的各个组成部分,forth的字典是更简单的代码组织方式,通过see命令可以看到字典中的所有内容。操作系统也是一样。当然,任何系统都是一样,所以云计算平台如果也提供这种统一的方式就好了。
2. 进程
unix中,最早发展起来的,一直应用的特性是文件系统,而进程控制则是后来才发展而来的。最初一个终端对应一个进程,shell在执行其他进程时,其他进程将覆盖掉内存中的shell,其他进程调用exit结束时,exit再使用shell覆盖掉其他进程。在同一时刻,一个终端永远只对应一个进程。
后续在实现多进程时,发现很多地方需要修改。比如chdir命令,原先只有一个进程,chdir作为单独进程,执行后仍然起作用,但多进程后,chdir作为单独一个进程,执行之后对父进程没有任何效果,需要将其作为shell的内嵌命令。还有已打开文件的读写指针,原先是保存在进程中的,但多进程后,每个进程有一个,导致文件内容被破坏,从而需要将这个指针放到进程外的一个系统表中。
从多进程支持的修改可以看出,任何一个软件系统如果要长期使用,随着对其需求的不断变更,无论其最初设计和实现有多完美,都需要不断演变。因此长时间运行的软件的可读性和可修改性将变得非常重要,因此云平台使用一种更加简单的语言实现(比如python)可能非常有利。
3. shell
最初的shell是操作系统的一部分,后来才慢慢分化出来作为一个用户态应用程序。这点是不是意味着,当前云平台的管理portal,目前可以看做是云平台的一部分,后续也可以作为一种外部系统拿出去呢?
4. IO重定向
IO重定向是unix中一个非常好用,非常简单,非常重要的特性:
ls >file1
简单的一行命令就把当前目录的所有文件的列表放到了file1文件中。
这个特性是从multics中继承来的,multics中要实现上述功能需要做如下操作:
iocall attach user_output file file1 list iocall attach user_output sync user_i/o
看起来非常准确,但冗长,复杂,暴露了很多内部概念给用户,无论写起来、用起来还是看起来,都远远不如unix中的好。同样的,一种新的语言,必须从使用者角度出发,考虑真正适合用户的表达方式来设计。
multics中为什么会设计出这么痛苦地语法呢?按照Ritchie的描述,主要原因在于multics项目太大了。IO系统是在Bell Labs做的,而shell是在MIT做的。使用shell的人(ritchie他们)从来没有想过要改shell(因为那是“他们”的程序),而MIT设计shell中的iocall的人,可能根本就不知道iocall到底有多有用,或者到底有多愚蠢。而对于unix,IO系统和shell都完全由Thompson一个人控制,当出现一个好的想法时,也就是一个小时的修改量。
这一点让我想起我们在云平台C01版本中让各个开发人员都深恶痛绝的问题:联调太痛苦了,加班加点没日没夜去联调,用来解决模块间接口不一致的问题。在C02设计过程中,大家一个劲儿强调系统组的人员一定要定好接口,确定正确、清晰的接口,然后基线化,再也不能出现C01那么多不一致的问题了。但这样就能解决问题吗?C01的接口也不可谓不明确,函数名,参数也都定的好好的,可为什么出现那么多问题呢?接口从来都不是一份文档就能搞定的事,接口牵扯到调用这个接口会产生什么影响,后台做的操作和调用者的期望是否是一样的,多个接口不同顺序调用产生的结果是否一致等等,再详细的接口文档也无法描述清楚接口的各种影响,可以说只有实现代码才是接口的最好描述。想想unix的posix api,经历过这么多年的使用和修订,结果不同厂商实现中仍然有微小变化,很常用的select实现都有细微差别,而这些是在使用中才会发现,文档中即使写了,谁又总看得那么仔细呢?跨unix平台的库一般都是非常难写,因为要处理各个平台的这类差异。
那如何才能解决这个问题?减小规模,加强交流。尤其是配合密切的系统,开发一定要坐在一起,经常讨论。unix的成功在于开发者和使用者就是一个团队,甚至开发者本身就是使用者,可以实时获取反馈。像C01中做界面的人在一个地方,做后台提供接口的人在另外一个地方,两部分同时开发,结果开发界面时只能打个桩测一下,打的桩永远都是返回成功,很少考虑失败的情况。C02要解决这个问题,一定要让前台界面的人和后台开发的人坐在一起进行开发。这不是一个接口文档或者几次讨论就能搞定的事。C01人员上百人,沟通是个非常大的问题,以前HAE十来个人,开发很迅速,开发的功能也很多,那时接口文档比C01还少,不过联调好像也没那么痛苦。
5. pipe
管道,是unix为操作系统和命令语言贡献的一个非常有用的概念。管道是1972年在McIlroy的建议和坚持下添加到unix的。在管道出现的多年前,McIlroy就认为命令应该作为二元操作符,其左操作数是其输入,右操作数是其输出,这样copy命令要如下写法:
file1 copy file2
而要对一个文件排序,分页,然后线下打印,可以这么写:
file1 sort paginate offprint
在某天下午McIlroy在黑板前讲解了他的这个想法后,大家都认为很有启发性,但没有立刻实现,因为当时这样认为的:1.中缀写法太激进了,大家都习惯写cp file1 file2了;2. 没办法区分第一个单词是命令字还是输入文件名;3. 一个输入和一个输出的命令执行模型看起来太局限了,不通用,如果同时有多个输入或多个输出时怎么办?事实证明,第三个看法完全错误,大家的想象力太有限了。
从这一点也可以看出来,系统设计人员在设计时,经常自以为是的以自己的想法代替用户的想法。实际上用户的想法永远无法猜测,即使调研也不一定知道用户的真实想法:用户还没有见过你的系统,他怎么知道应该怎么用?除非他已经用过了很多类似的系统。只有实践才是发现用户真实想法的唯一途径。
管道的实现也很有意思,最初为了保持写法的统一,使用与重定向同样的方式来表示管道:cmd1 > cmd2。这样的话,原先的sort可以写成这样:
sort file1 >paginate>offprint>
最后一个>是必须的,否则offprint就会被当成一个文件来用了。这种写法的目的是为了用统一的重定向概念来表示管道:当重定向目标是另一个程序时就是管道。不过最后的那个>看起来有点别扭。
另外,为了保持统一,<也可以用在管道里,这样,上面的命令实际上可以有多个写法:
offprint <paginate<"sort files"< pagenate<"sort files"< >offprint>
因为这些混乱,这种表示法只用了几个月就换成了当前的|表示法。
可见,有时设计上感觉很优美,但实际使用中很难用。这一点在设计一种语言时尤其需要注意,添加一个看起来很美的新功能时,一定要让用户反馈是否好用,不好用,立刻改,千万不能靠自己猜。还是那句话,只有多实践、多反馈才是发现最佳方法的唯一途径。
管道的天才部分在于,使用起来很简单,但是看到这种使用管道的可能性以及选择一种合适的表达方式需要的思想转变很大。
6. 高级语言实现
最初的unix完全使用汇编写就。“完全使用汇编”的意思是全部使用汇编代码写成,没有任何一句宏。那时没有连接器,没有加载器,每个程序必须是独立可运行的。Thompson认为一个计算系统不能没有Fortran,于是他就坐下来写一个fortran的编译器,结果最终出来的是B语言的定义以及编译器。B语言生成解释性代码,B语言编译器和它生成的代码都很慢,但是让生活一下变美好了。
但是B语言生成解释性代码,太慢了,无法用它来写操作系统,因此Ritchie老兄开始设计C语言。1973年,unix内核使用C语言重新写了一遍。这个成功应用说明C语言是可以用来写系统软件的语言,而不是一个写简单应用的玩具。
发表评论
-
go语言
2012-09-06 01:23 2018从学校里开始,一直是C语言的狂热支持者,刚开始工作的两年也一 ... -
jQuery.post获取不到中文数据的问题
2012-05-13 23:10 2359PHP直接返回页面时,可以返回中文数据,但使用jQuery.p ... -
json解析
2012-05-13 20:47 2219哈哈,如果返回http消息 ... -
css样式表中的样式覆盖顺序
2012-05-13 15:42 17369刚才写zenktodo的时候, ... -
ucore-project5: mm(4)
2012-01-09 00:31 1495时隔近20天,终于搞定了一个问题。使用linker scrip ... -
ucore-project5: linker script
2011-12-22 00:00 1491要对内核进行页映射, ... -
ucore-project5:mm(3)
2011-12-21 23:29 1127paging由x86 cpu控制寄存器中的三个bit控制: ... -
ucore-project5: mm(2)
2011-12-20 00:27 1319看内核刚进入时加载临时gdt的代码: lgdt __gdtd ... -
ucore-project5: mm(1)
2011-12-19 01:30 1384project5到project9主要处理内存管理。 ... -
ucore-project4: 内核态和用户态切换(3)
2011-12-18 15:16 1916这是内核态和用户态切换的最后一篇,也是project4的最后一 ... -
ucore-project4: 内核态和用户态切换(2)
2011-12-18 13:14 2116用户态到内核态切换相对比较简单。用户态切换到内核态时,需要切换 ... -
ucore-project4: 内核态和用户态切换(1)
2011-12-18 12:24 3542终于又回来了。内核态 ... -
ucore-project4: interrupt--x86 cpu复习
2011-12-11 20:04 1433离上次更新ucore工程已经过去6天了。这几天工作比较忙,经常 ... -
ucore-project4: interrupt -- 搞定第一个中断:timer
2011-12-05 23:56 1727修改了代码中的一个bug,时钟终端终于正常了。 pro ... -
ucore-project4: interrupt
2011-12-05 07:55 1475中断处理程序总算调进去了,刚才调试主要有两个问题: 1. o ... -
电路图
2011-12-04 00:46 1309刚才在看怎样初始化时钟芯片8253。cpu通过执行out指令, ... -
我的操作系统的方向
2011-12-03 11:14 1244做操作系统到底是为了什么呢? 好玩,当然是一个很重要的 ... -
ucore-project4: interrupt -- 内嵌汇编在-Os优化时出错分析
2011-11-28 02:54 2850为了打印数字,将printf ... -
宇宙如何运行
2011-11-27 13:13 1083刚刚看一个科普节目:how the universe work ... -
ucore-project3.1: kernel monitor shell
2011-11-27 01:08 1216project3实际上是两个工程,project3.1在pro ...
相关推荐
1979年发布的UNIX版本,因其可移植性,对后续的UNIX发展产生了深远影响。这个版本在多个平台如PDP-11和Interdata 8/32上运行,并且得到了用户的改进,这些改进被AT&T吸收进后续的发行版,体现了早期UNIX社区的合作...
《Unix的历史发展和现状》 一、Unix的历史发展 Unix,这一操作系统自1969年由AT&T贝尔实验室诞生以来,经历了三个显著的发展阶段,每一阶段都见证了其技术的革新和行业的变革。 ### 第一阶段:初始发展阶段(1969...
Unix操作系统,自1969年诞生以来,一直扮演着计算机科学领域的重要角色。这个操作系统以其简洁、高效和可移植性著称,...无论是操作系统设计、网络技术还是软件开发,Unix的精神和遗产都深深地烙印在现代计算的世界中。
《软件行业发展史探析》 软件行业的发展历程是一部科技革命的史诗,它与硬件技术的进步紧密相联,共同塑造了当今的信息时代。本文将沿着时间的脉络,探讨从第一代电子管计算机到现代大规模集成电路计算机的演进,...
UNIX操作系统发展史是一个充满创新和技术演进的故事,始于1960年代的Multics计划。Multics项目由AT&T贝尔电话实验室、通用电气公司和麻省理工学院共同发起,旨在创建一个能支持大规模用户访问、强大计算和数据共享的...
### C语言的发展史 #### 起源与背景 C语言是现代计算机科学中的基石之一,自诞生以来,它在软件开发领域占据了重要的位置。C语言最初是在20世纪70年代初,为了配合Unix操作系统的开发而创建的。本文将深入探讨...
浅谈计算机操作系统发展史 计算机操作系统的发展史是计算机历史的精华所在。操作系统提供了对硬件控制的调用和应用程序所需的功能。早期的计算机没有操作系统,用户需要单独地使用机器,每次只能执行一件任务。程序...
莱昂氏UNIX,即第四版UNIX,是这个操作系统发展史上的一个重要里程碑,它的源代码结构清晰,易于理解,是许多后来的操作系统和软件开发人员学习的经典范例。 在这本书中,你可以深入了解到以下几个核心知识点: 1....
7. **个人计算机革命**:80年代,苹果Macintosh和微软的Windows操作系统引领了个人计算机革命,这时期软件开始面向大众市场,软件开发工具也变得更加易用。 8. **互联网的兴起**:90年代,互联网的普及推动了Web...
* UNIX的发展史 * UNIX系统的基本结构 章节二:UNIX系统技术入门 * 掌握UNIX的常用命令、DOS与UNIX的区别 * UNIX系统基本常识 * UNIX的SHELL * UNIX系统启动及用户登录 * UNIX常用命令介绍 * UNIX系统与其它系统...
源码].unix.v6.v7.src.source.code"是UNIX发展过程中的两个关键版本——V6和V7的源代码,它们在1970年代中期至晚期广泛使用,并为后续的UNIX版本奠定了基础。这些源代码是理解早期UNIX系统工作原理的重要资源,也是...
第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...
《UNIX分时系统》是由...对于了解操作系统的原理和早期设计思想,以及学习C语言和UNIX系统发展史的读者来说,这篇论文具有重要的参考价值。论文的发表,对后世的操作系统设计和计算机科学的发展产生了不可磨灭的影响。
### UNIX 的风雨40年 #### 一、UNIX 起源 ...UNIX的故事不仅仅是技术的发展史,更是文化和哲学的演变史。通过回顾这段历史,我们可以更好地理解计算机科学的演变过程,同时也可以为未来的软件开发提供有价值的参考。
- **V7 (Unix第七版)**:这是1978年发布的版本,被认为是Unix发展史上的一个里程碑。它包括了许多核心工具,如Bourne Shell、nroff/troff、AWK、SED、MAKE等,这些工具至今仍然广泛使用。 - **BSD与System V**:...
Unix操作系统及其命令不仅代表了一种技术上的成就,更是计算机科学和信息技术发展史上的一个重要里程碑。通过掌握其命令和理解其架构,不仅可以提升个人的技术能力,还能深入了解现代计算平台的基础构建块。无论是...
1. **Unix操作系统历史**:第六版Unix是Unix发展史上的一个重要里程碑,由肯·汤普逊(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)等人在贝尔实验室于1975年开发。这一版本标志着Unix从早期的实验性系统向成熟...
Linux操作系统的发展史是一个充满创新与合作的故事,它源自对开源软件的热爱和对技术进步的追求。Linux,作为UNIX操作系统的克隆版本,由芬兰赫尔辛基大学的学生Linus Torvalds在1991年创建。这个项目最初是为了满足...
Unix第六版是Unix发展史上的一个重要里程碑,它于1975年由AT&T的贝尔实验室发布。这一版本引入了许多重要的改进和技术特性,例如更强大的文件系统、更好的设备驱动支持等。它不仅巩固了Unix作为现代操作系统的地位,...