
1. UNIX雏形
1.1. Unix操作系统诞生于1969年
- 1.1.1. 几位贝尔实验室员工在其他操作系统和语言上积累了多年经验
1.2. 计算器曾经是真实器物,后来成了手机应用
1.3. 计算机本质上没有特别多不同之处
- 1.3.1. 计算机如今能以高达每秒十亿次的极快速度做算术,但在20世纪70年代,运算速度远远低于每秒百万次
1.4. 20世纪60年代和20世纪70年代典型的计算机有一个由数十种指令组成的指令集,它可以执行:算术(加、减、乘、除),从主存储器中读出信息,将信息保存到主存储器,以及与磁盘或其他连接设备通信
1.5. 指令和数据存放在同一个主存储器中,这个主存储器通常被叫作RAM,也就是“随机存储器”(random access memory)
1.6. 使用某种编程语言,为执行某项要完成的任务创建操作序列,这就是所谓的编程
1.7. 称为编译器的程序将高级语言翻译为针对特定类型计算机的指令序列
- 1.7.1. 编译器将其翻译为人类仍然可读但主要面向计算机的机器指令序列
1.8. 汇编器(assembler)的程序把该序列转换为人类不易读懂的指令
1.9. 汇编语言是人能读懂的机器指令,与特定类型硬件的指令集紧密相关
- 1.9.1. 每种计算机都有自己的汇编语言,所以操作系统是庞大且复杂的汇编语言程序,每个操作系统都针对特定硬件、使用特定语言编写
1.10. 系统之间缺乏共通性,使用相互不兼容的低级语言,导致同时需要多个版本的程序:为某一操作系统编写的程序,在移植到其他操作系统或硬件架构上时,必须完全重写
1.11. 操作系统
-
1.11.1. 操作系统的任务是控制所有其他要运行的程序,并管理它们与计算机其他部分的交互
-
1.11.2. 操作系统是控制计算机的程序,它给正在运行的程序分配资源
-
1.11.3. 操作系统也控制显示,在收到程序请求时,使其在屏幕上可见
-
1.11.4. 它管理主存储器,当运行中的程序有需要时,将主存分配给它们
-
1.11.5. 还管理磁盘之类存储设备,当你保存Word文档时,文档就会被存下来,以备之后恢复并继续工作
-
1.11.6. 操作系统还负责协调与互联网之类的网络进行通信
-
1.11.7. 在程序发生错误时,操作系统保护其他程序不受影响,还要防止有害程序或用户误操作对系统自身造成的危害
1.12. IBM或DEC(Digital Equipment Corporation,美国数字设备公司)等计算机制造商为各种不同硬件提供操作系统
-
1.12.1. 每个制造商生产的硬件全无共通之处,有时甚至来自同一厂商的硬件都会有很大不同,所以操作系统也各自不同
-
1.12.2. 操作系统用汇编语言写成
2. CTSS
2.1. 最有创造性的操作系统是麻省理工学院于1964年推出的CTSS(兼容分时系统)
2.2. CTSS程序员使用类似打字机的设备(如下一章图3-1所示的Model 33 Teletypes“终端机”),设备直接连接或通过电话线连接到一台大型计算机,如拥有两倍于通常型号32K(32 768)个字长内存的IBM 7094
3. Multics
3.1. Multics意思是多路复用信息和计算服务(Multiplexed Information and Computing Service)
-
3.1.1. 1965年,开始设计Multics系统
-
3.1.2. 很多好点子滥觞于Multics,但它最持久的贡献却完全没人预料到:它影响了一个叫Unix的小操作系统,这个小系统诞生的部分原因是想摈弃Multics的复杂架构
3.2. Multics是个大项目,意图制造出强悍的新软件和比IBM 7094功能更丰富的新硬件,所以麻省理工学院邀请了两家公司来帮忙
-
3.2.1. 计算机制造商通用电气(General Electric,GE)公司负责设计和生产拥有全新硬件特性、能更好地支持分时和多用户体系的新计算机
-
3.2.2. 由于贝尔实验室在20世纪50年代初就打造了自己的操作系统,拥有极丰富的经验,因此在这个项目中帮忙做操作系统
-
3.2.3. 项目参与方是一所高校和两家全无共性的公司,分布在美国的3个地方,即使对组织机构无甚研究的人也能料到会出问题
3.3. 道格致力于在Multics上实现PL/I
3.4. 在哈佛大学读书时,丹尼斯就在为Multics编写文档,加入贝尔实验室后,又参加开发设备I/O(输入/输出)子系统
3.5. 肯全力做I/O子系统,这段经历在他后来开发Unix时派上了用场
-
3.5.1. 肯于1966年加入贝尔实验室,开始做Multics研发工作,后来又写了Unix
-
3.5.2. 1971年,他为PDP-11写了一个国际象棋程序
-
3.5.3. 2006年,他加入谷歌公司,和罗布·派克及罗伯特·格里塞默(Robert Griesemer)一起发明了Go语言
3.6. 第二系统效应
-
3.6.1. second system effect
-
3.6.2. 意思是在首个系统(如CTSS)创建成功后,打算创建一个新系统,修正旧系统的遗留问题,还要添加每个人期望的新特性,结果常常是塞了太多不同东西进去,最终得到过于复杂的系统
4. Belle
4.1. “50步规则”规定,如果在50步棋以内,没有吃子,或者兵没有移动过,则棋手可以提出和局
- 4.1.1. 能防止玩家在无法赢棋时干耗时间
4.2. Belle是肯与乔·康登(Joe Condon)从1976年至1980年开发的国际象棋计算机
4.3. 在与人类棋手的常规比赛中,斩获2200等级分,成为第一台荣升国际象棋大师的计算机
4.4. 还获得了1980年世界计算机国际象棋大赛(World Computer Chess)冠军
4.5. 在被史密森学会(Smithsonian Institution)收藏之前,它还得过好几次ACM计算机国际象棋锦标赛冠军
5. Unix起源
5.1. PDP-7于1964年推出,但计算机领域演进太快,到了1969年,它已经过时。这台机器本身不算很强大,只有8K(8192)个18位字长的内存(16 KB),但其图形显示非常漂亮,所以肯就为它写了个太空旅行游戏
5.2. 磁盘运转速度远高于计算机读写速度
-
5.2.1. 为了解决这个古怪的问题,肯写了个磁盘调度算法来提升磁盘的总吞吐量
-
5.2.2. 这个算法在任意磁盘上都可用,但主要是为PDP-7的这块磁盘设计的
5.3. 肯写三个程序,每周写一个
-
5.3.1. 用来创建代码的编辑器
-
5.3.2. 将代码转换为PDP-7能运行的机器语言的汇编器
-
5.3.3. 再加上“内核的外层—操作系统齐活了”
5.4. Unix是用来测试吞吐量之类的文件系统实现
5.5. UNICS后来变成了Unix,这名字显然更好
6. 初版
6.1. PDP-7的Unix系统实在有趣,即使它只是运行在一台小型计算机上,而且还没有很多软件,人们还是开始使用了
- 6.1.1. 比大型中央计算机更好玩、更具生产力
6.2. PDP-10有36位字长的内存,与IBM 7090、GE 635和GE 645一样
- 6.2.1. Tenex是在1969年为PDP-10编写的操作系统
6.3. 管理层的积极作用之一就是随时保持警醒,让要求资源的人打磨申请,专注提案
-
6.3.1. 相比没有资源限制,资源紧张更有机会促成好的、经过深思熟虑的结果
-
6.3.2. 雇用聪明人,帮他们融入环境,指出大致的需求方向,给他们很多自由空间
-
6.3.3. 事后看来,在资源限制之下工作是件好事
6.4. 贝尔实验室是巨大而富有成效的科研机构,产出大量专利申请
-
6.4.1. 专利申请是文本文档,但有一些严苛的格式要求,例如要标出行号
-
6.4.2. 文本格式化是20世纪70年代Unix故事的重要内容
- 6.4.2.1. 用作专利申请文档工具的Unix
6.5. Nroff
-
6.5.1. new Roff,意为“新Roff”
-
6.5.2. Nroff类似于既有的Roff文字格式化程序,但它能按所需格式输出专利申请书
6.6. 打字员们在白天处理专利文档
-
6.6.1. 喂纸是个技术活:要想装一盒折叠打印纸上去,须得技艺纯熟
-
6.6.2. 到了夜里,肯、丹尼斯和其他人就用这台PDP-11开发软件
-
6.6.3. 开发得在晚上进行,而且要万分谨慎,才不会干扰打字员工作
-
6.6.4. 专利部门尝到甜头,又为Unix团队买了一台PDP-11,组员们这才能够全天进行开发
- 6.6.4.1. 成了Unix的第1版
6.7. PDP-11的特制型号PDP-11/20
-
6.7.1. 靠近顶部的圆形器件是DECtapes,一种磁带设备,拥有144K个18位字长的存储能力
- 6.7.1.1. 可以读取或写入单个磁块,所以能用作虽然慢速但却可靠的临时存储设备
-
6.7.2. 磁带可拆装,所以也能用作备份
6.8. Teletype公司是AT&T旗下企业,其产品广泛应用在贝尔系统和其他地方,最初用来传递信息,之后用来连接计算机
6.9. Unix中许多命令都很短,原因之一就是在Mode 33上输入非常费力,而且输出速度太慢
6.10. 独立办公室虽然比开放式区域成本更高,但也给了员工安静平和的空间,让员工可以不受旁边没完没了的噪声影响,专注于工作,还能够保存图书、文件,关上门就能沉思或私聊
-
6.10.1. 开放式工作区不利于集中注意力
-
6.10.2. 贝尔实验室既提供独立办公室,又为群体提供共享空间,这套机制非常棒
6.11. 贝尔实验室制度宽松,但到了20世纪80年代早期至中期某个时候,出台了新规:员工必须一直佩戴胸牌
-
6.11.1. 能有效鉴别出外来人员,但员工并不乐意照办
-
6.11.2. 胸牌没有安全鉴证功能,只是在模板上贴了张照片而已
7. Unix程序员手册
7.1. 在线手册是Unix的早期成果之一
7.2. 手册采用和现在差不多的格式,风格简洁。每个命令、库函数、文件格式等,在手册上都有专页,简要说明其功能和用法
7.3. 早期的手册页往往每个命令就真的只有一页,这在如今已不常见
- 7.3.1. 简洁
7.4. “缺陷”部分,它坦承程序会有缺陷,或谓“特性”,即使不能立即修复,至少也该记录下来
7.5. cat命令50年来没有变过,只添加了很少的可选参数,修改了其操作行为,它仍然是Unix核心命令之一
8. 存储略谈
8.1. IBM 7090或7094拥有32K(32 768)个36位字长的内存
8.2. 原版PDP-7拥有8K(8 192)个18位字长内存,也就是7090内存的大约八分之一
8.3. 第一台PDP-11拥有24 KB主存储器和半兆硬
8.4. 2015年版MacBook Air有8 GB内存(超过33万倍)和500 GB的硬盘(50万倍),价格不过1 000美元
8.5. 现在主存储器动辄以GB计,硬盘以TB为单位,而且既便宜又小巧,被广为使用
8.6. 磁芯内存非常昂贵,因为制造它需要高度熟练的手工劳动
8.7. 内存往往是计算机中最昂贵的部件
-
8.7.1. 每个字节都很珍贵
-
8.7.2. 程序员受内存资源约束,得随时清楚使用了多少内存,有时不得不采取讨巧和冒险的编程技术来将程序放入可用内存中
8.8. Unix擅长高效利用计算机的有限内存
-
8.8.1. 首先得归功于像肯和丹尼斯这样天赋异禀的程序员,他们知道如何节省内存
-
8.8.2. 找到了实现通用性和统一性的方法,于是就能用较少的代码完成更多任务
-
8.8.2.1. 得靠巧妙的编程手段
-
8.8.2.2. 拜更好的算法所赐
-
-
8.8.3. 汇编语言也厥功至伟,相比高级语言,它能让指令执行得更快,使用更少内存
- 8.8.3.1. 只有到了20世纪70年代,基于半导体和集成电路的新内存技术变得普遍,程序员才负担得起使用C之类高级语言所需的额外开销
8.9. 存储分配器,如最初的alloc和道格·麦基尔罗伊后来写的malloc库,用来在程序运行时动态分配和重新分配内存,这是充分利用稀缺资源的另一种方式
- 8.9.1. 谨慎操作内存,因为最微小的错误都可能导致程序出错
8.10. 内存管理不当仍然是C语言程序出错的主要原因之一
8.11. “磁芯转储”(core dump)
8.12. 保存主存储器状态的文件仍然被称为磁芯(core)
9. 丹尼斯·里奇
9.1. 丹尼斯在贝尔实验室度过了几个夏天,并于1967年正式入职,成为计算科学研究中心技术团队的一员
9.2. C语言的起源可以追溯到20世纪70年代初
- 9.2.1. 基于丹尼斯为Multics实现高级语言的经验而创造,但由于当时大多数计算机能力有限,根本没有足够的内存或处理能力来支持复杂语言的复杂编译器,所以C语言的规格大大缩小了
9.3. 有了C语言,就有可能使用高级语言编写整个操作系统
-
9.3.1. 到了1973年,Unix已经从原来的汇编语言改为C语言编写,系统的维护和修改变得更加容易
-
9.3.2. 将操作系统从最初的PDP-11计算机移植到其他不同架构的计算机,这是C语言带来的另一个巨大进步
-
9.3.3. 由于大部分系统代码都用C语言编写,所以移植系统所需工作并不比移植C语言编译器多多少
9.4. 丹尼斯原著的C语言参考手册是1988年首次推出的ANSI/ISO(美国国家标准学会American National Standards Institute/国际标准化组织International Organization for Standardization)的C标准的基础,也是该标准的主要构成部分
737

被折叠的 条评论
为什么被折叠?



