第1部分 Solaris 10基础和安装配置
第1章 UNIX和Solaris 10概述
1.1 UNIX的历史
1.1.1 UNIX的诞生
1965年时,贝尔实验室(Bell Labs)加入一项由奇异电子(General Electric)和麻省理工学院(MIT)合作的计划;该计划要建立一套多使用者、多任务、多层次(multi-user、multi-processor、multi-level)的MULTICS操作系统。直到1969年,因MULTICS计划的工作进度太慢,该计划被停了下来。当时,Ken Thompson(后被称为UNIX之父)已经有一个称为“星际旅行”的程序在GE-635的机器上跑,但是反应非常慢,正巧被他发现了一部被闲置的PDP-7(Digital的主机),Ken Thompson和Dernis Ritchie就将“星际旅行”的程序移植到PDP-7上。而这部PDP-7(如图1-1所示)就此在整个计算机历史上留下了芳名。
图1-1 PDP-7计算机
MULTICS其实是“MULTiplexed Information and Computing System”的缩写,在1970年时,那部PDP-7却只能支持两个使用者,当时,Brian Kernighan就开玩笑地称他们的系统其实是:“UNiplexed Information and Computing System”,缩写为“UNICS”,后来,大家取其谐音,就称其为“UNIX”了。1970年可称为“UNIX元年”。
1.1.2 UNIX进化史
1.初创期
UNIX的诞生和Multics(Multiplexed Information and Computing System)是有一定渊源的。Multics是由麻省理工学院、AT&T贝尔实验室和通用电气合作进行的操作系统项目,被设计运行在GE-645大型主机上,但是由于整个目标过于庞大,糅合了太多的特性,Multics虽然发布了一些产品,但是性能都很低,最终以失败而告终。
AT&T最终撤出了投入Multics项目的资源,其中一个开发者Ken Thompson则继续为GE-645开发软件,并最终编写了一个太空旅行游戏。经过实际运行后,他发现游戏速度很慢而且耗费昂贵——每次运行会花费75美元。
在Dennis Ritchie的帮助下,Thompson用PDP-7的汇编语言重写了这个游戏,并使其在DEC PDP-7上运行起来。这次经历加上Multics项目的经验,促使Thompson开始了一个DEC PDP-7上的新操作系统项目。Thompson和Ritchie领导一组开发者,开发了一个新的多任务操作系统。这个系统包括命令解释器和一些实用程序,这个项目被称为UNICS(Uniplexed Information and Computing System),因为它可以支持同时的多用户操作。后来这个名字被改为UNIX。
2.发展期
最初的UNIX是用汇编语言编写的,一些应用是由叫做B语言的解释型语言和汇编语言混合编写的。B语言在进行系统编程时不够强大,所以Thompson和Ritchie对其进行了改造,并于1971年共同发明了C语言。1973年Thompson和Ritchie用C语言重写了UNIX。在当时,为了实现最高效率,系统程序都是由汇编语言编写的,所以Thompson和Ritchie此举是极具大胆创新和革命意义的。用C语言编写的UNIX代码简洁紧凑、易移植、易读、易修改,为此后UNIX的发展奠定了坚实基础。
1974年,Thompson和Ritchie合作在ACM通信上发表了一篇关于UNIX的文章,这是UNIX第一次出现在贝尔实验室以外。此后UNIX被政府机关、研究机构、企业和大学注意到,并逐渐流行开来。
1975年,UNIX发布了4、5、6三个版本。1978年,已经有大约600台计算机在运行UNIX。1979年,版本7发布,这是最后一个广泛发布的研究型UNIX版本。20世纪80年代相继发布的8、9、10版本只授权给了少数大学。此后这个方向上的研究导致了Plan 9的出现,这是一个新的分布式操作系统。
1982年,AT&T基于版本7开发了UNIX System Ⅲ的第一个版本,这是一个商业版本,仅供出售。为了解决混乱的UNIX版本情况,AT&T综合了其他大学和公司开发的各种UNIX,开发了UNIX System Ⅴ Release 1。
这个新的UNIX商业发布版本不再包含源代码,所以加州大学Berkeley分校继续开发BSD UNIX,作为UNIX System III和Ⅴ的替代选择。BSD对UNIX最重要的贡献之一是TCP/IP。BSD有8个主要的发行版中包含了TCP/IP:4.1c、4.2、4.3、4.3-Tahoe、4.3-Reno、Net2、4.4及4.4-lite。这些发行版中的TCP/IP代码几乎是现在所有系统中TCP/IP实现的前辈,包括AT&T System Ⅴ UNIX和Microsoft Windows。其他一些公司也开始为自己的小型机或工作站提供商业版本的UNIX系统,有些选择System Ⅴ作为基础版本,有些则选择了BSD。BSD的一名主要开发者,Bill Joy,在BSD基础上开发了SunOS,并最终创办了Sun Microsystems。
1991年,一群BSD开发者(Donn Seeley、Mike Karels、Bill Jolitz和Trent Hein)离开了加州大学,创办了Berkeley Software Design,Inc(BSDI)。BSDI是第一家在便宜常见的Intel平台上提供全功能商业BSD UNIX的厂商。后来Bill Jolitz离开了BSDI,开始了386BSD的工作。386BSD被认为是FreeBSD、OpenBSD和NetBSD的先辈。
AT&T继续为UNIX System Ⅴ增加了文件锁定、系统管理、作业控制、流和远程文件系统。1987到1989年,AT&T决定将Xenix(微软开发的一个x86-pc上的UNIX版本),BSD,SunOS和System Ⅴ融合为System Ⅴ Release 4(SⅤR4)。这个新发布版将多种特性融为一体,结束了混乱的竞争局面。1993年以后,大多数商业UNIX发行商都基于SⅤR4开发自己的UNIX变体了。
3.现况
UNIX System Ⅴ Release 4发布后不久,AT&T就将其所有UNIX权利出售给了Novell。Novell期望以此来对抗微软的Windows NT,但其核心市场受到了严重伤害,最终Novell将SⅤR4的权利出售给了X/OPEN Consortium,后者是定义UNIX标准的产业团体。最后X/OPEN和OSF/1合并,创建了Open Group。Open Group定义的多个标准定义着什么是以及什么不是UNIX。实际的UNIX代码则辗转到了Santa Cruz Operation,这家公司后来出售给了Caldera Systems。Caldera原来也出售Linux系统,交易完成后,新公司又被重命名为SCO Group。
1.1.3 UNIX System V第四版本的功能
System Ⅴ对于UNIX平台的主要贡献包括:
·增强了Bourne shell功能,包括shell函数。
·支持STREAMS和TLI网络库。
·远程文件共享(RFS)。
·改善了内存分页。
·应用了二进制接口(ABI)。
UNIX System Ⅴ第四版本与BSD UNIX的主要差别可以总结如下:
· root引导脚本在System Ⅴ中为/etc/init.d,在BSD中为/etc/rc.d。
·默认shell在System Ⅴ中为Bourne shell,在BSD中为C shell。
·文件系统数据库在System Ⅴ中为/etc/mnttab,在BSD中为/etc/mtab。
·内核名称在System Ⅴ中为/UNIX,在BSD中为/vmUNIX。
·打印系统在System Ⅴ中为lp,在BSD中为lpr。
·字符串函数在System Ⅴ中为memcopy,在BSD中为bcopy。
·终端初始化在System Ⅴ中为/etc/inittab,在BSD中为/etc/ttys。
·终端控制在System Ⅴ中为termio,在BSD中为termios。
1.1.4 开源的类UNIX系统
Richard Stallman建立了GNU项目,要创建一个能够自由发布的类UNIX系统。20年来,这个项目不断发展壮大,包含了越来越多的内容。现在,GNU项目开发的产品,比如Emacs,GCC等已经成为各种其他自由发布的类UNIX产品中的核心角色。1990年,Linus Torvalds决定编写一个自己的Minix内核,初名为Linus’Minix,意为Linus的Minix内核,后来改名为Linux,此内核于1991年正式发布,并逐渐引起人们的注意。当GNU软件与Linux内核结合后,GNU软件构成了这个POSIX兼容操作系统GNU/Linux的基础。今天GNU/Linux已经发展成为最为活跃的自由/开放源码的类UNIX操作系统。1994年,BSD UNIX走上了复兴的道路。BSD的开发也走向了几个不同的方向,并最终导致了FreeBSD、OpenBSD和NetBSD的出现。图1-2是UNIX进化史。
图1-2 UNIX进化史
1.1.5 UNIX
UNIX/Linux基本结构
图1-3绘出了UNIX系统的高层次的体系结构。图中心的硬件部分向操作系统提供基本服务。操作系统直接与硬件交互,向程序提供公共服务,并使它们同硬件特性隔离。当我们把整个系统看成层的集合时,通常将操作系统称为系统内核,或简称内核,此时强调的是它同用户程序的隔离。因为程序是不依赖于其下面的硬件的,所以,如果程序对硬件没做什么假定的话,就容易把它们在不同硬件上运行的UNIX系统之间迁移。比如,那些假定了机器字长的程序就比没假定机器字长的程序更难以搬到其他机器上。外层的程序,诸如shell及编辑程序(vi),是通过引用一组明确定义的系统调用而与内核交互的。这些系统调用通知内核为调用程序做各种操作,并在内核与调用程序之间交换数据。图1-3中出现的一些程序属于标准的系统配置,就是大家所知道的命令。但是由名为a.out的程序所指示的用户自有程序也可以存在于这一层。此处的a.out是被C编译程序产生的可执行文件的标准名字。其他应用程序能在较低的程序层次之上构筑而成,因此它们存在于图1-3的最外层。比如,标准的C编译程序cc就处在图1-3的最外层;它引用C预处理程序、两次编译程序、汇编程序及装入程序(称为连接—编译程序),这些都是彼此分开的底层程序。虽然图1-3对应用程序只描绘了两个级别的层次,但用户能够对层次进行扩充,直到级别的数目适合于自己的需要。确实,为UNIX系统所偏爱的程序设计风格鼓励把现存程序组合起来去完成一个任务。
图1-3 UNIX系统的高层次的体系结构
一大批提供了对系统的高层次看法的应用子程序及应用程序,诸如shell、编辑程序、SCCS(Source Code Control System)及文档准备程序包等,都逐渐变成了“UNIX系统”这一名称的同义语。然而,它们最终都使用由内核提供的底层服务,并通过系统调用(System Call)的集合利用这些服务。系统调用的集合及其实现系统调用的内部算法形成了内核的主体。简言之,内核提供了UNIX/Linux系统全部应用程序所依赖的服务,并且内核定义了这些服务。下面我们将进一步介绍内核,对内核的体系结构提出一个总的看法,勾画出它的基本概念和结构,这将帮助读者更好地学习以后的内容。
图1-4给出了内核的框图,显示出了各种模块及它们之间的相互关系,它特别指出了内核的两个主要成分:左边的文件子系统和右边的进程控制子系统。虽然实际上,由于某些模块同其他模块的内部操作进行交互而使内核偏离该模型,但该图仍可以作为观察内核的一个有用的逻辑观点。在图1-4中我们看到了三个层次:用户、内核及硬件。系统调用与库接口体现了图1-4中描绘的用户程序与内核间的边界。系统调用看起来像C程序中普通的函数调用,而库把这些函数调用映射成进入操作系统所需要的源语。然而,汇编语言程序可以不经过系统调用库而直接引用系统调用。程序常常使用像标准I/O库这样一些其他的库程序以提供对系统调用的更高级的使用。由于在编译期间把这些库连接到程序上,因此,以这里的观点来说,这些库是用户程序的一部分。
图1-4 UNIX系统内核结构
图1-4把系统调用的集合分成与文件子系统交互作用的部分及与进程控制子系统交互作用的部分。文件子系统管理文件,其中包括分配文件空间、管理空闲空间、控制对文件的存取,以及为用户检索数据。进程通过一个特定的系统调用集合,比如通过系统调用open,close,read,write,stat,chown及chmod等与文件子系统交互。文件子系统使用一个缓冲机制存取文件数据,缓冲机制调节在核心与二级存储设备之间的数据流。缓冲机制同块I/O设备驱动程序交互作用,以便启动往核心去的数据传送及从核心来的数据传送。设备驱动程序是用来控制外围设备操作的核心模块。块I/O设备是随机存取存储设备,或者说,它们的设备驱动程序使得它们对于系统的其他部分来说好像是随机存取存储设备。
例如,一个磁带驱动程序可以允许核心把一个磁带装置作为一个随机存取存储设备看待。文件子系统可以在没有缓冲机制干预的情况下直接与“原始”I/O设备驱动程序交互作用。原始设备,有时也被称为字符设备,包括所有非块设备。进程控制子系统负责进程同步、进程间通信,存储管理及进程调度。当要执行一个文件而把该文件装入存储器中时,文件子系统与进程控制子系统交互:进程子系统在执行可执行文件之前,把它们读到内存中。输入/输出存储管理模块控制存储分配。
在任何时刻,只要系统没有足够的物理存储供所有进程使用,核心就在内存与二级存储之间对进程进行交换,以便所有的进程都得到公平的执行机会。调度程序模块把CPU分配给进程。该模块调度各进程依次运行,直到它们因等待资源而自愿放弃CPU,或者知道它们最近一次的运行时间超出一个时间量,从而核心抢占它们。于是调度程序选择最高优先权的合格进程投入运行;当原来的进程成为最高优先权的合格进程时,还会再次投入运行。进程间通信有几种形式,从时间的异步软中断信号到进程间消息的同步传输等。