1.1 历史背景

1.1  历史背景

自从20世纪40年代计算机诞生以来,它就以异乎寻常的速度发展着,但早期的硬件发展速度要远远高于软件的发展速度。这时操作系统虽已出现,但应用得还比较少,运行在计算机里的程序大多是为了实现某种特定的功能而编制的。程序员需要对计算机内部各种设备的原理具有很深的了解才能够写出所需要的程序。虽然如Fortran等高级语言已经出现,但程序员很多仍使用机器语言或汇编语言编制程序,这时只有极少数人才能够掌握程序的开发。

直到第三代集成电路计算机(1964-1971)时代的到来,操作系统才被越来越广泛地用于计算机内部。操作系统事实上就是对计算机各种资源(设备)的一种抽象。这些资源(设备)包括CPU(Central Processor Unit)、主存(Main Memory)、辅存(Secondary Memory)、键盘(Keyboard)和显示器(Monitor)等,并在此基础上提供一系列服务(比如文件系统)。程序员可以通过调用操作系统所提供的编程接口获得服务、对各种资源方便地进行访问,从而开发出实现特定功能的应用软件,提供给最终用户(end user)。因此这一时期涌现出更多的程序员、分析员和计算机系统专家,软件行业也得到了极大的发展。而对于最终用户而言,他们对应用软件的兴趣远远高于操作系统本身,在他们看来,操作系统几乎是透明的。这时的操作系统已由早期的单用户作业操作系统发展成多用户多任务的分时操作系统。也就是说,多个用户可以通过多个终端同时访问计算机资源。尽管一台计算机物理上只有一套处理器、内存和辅存等资源,但是通过分时机制,每个用户都会拥有一套虚拟的资源,就好像每个用户都拥有一台单独的计算机。

 

1.2  UNIX诞生的经过

在这样的背景下,诞生了经典的UNIX操作系统。事实上,这个过程多少有点戏剧性。

1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的项目;该项目要建立一套多使用者、多任务、多层次(multi-user、multi-task、multi-level)的MULTICS操作系统。直到1969年,因MULTICS项目的工作进度太慢,该项目就被停了下来。当时,Ken Thompson已经有一个称为"星际旅行"的程序在GE-635的机器上运行,但是反应非常的慢,正巧被他发现了一台被闲置的PDP-7(Digital的主机),Ken Thompson和Dennis Ritchie就将"星际旅行"的程序移植到PDP-7上。而这部PDP-7就此在整个计算机历史上留下了芳名。

MULTICS 其实是"MULTi-plexed Information and Computing System"的缩写,在1970年时,那台PDP-7却只能支持两个使用者,当时,Brian Kernighan 就开玩笑地戏称他们的系统其实是:"UNi-plexed Information and Computing System",缩写为"UNICS",后来,大家取其谐音,就称其为"UNIX"了。1970年可称为是UNIX元年。

1971年,他们申请了一台PDP-11/20,申请的名义是:要发展文书处理系统。该提案被采纳,他们也就发展出了一套文书处理系统--就是现在UNIX操作系统里面文书处理系统(nroff/troff)的前身。有趣的是,没有多久,贝尔实验室的专利部门真的采用了这套系统作为他们处理文件的工具,而贝尔实验室的专利部门也就顺理成章地成为UNIX的第一个正式使用者。当时,那部PDP-11/20只有0.5MB磁盘空间。而描述这整个系统的文件被标示为:"First Edition",版本日期是1970年11月。从此以后,UNIX的版本就以系统文件的版本来称呼。

1973年,Ken Thompson(肯·汤姆森)和Dennis Ritchie(丹尼斯·里奇)发明了C语言之后,着手将UNIX程序用高阶的C语言改写,这个时候已经是第4版了(C的前身叫B,也是他们两个人发明的,为了改写UNIX,他们将B语言做了一番改进,而成了C语言)。这个划时代的动作让UNIX能够很轻易地被移植到各种不同的机器上。

1974年,他们在计算机协会交流杂志(Communications of the ACM①)正式发表了UNIX,吸引了更多学术界的注意与参与。从此,UNIX逐渐成为网络工作站的标准,让使用不同机器的使用者,都能使用类似的UNIX操作系统,这对于网络世界的标准化有着很大的贡献。

在UNIX的诞生初期,贝尔实验是还是一个大的集合体,包括贝尔电话公司以及西部电气(Western Electric Co.)。碍于反托拉斯法的规定,它不能利用UNIX做任何的商业行为,也因此,内部的管理阶层自然没有兴趣对UNIX有任何的支持,UNIX就全靠一群玩家在琢磨,主要人物当然还是Ken Thompson和Dennis Richie。

 

1.3  UNIX版本6

1975年第6版(6th Edition)UNIX发表,这也正是本书所要讲解的UNIX版本。在UNIX发展史上,它具有里程碑式的意义。因为这是一个真正具有现代意义的操作系统,它已经几乎具备了现代(单机)操作系统的所有概念:进程、进程间通信、多用户、虚拟内存、系统的内核模式和用户模式、文件系统、中断(自陷)管理、I/O设备管理、系统接口调用(API)、用户访问界面(shell)。当然由于这时国际互联网(Internet)还没有产生,所以该版本并不具备网络功能。

该版shell已经具备了很多常用的命令:ls, mkdir, rm, mknod, cd等。

同时,这也是贝尔实验室对外发布的最后一版免费UNIX。在这一版本上,衍生了众多厂商开发的UNIX大家族。从其下一个版本System V开始,贝尔实验室使对其不再开放,而要付费才能获取了。

1977年,加州大学伯克利分校(UC Berkeley)开始公开Pascal编译器,连带地发布了对UNIX 6th Edition的改进程序代码,这就是所谓的"1 BSD"(1st Berkeley Software Distribution),也开创了UNIX的另一个分支:BSD系列,向外发行。这个时候的BSD已经很不同于AT&T了( 4.3BSD中来自AT&T UNIX的代码已经不足10%),并且早已经领先与AT&T的UNIX(最早实现TCP/IP协议的就是BSD)。而AT&T的UNIX系统实验室,也在不断改进它们的商用UNIX版本,它们吸收了BSD UNIX中已有的各种先进特性,并结合其本身的特点,推出了System V版本。这样就使得UNIX分裂为了两个大的派系,即基于AT&T的SystemV和基于伯克利代码的BSD。

 

1.2  UNIX诞生的经过

在这样的背景下,诞生了经典的UNIX操作系统。事实上,这个过程多少有点戏剧性。

1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的项目;该项目要建立一套多使用者、多任务、多层次(multi-user、multi-task、multi-level)的MULTICS操作系统。直到1969年,因MULTICS项目的工作进度太慢,该项目就被停了下来。当时,Ken Thompson已经有一个称为"星际旅行"的程序在GE-635的机器上运行,但是反应非常的慢,正巧被他发现了一台被闲置的PDP-7(Digital的主机),Ken Thompson和Dennis Ritchie就将"星际旅行"的程序移植到PDP-7上。而这部PDP-7就此在整个计算机历史上留下了芳名。

MULTICS 其实是"MULTi-plexed Information and Computing System"的缩写,在1970年时,那台PDP-7却只能支持两个使用者,当时,Brian Kernighan 就开玩笑地戏称他们的系统其实是:"UNi-plexed Information and Computing System",缩写为"UNICS",后来,大家取其谐音,就称其为"UNIX"了。1970年可称为是UNIX元年。

1971年,他们申请了一台PDP-11/20,申请的名义是:要发展文书处理系统。该提案被采纳,他们也就发展出了一套文书处理系统--就是现在UNIX操作系统里面文书处理系统(nroff/troff)的前身。有趣的是,没有多久,贝尔实验室的专利部门真的采用了这套系统作为他们处理文件的工具,而贝尔实验室的专利部门也就顺理成章地成为UNIX的第一个正式使用者。当时,那部PDP-11/20只有0.5MB磁盘空间。而描述这整个系统的文件被标示为:"First Edition",版本日期是1970年11月。从此以后,UNIX的版本就以系统文件的版本来称呼。

1973年,Ken Thompson(肯·汤姆森)和Dennis Ritchie(丹尼斯·里奇)发明了C语言之后,着手将UNIX程序用高阶的C语言改写,这个时候已经是第4版了(C的前身叫B,也是他们两个人发明的,为了改写UNIX,他们将B语言做了一番改进,而成了C语言)。这个划时代的动作让UNIX能够很轻易地被移植到各种不同的机器上。

1974年,他们在计算机协会交流杂志(Communications of the ACM①)正式发表了UNIX,吸引了更多学术界的注意与参与。从此,UNIX逐渐成为网络工作站的标准,让使用不同机器的使用者,都能使用类似的UNIX操作系统,这对于网络世界的标准化有着很大的贡献。

在UNIX的诞生初期,贝尔实验是还是一个大的集合体,包括贝尔电话公司以及西部电气(Western Electric Co.)。碍于反托拉斯法的规定,它不能利用UNIX做任何的商业行为,也因此,内部的管理阶层自然没有兴趣对UNIX有任何的支持,UNIX就全靠一群玩家在琢磨,主要人物当然还是Ken Thompson和Dennis Richie。

 

1.4  各流派一览

UNIX的各个流派如图1-1所示。

 

 

 

1.5  为什么取得成功

1.5.1  简洁高效

在UNIX之前,已经存在很多的多用户多任务分时操作系统,如IBM的OS/360等。但是它们都非常复杂,难以开发维护,同时对硬件的要求也比较高。相对于以前的操作系统而言,UNIX显得极为简洁,就本书所讲述的版本而言,才10000行代码(包括注释),就已经实现了进程管理调度、进程间通信、虚拟内存管理、中断(自陷)管理、文件系统、I/O设备管理、系统接口调用(API)和用户访问界面(shell)功能。而且代码的效率都非常高,比如:

(1)大量移位、与或、自增/减等操作符的使用,充分精简指令,提高了CPU利用率;

(2)利用指针传递参数以及利用指针对内存直接访问,提高了内存访问效率;

(3)文件缓冲区的使用,大大提高了磁盘文件访问的速度;

(4)较短的进程上下文。对没有磁盘换入/换出的进程上下文切换,只用了30~40条机器指令就完成。

1.5.2  健壮性

UNIX具有强大的出错检测机制,程序具有很强的容错性。不会因为某一步操作的出错而引起系统整个崩溃。相反,系统会给用户返回相应的错误码,便于用户调试。这样,即使是系统中某个设备出错不能正常工作,并不影响其他设备的工作。比如磁盘某个扇区的毁坏不会影响其他扇区的使用。此外,严格的用户权限管理为系统的健壮性提供了一个很好的机制。

1.5.3  功能丰富

适应多用户多任务的需求,可以有多个用户同时使用系统。当多个用户同时操作同一资源时,UNIX会对资源做出合理的分配。并且一个用户可以同时做多件事情,比如:键盘输入和打印。另外UNIX支持大量的I/O设备,例如磁盘、磁带、打印机、纸带打孔机、电传打字机(Teletype)和显示器(CRT)等。

1.5.4  移植性

因为UNIX V6 90%的代码都是使用C语言编写,从而大大提高了系统的移植性。只要修改少许和机器相关的部分程序代码(包括汇编程序部分和其他硬件驱动及相关部分),整个UNIX可以在很短时间内完成移植的动作。因为绝大部分代码都是使用C语言编写的,移植的主要工作已经交给编译器完成。这就为它的推广提供了一个极大的便利条件。

1.5.5  开放性

UNIX得以如此成功的另一个重要原因是它的开放性。尽管同时代也有很多其他优秀的操作系统,但它们都不是免费开放的。这样各个研究机构和普通用户就很难获得,并加以研究改进。而UNIX在包括第6版之前几乎都是免费的,这就为它的迅速普及提供了一个先决条件。俗话说:"众人拾柴火焰高"。在各公司机构研究开发人员的集体智慧下,UNIX才得以变得越来越出色。

 

1.6  缩写及术语说明

BSD------Berkeley Software Distribution
PSW------Processor Status Word
CPU------中央处理器(Central Processing Unit)
GOT------全局偏移表(Global Offset Table)
PLT-------过程链接表(Procedure Linkage Table)
PIC-------位置无关代码(Position Independent Code)
1字节---8位
1字------2字节
1KB--------1024字节
1MB--------1024KB
1GB--------1024MB
1TB---------1024GB
0oXYZ---8进制数XYZ
XYZ, XYZ. ------10进制数XYZ
0xXYZ--16进制数XYZ
主存------主要存储器,俗称"内存"
辅存------辅助存储器,包括硬盘、磁带等
换入------把进程的程序/数据从辅存读入到主存中的过程
换出------把进程的程序/数据从主存写入到辅存中的过程
交换------进程换入和换出过程的总称
换入进程位于内存中的进程,也叫加载进程
换出进程位于磁盘上的进程,也叫未加载进程
挂起------进程被剥夺CPU执行权,又称为程序阻塞
唤醒------进程重新获得CPU执行权,又称为程序解除阻塞
proc结构---------UNIX为每个进程分配的结构,它包含进程优先级、ID、状态、程序段地址等信息,其他很多地方又称为"进程控制块"(PCB--Process Control Block)
u变量--------全局变量,user结构类型,每个进程一个,它包含了进程所用的各类资源:已打开文件、当前目录、用户虚存映射和所接收到的信号量等,它和proc结构一起构成"进程上下文"
系统调用操作系统提供的编程接口,又称系统函数或系统接口
注释-----------C++风格的"// "注释或中文注释都是作者所加
&lt(;),&gt(;), &amp(;)-----如在代码中看到,转换成<, >,&,这是网页转换的结果