UNIX简史
从1991年Linux出现至今,由于众多IT巨头以及技术社区的推动,Linux已经成为非常成熟、可用于各种关键领域的操作系统,适当了解其发展历史,对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的研发成果,要了解Linux的历史就要先了解UNIX的历史。笔者搜集整理了一些史料分享给大家,本篇先介绍UNIX的历史,有不当之处欢迎批评指正。
UNIX由AT&T的贝尔实验室(BTL, Bell Telephone Labs)于1969年开发。UNIX源于一个叫MULTICS的项目,该项目于1964年发起,旨在开发一个可同时支持大量用户使用的计算机操作系统。除了BTL,通用电气(Generic Electrics)、麻省理工(MIT)也参与其中,但该项目并未成功(据说是因为进展过度缓慢被最终裁撤,也有人说是因为需求过于超前)。
在项目进行期间,1969年,BTL的两名工程师Ken Thompson和Dennis Bitchie利用业余时间在一台闲置的DEC PDP7计算机上开发了一个最基本的操作系统内核,同年,Thompson经过两个多月的论证和开发,为该系统内核设计了文件系统,使文件能够在层次结构中有序地存放。
后来,更多的人投入到了这项工作,这个项目也该有个名字了。因为MULTICS项目是“Multiplexed Information and Computer Services(多路信息和计算机服务)”的缩写,开发团队决定将他们的系统命名为“Unics”,表示“Unixplexed Information and Computer Service(综合信息和计算机服务)”,后来研究员Brian Kernighan干脆就将新系统叫做“Unix”。
随着系统开发的推进,他们使用的PDP 7显得有些小了,他们需要一台更强的计算机。他们决定以开发新的文本处理程序为由向公司申请购买新的计算机。在当时,文本处理程序是非常受市场欢迎的——公司同意他们购买一台PDP 11。
PDP 11到货后,他们发现只有CPU和内存,没有磁盘和操作系统,Thompson为它开发了一个驻留内存的RAM盘,一半用作磁盘,另一半用来运行操作系统。磁盘到货后,他们继续开发操作系统以及向公司许诺的文本处理程序。这个文本处理程序就是Troff,后来被用来制作UNIX的man手册。
1971年11月,Thompson和Ritchie完成了程序员手册。1972年6月,UNIX的第二版V2诞生,此时UNIX的装机数量已经超过10台。
1973年底,开发团队决定开一次发布会对外公开他们的成果。众多的IT机构和大学向他们申请UNIX的许可。因AT&T作为电信业垄断巨头(尤其是其垄断了长途电话业务),早就被美国司法部盯上,美国司法部在1958年与AT&T签订了一个和解协议,双方约定AT&T不进入计算机领域,不销售计算机相关产品,司法部不以《反托拉斯法》对其发起诉讼。由于这个原因,AT&T是免费向各机构和大学提供UNIX源代码的。但AT&T不向这些用户提供技术支持,也不为他们纠正系统中的错误,这些用户不得不联合起来形成社区来进行技术交流。他们创建了USENIX社区,意为“UNIX用户”,用来共享技术,他们曾在1974年5月举行了第一次交流会,虽然当时只有十多人参加,但对UNIX社区的发展起到了重要的推动作用。
加州大学伯克利分校也获得了UNIX使用许可,它是Ken Thompson的母校。1975年Thompson回到母校任教,同时带去了最新版本的UNIX。两个刚毕业的学生Chuck Haley和Bill Joy也加入了对UNIX的进一步开发中(Bill Joy后来成为了SUN Microsystems的副总裁之一)。Joy完善了EX编辑器,使其最终演变成了著名的全屏幕编辑器VI。VI不依赖于特定类型的终端,通过Joy创建的TERMCAP通用终端系统与特定终端所对应的控制器结合使VI在各种类型的终端上都可以正确工作。Haley和Joy还开发了一个Pascal编译器,并将其加入了UNIX。Joy将伯克利分校的UNIX版本叫做BSD(Berkely Software Distribution)。
Bill Joy在伯克利分校完成BSD4.1的开发后,离开伯克利加入了SUN Microsystems公司,在那里他完成了BSD 4.2的开发,在1983年他在此基础上创建了SUN版本的Unix——SunOS。
再回到AT&T。从1977年开始AT&T开始将UNIX向Interdata和IBM计算机移植,在此之前,UNIX只能在PDP计算机运行。到1979年6月发布的UNIX Version 7是第一个可移植的UNIX版本,该版本还提供了更多的先进功能,如awk, lint, make, uucp等。此时系统手册已达到400页,另有两个各400页的附录。该版本还包含了Kernighan和Ritchie开发的C编译器,用来对UNIX的大部分代码进行重写;以及增强的shell(Bourne shell)、find、cpio、expr等命令。
此时UNIX已作为计算机工业的一个重要领域开始被各大厂商重视,比如微软和SCO合作开发了Xenix,用于运行在Intel 8086平台的计算机上。AT&T意识到了UNIX是一个非常有商业价值的系统,它在Version 7的使用许可中以防止泄露商业机密为由阻止大学将其作为学术研究的范例,至此各大学只能将操作系统课程的传授限制在理论层面了。
1983年AT&T发布了UNIX System V(SV),这是一个收费的商业化版本,不允许传播源代码。
由于在1974年美国司法部再次起诉AT&T违反《反托拉斯法》,1982年哥伦比亚地区法庭判决AT&T败诉,1984年AT&T被拆成了8个小公司(一个新的AT&T和七个本地电话公司,分别是大西洋贝尔、西南贝尔、西部贝尔、太平洋贝尔、南方贝尔、亚美达科以及纽新公司,他们也被称为“贝尔七兄弟”)。这个判决实际上同时表示1958年的和解协议已经无效了,AT&T可以进军计算机领域了。所以拆分后AT&T依然继续开发System V。SV经过了多次修订,1989年发布的System V Release 4(SVR4)是最重要的一个版本,它首次结合了多个UNIX版本的特性,引入了其他厂商的技术,比如SUN Microsystems,实际上SVR4是AT&T和SUN Microsystems共同发布的,它标志着UNIX系统的进一步标准化和商业化。
再看伯克利分校这边。AT&T对UNIX版权的控制使得伯克利分校仅能将其BSD分发给持有AT&T源码许可的公司,同时伯克利也开始着手在BSD中清除AT&T的代码。80年代后期,几个伯克利的学生成立了一个叫“Berkely Software Design Inc."的公司用来出售BSD的一个商业版本,1990年被AT&T指控其侵权并告上法庭,伯克利分校也成为被告。一直到1994年双方才达成和解,BSD得以继续发展。BSD分裂成不同的版本,FreeBSD,netBSD,OpenBSD(被认为最安全的UNIX)和TrustedBSD。实际上,在1994年和解之前,AT&T就已经将UNIX卖给了Novell,次年Novell又将UNIX卖给了SCO。
这些年的时间里,各大厂商纷纷有了自己的UNIX产品,比如IBM的AIX,DEC的Ultrix,HP的HPUX,Microsoft与SCO合作开发的 Xenix,SUN的Solaries(SunOS的升级版本)。UNIX系统形成两大主要分支,即SVR4和BSD。所有现代的UNIX系统或多或少地都是基于这两个主流分支开发的。
由于AT&T对UNIX版权的控制使大学在教授操作系统时没有了范例可用,1987年,荷兰阿姆斯特丹自由大学的美籍教授Andrew Tanenbaum(加州大学伯克利分校物理博士,《操作系统:设计与实现》的作者)决定自己写一个不含AT&T代码的UNIX兼容操作系统用于教学,他将他的系统叫做Minix。Minix就是Linux的前身,1991年芬兰学生Linus Torvalds在Minix的基础上创建了Linux。由于Linux作为开源软件,获得了众多厂商和技术社区的支持,在1995-1999年间,Linux得到很大的发展,支持多种硬件平台,成为商业UNIX的有力竞争对手。
回望历史,对于UNIX版权的控制深深地影响了UNIX的发展历程。由于IBM在支持Linux时使用了部分AT&T原始代码,掌握版权地SCO在2001年对IBM进行了长达18年的诉讼案,期间SCO的言行表现使得SCO被UNIX世界边缘化了,从现在来看,从SCO拿到UNIX版权的时候,UNIX原始版本的开发就已经结束了。在UNIX的发展过程中形成了一系列的工业标准,比如IEEE POSIX,UNIX97,FHS等,Linux的开发也会参考或升级这些标准。
下面是笔者从某教材中截取的UNIX发展历史简图,供大家参考。

相关文章:
UNIX简史
从1991年Linux出现至今,由于众多IT巨头以及技术社区的推动,Linux已经成为非常成熟、可用于各种关键领域的操作系统,适当了解其发展历史,对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…...
React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
React 在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件…...
uniapp 常用的指令语句
uniapp 是一个使用 Vue.js 开发的跨平台应用框架,因此,它继承了 Vue.js 的大部分指令。以下是一些在 uniapp 中常用的 Vue 指令语句及其用途: v-if / v-else-if / v-else 条件渲染。v-if 有条件地渲染元素,v-else-if 和 v-else 用…...
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
【1】引言 前序已经对BGR图像和HSV图像的转换进行了基本讨论,相关文章链接为: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入-C…...
C# 结构体和类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、类(Class)二、结构体(Struct)示例代码(定义类和结构体)类的继承代码示例(…...
D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。
概述: D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点: ● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电压(2.5V) ● 超过工作范围能进行自动校…...
题目 1738: 排序
题目 1738: 排序 时间限制: 2s 内存限制: 96MB 提交: 14351 解决: 3477 题目描述 对输入的n个数进行排序并输出。 输入格式 输入的第一行包括一个整数n(1<n<100)。 接下来的一行包括n个整数。 输出格式 可能有多组测试数据,对于每组数据,将排序后…...
爬虫逆向学习(十四):分享一下某数通用破解服务开发经验
阅前须知 这篇博客不是教大家怎么实现的,而且告知大家有这个东西,或者说一种趋势,借此分享自己大致的实现经验。具体的实现我也不好整理,毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道࿰…...
《Vue进阶教程》第十一课:响应式系统介绍
1 什么是响应式 当数据改变时, 引用数据的函数会自动重新执行 2 手动完成响应过程 首先, 明确一个概念: 响应式是一个过程, 这个过程存在两个参与者: 一方触发, 另一方响应 比如说, 我们家小胖有时候不乖, 我会打他, 他会哭. 这里我就是触发者, 小胖就是响应者 同样, 所谓…...
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
1.服务提供者注册的方式 // 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时,才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...
pydub AudioSegment增加音频文件音量并保存- python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
IT 新突破!远程控制电脑技术造就工作与学习新方向!
远程控制电脑技术的历史可追溯到计算机网络的早期时代。最初,通过电话线和调制解调器的组合,实现了远程访问,这是远程控制电脑技术的雏形。随着互联网技术的飞速发展,远程控制电脑技术也日趋完善,并在多个领域得到了广…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
Day24 C++ 接口(抽象类)
C 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。 C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明…...
UE5 关于画质、机能与开发成本的思考
1、并不省时间 UE5等工具优点是可以通过一些工具与资源快速获得较好的画面,节约一些时间, 但缺点也很多, 一个是各种精度的素材之间的协调问题,参差不齐,统一升级到高精度会产生较大的成本, 一个是资源…...
IOS学习路线图
iOS是由苹果公司开发的移动操作系统。 苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad上。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统。原本这个系统名为…...
HICE-day6
二层交换 交换基础 所谓的二层交换机指的是针对数据的二层头部(以太网帧头)中的MAC地址进行寻址并转发数据的交换设备。二层交换机不具备路由功能,它工作在OSI七层模型的第二层,因此被称为二层交换机。 上图中,PC1、…...
第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型
基于Python 3.9版本演示 一、写在前面 上一节,我们学了经验模态分解(Empirical Mode Decomposition,EMD)。 如同结尾所说,“那么,做这些分解有什么作用呢?有大佬基于这些分解出来的序列分别作…...
(C语言)双向链表
目录 链表的分类 双向链表的实现 1)定义链表 2)初始化双向链表 3)申请节点 4)尾插 5)头插 6)打印链表 7)尾删 8)头插 9)查找 10)指定位置删除 11…...
青少年编程与数学 02-004 Go语言Web编程 04课题、接收和处理请求
青少年编程与数学 02-004 Go语言Web编程 04课题、接收和处理请求 课题摘要:一、构建WEB服务器1. 安装Go语言2. 创建项目结构3. 编写代码4. 运行WEB服务器5. 访问WEB服务器 二、接收请求1. 定义处理函数(Handler)2. 将处理函数与路由关联3. 启动服务器4. …...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
