1.1 历史背景git
自从20世纪40年代计算机诞生以来,它就以异乎寻常的速度发展着,但早期的硬件发展速度要远远高于软件的发展速度。这时操做系统虽已出现,但应用得还比较少,运行在计算机里的程序大可能是为了实现某种特定的功能而编制的。程序员须要对计算机内部各类设备的原理具备很深的了解才可以写出所须要的程序。虽然如Fortran等高级语言已经出现,但程序员不少仍使用机器语言或汇编语言编制程序,这时只有极少数人才可以掌握程序的开发。程序员
直到第三代集成电路计算机(1964-1971)时代的到来,操做系统才被愈来愈普遍地用于计算机内部。操做系统事实上就是对计算机各类资源(设备)的一种抽象。这些资源(设备)包括CPU(Central Processor Unit)、主存(Main Memory)、辅存(Secondary Memory)、键盘(Keyboard)和显示器(Monitor)等,并在此基础上提供一系列服务(好比文件系统)。程序员能够经过调用操做系统所提供的编程接口得到服务、对各类资源方便地进行访问,从而开发出实现特定功能的应用软件,提供给最终用户(end user)。所以这一时期涌现出更多的程序员、分析员和计算机系统专家,软件行业也获得了极大的发展。而对于最终用户而言,他们对应用软件的兴趣远远高于操做系统自己,在他们看来,操做系统几乎是透明的。这时的操做系统已由早期的单用户做业操做系统发展成多用户多任务的分时操做系统。也就是说,多个用户能够经过多个终端同时访问计算机资源。尽管一台计算机物理上只有一套处理器、内存和辅存等资源,可是经过分时机制,每一个用户都会拥有一套虚拟的资源,就好像每一个用户都拥有一台单独的计算机。shell
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就此在整个计算机历史上留下了芳名。ide
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可以很轻易地被移植到各类不一样的机器上。this
1974年,他们在计算机协会交流杂志(Communications of the ACM①)正式发表了UNIX,吸引了更多学术界的注意与参与。今后,UNIX逐渐成为网络工做站的标准,让使用不一样机器的使用者,都能使用相似的UNIX操做系统,这对于网络世界的标准化有着很大的贡献。spa
在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++风格的"// "注释或中文注释都是做者所加 <(;),>(;), &(;)-----如在代码中看到,转换成<, >,&,这是网页转换的结果