Linux操作系统详解_第1页
Linux操作系统详解_第2页
Linux操作系统详解_第3页
Linux操作系统详解_第4页
Linux操作系统详解_第5页
已阅读5页,还剩400页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux操作系统详解

(第一部分)(共三个部分)总目录第1部分Linux操作系统

第1章操作系统概述

第2章处理机管理

第3章存储管理

第4章调度

第5章设备

第6章文件系统第2部分操作系统命令及shell编程 第7章Linux基本命令 第8章使用vi编辑文件 第9章shell编程第3部分系统管理 第10章Linux系统软件的获取和安装 第11章账号管理 第12章文件系统管理 第13章TCP/IP网络管理 第14章备份与恢复 第15章XWindow及Genie应用程序第1部分Linux操作系统

第1章操作系统概述1.1操作系统简介1.2操作系统接口1.3操作系统功能1.4操作系统结构1.5Linux操作系统介绍1.6Linux的内核特征1.7Linux的发展及展望1.8小结习题操作系统是计算机系统的基本系统软件。软件系统中操作系统是所有软件的核心。操作系统负责控制、管理计算机的所有软件、硬件资源,是惟一直接和硬件系统打交道的软件,是整个软件系统的基础部分,同时还为计算机用户提供良好的界面。因此,操作系统直接面对所有硬件、软件和用户,它是协调计算机各组成部分之间、人机之间关系的重要软件系统。Linux是在日益普及的Internet上迅速形成和不断完善的操作系统。Linux操作系统高效、稳定,适应多种硬件平台,而最具有魅力的是它遵循GPL(GNUGeneralPublicLicense,GNU通用公共许可证,见附录),整个系统的源代码可以自由获取,并且在GPL许可的范围内自由修改、传播,这就为学习、应用、开发操作系统及其他软件提供了良好的基础和较高的起点。本章首先介绍操作系统的概念、功能及其结构,接着介绍Linux系统的基本特征、发展现状,并以此为基础,讨论现代操作系统的一般特点和发展趋势。1.1操作系统简介1.1.1操作系统概念一种非形式的定义如下:操作系统是计算机系统中的一个系统软件,它是这样一些程序模块的集合——它们管理和控制计算机系统中的硬件和软件资源,合理地组织计算机工作流程,以便有效地利用这些资源为用户提供一个功能强大、使用方便和可扩展的工作环境,从而在计算机与用户之间起到接口作用。普通用户使用操作系统,是把操作系统当作一个资源管理者,通过系统提供的系统命令和界面操作等工具,以某种易于理解的方式完成系统管理功能,有效地控制各种硬件资源,组织自己的数据,完成自己的工作并和其他人共享资源。对于程序员来讲,操作系统提供了一个与计算机硬件等价的扩展或虚拟的计算平台。操作系统提供给程序员的工具除了系统命令、界面操作之外,还有系统调用,系统调用抽象了许多硬件细节,程序可以以某种统一的方式进行数据处理,程序员可以避开许多具体的硬件细节,提高程序开发效率,改善程序移植特性。整个计算机系统可以认为是按照一定规则分层构建的,我们可以使用图1.1来示意性地描述这种层次结构。图1.1计算机系统层次结构示意图1.1.2操作系统发展简介操作系统是随着计算机硬件的发展,围绕着如何提高计算机系统资源的利用率和改善用户界面的友好性而形成,发展和不断成熟完善的。随着计算机硬件的发展,计算机的计算速度越来越快,其高速的数据处理与低速的手工操作之间的矛盾日益突出,传统的手工操作是系统的最大制约因素,昂贵的计算机硬件资源得不到有效的利用。一个重要的技术是批处理,专门的操作人员把用户提交的任务按照一定的类别、顺序组织起来,形成作业序列,这些作业成批地在专门的监督程序控制之下自动执行。这里的监督程序就是操作系统的雏形。最初的批处理系统中,计算机内存中仍然只有一个程序在运行,总体系统的效率仍然没有发挥出来。解决这个问题的措施称为多道技术。多道程序设计技术使得在内存中有多个程序,保证系统的处理器总是处于工作状态,极大地提高了系统的利用率。多道技术开始使用在批处理系统中,称为多道批处理系统,这样的系统效率高,但是,在脱机批处理情况下,高效带来的问题是用户对自己作业的控制程度降低。针对这个问题的方案是分时技术。分时系统把处理机的运行时间分成时间片,按照时间片轮流把处理机分配给每一个联机用户。由于每一个时间片很短,宏观上来看,所有用户同时操作计算机,各自独立控制自己的作业。与分时系统相对应,还有一种实时(realtime)操作系统,控制计算机对外来信息进行快速处理,要求系统在允许的时间范围之内做出响应。同时具有多道批处理、分时、实时处理功能,或者其中两种以上功能的系统,称为通用操作系统。Linux操作系统就是具有内嵌网络功能的多用户分时系统。它兼有多道批处理和分时处理功能,是一个典型的通用处理系统。一方面强调分布式计算和处理,另一方面强调物理上跨越不同的主机系统、逻辑上紧密耦合构成统一完整的操作系统平台,这样的系统就是分布式操作系统(distributedoperatingsystem)。这是当前操作系统发展的一个方向。当前,计算机微型化和专业化趋势已成事实。这两种发展趋势都产生了一个共同的需求,即嵌入式软件。嵌入式软件也需要操作系统平台的支持,这样的操作系统就是嵌入式操作系统。嵌入式软件系统的规模小,相应地,其操作系统的规模也小。嵌入式软件的应用平台之一是各种电器,这样的系统面向普通家庭和个人用户,由于快速发展的网络市场,使得家用电器的市场比传统的计算机市场大很多。因此,嵌入式软件可能成为21世纪信息产业的支柱之一,嵌入式操作系统也必将成为软件厂商争夺的焦点,成为操作系统发展的另一个热门方向。1.2操作系统接口操作系统在整个软件系统中处于中心地位,负责控制、管理计算机的所有软件、硬件资源,它屏蔽了很多具体的硬件细节,对计算机用户提供统一、良好的界面(或称为接口,interface)。本节介绍操作系统的接口界面,下一节主要介绍操作系统的管理功能。在计算机层次结构中,操作系统通过接口向上层用户提供各种服务,而上层用户通过操作系统接口来访问硬件。操作系统提供的接口可以根据服务对象的不同而划分为两类:一是程序级的接口,提供给程序员使用,即系统调用;二是作业级的接口,提供给用户使用,即操作命令。1.2.1程序员级接口系统调用是一组由操作系统提供的广义指令。应用程序通过系统调用来操纵系统内核中特定的函数,当应用程序需要进行文件访问、网络传输等操作时,必须通过系统调用来完成。程序员在设计应用程序时,涉及到系统资源,都必须使用系统调用来实现,可以说,系统调用是操作系统提供给程序员的惟一接口。系统调用可以根据功能划分为不同的类型。熟悉系统调用是一个优秀程序员必备的条件。1.2.2用户级接口操作系统提供给用户使用的接口是操作命令,用户可以使用这些操作命令来组织和控制作业的执行或者管理整个计算机系统。实际上,计算机的操作命令界面是在系统调用的基础上开发而成的。操作系统发展的主要方向除了提高系统资源利用率之外,就是改善用户界面友好性。图形用户界面是操纵命令界面发展的一个里程碑。图形用户界面,降低了计算机操作的门槛,千万个家庭成为计算机普及的对象。现在流行的操作系统一般都同时提供图形和文本用户界面。Linux系统就是如此,文本界面是shell接口,图形界面是XWindow系统。1.3操作系统功能多用户分时系统,按照其功能划分为处理机管理、存储管理、设备管理、信息管理(文件系统管理),对于现代流行的操作系统,还具有完整的网络管理功能。这些管理功能都是由操作系统内核实现的。1.3.1处理机管理作业、进程需要适当的分配、调度,以便协调相互关系,共享有限的处理机资源,这是处理机管理的主要内容。处理机管理是操作系统管理功能的关键,操作系统功能的一个主要指标即是提高处理机的使用率,让处理机尽可能处于工作状态。1.3.2存储管理存储管理的目标是让有限的物理内存尽可能满足应用程序对内存的需求。存储管理的内容包括内存的扩充、分配、保护等。操作系统多采用了称为“虚拟内存”的内存管理方式。内存一般采用部分分配的办法。通常,内存中总是同时存放了多个正在运行的程序实体,即进程,在运行的过程中,他们之间可能会使用到相同内存位置的内容,这种技术称为内存共享,这样,可以提高内存的利用率。但是,必须要确保各进程所占据的内存的独立和完整性。1.3.3设备管理除了CPU和内存之外,计算机的其他部件都统称为外部设备。这些设备在操作系统的控制下协调工作,共同完成信息的输入、存储和输出任务。操作系统要对所有的设备进行管理。一方面,让每一个设备尽可能发挥自己的特长,实现与CPU和内存的数据交换,提高外部设备的利用率。另一方面,隐蔽设备操作的具体细节,对用户提供一个统一、友好的设备使用界面。和处理机及内存相比,外部设备的速度要慢得多,而且性能差别大,类型品种多,因此,设备管理是一项复杂而又重要的工作。1.3.4文件系统操作系统在控制、管理硬件的同时,也必须管理好软件资源。操作系统的文件系统就是针对计算机的软件资源而进行的。文件系统主要提供以下服务:文件存取,使每个用户能够对自己的文件进行快速的访问、修改和存储。文件共享,指提供某种手段,使存储空间只保存一个副本,而所有授权用户能够共同访问这些文件。文件保护,指提供保护系统资源防止非法使用的手段。1.3.5网络管理计算机的发展已经进入了互联网时代,现在流行的操作系统一般都具有内嵌的网络功能,能够在内核级别控制、管理网络。操作系统一般都提供网络通信和网络服务等基本功能。内核中网络部分,主要实现网络设备控制和网络协议,因此,网络管理也就集中在通信这部分。1.4操作系统结构本节简单介绍操作系统的逻辑结构,然后介绍操作系统发展过程中使用过的几种主要的体系结构。1.4.1操作系统的逻辑结构计算机系统可以理解为是分层构造的。从逻辑关系来理解,操作系统本身也可以用层次结构来描述。可以认为至少有4层,从上到下依次为:面对用户的外部接口,硬件无关的内核部分,与硬件相关的内核部分,面对硬件的外部接口。可以简单地用图1.2来描述。这种层次结构可以看作是操作系统纵向的结构。图1.2操作系统逻辑层次示意图操作系统也可根据不同的管理功能划分为功能模块。一种简单的理解是,操作系统本身划分为功能模块,而每个模块分层构造,形成一个纵横交错的结构。1.4.2操作系统的体系结构软件的体系结构描述系统各部分软件以及它们相互之间的关系,是软件内部结构配置的一种抽象描述。软件体系结构定义各部分软件系统的应用界面规范及相互操作和数据通信的协议和限制。体系结构相对稳定、满足应用需求,同时具有适当的可适应性和可扩充性。1.模块结构模块结构是将操作系统内核按照功能划分为一个个单独的模块,模块之间相对独立,只能通过预先规定好的接口方式来调用,它们共享数据,模块是系统设计和实现的基本单位。每一个模块实现一个完整单独的功能,所有模块之间相互调用,共同构成一个完整的系统内核。模块结构最大的优点是效率高。模块式结构中,操作系统的逻辑层次关系具体由调用层次关系来体现。这种结构的主要问题一是全局函数使用多,造成访问控制困难;二是结构不够清晰,系统的可理解性、可维护性和可移植性都比较差。2.层次结构层次结构的方法把操作系统内核按照一定的规则划分为一系列相互依赖的层次,每个层次也可以分解为一系列更小的模块,模块负责完成一部分特定的功能,只能与相邻的层次发生直接的联系,所有这些层次的组合,就实现了整个系统。实际上,层次结构可以理解为一种特殊的模块式结构。层次结构可以大大方便系统的移植和扩充。把系统内核划分为严格的层次结构,为了满足有序的层次调用关系,必然要牺牲部分灵活性和系统效率。3.对象结构对象也可以理解为一种特殊的模块,它是由一组数据集以及定义在其上的操作集封装而成。对象结构方法中,操作系统内核按照内核对象实体组织,每个内核对象实体都有自己的数据和操作,对象之间通过消息传递来协调工作。对象模块具有很强的独立性,因此也具有很好的复用性能。对象模块可以方便有效地控制内部数据的访问属性,充分地隐藏信息,达到资源保护的目的。采用对象结构,系统的开发难度降低,具有良好的扩展性和移植性,同时有较好的安全功能。对象结构操作系统内核的一个严重问题是效率低。,Linux内核基本属于模块结构,而MS-DOS系统内核采用的是层次结构,WindowsNT/2000及Solaris则是典型的对象结构。操作系统内核按照其运行的情况可以分为:宏内核与微内核。前者也称为单内核,Linux系统属于单内核类型。对象结构的系统内核通常是微内核,例如,WindowsNT/2000系统就是微内核。1.5Linux操作系统介绍Linux系统有两种不同的含义。从技术角度,Linux指的是由LinusTorvalds维护的开放源代码UNIX类操作系统的内核。然而,目前大多数人用它来表示以Linux内核为基础的整个操作系统。从这种意义讲,Linux指的是开放源代码的,包含内核、系统工具、完整的开发环境和应用的UNIX类操作系统。1.5.1Linux——自由操作系统Linux是一个UNIX操作系统的克隆,可以免费使用,遵循GPL声明,可以自由修改和传播。Linux包含了人们希望操作系统拥有的所有功能特性,这些功能包括真正的多任务、虚拟内存、世界上最快的TCP/IP驱动程序、共享库和多用户支持。Linux现在是个人计算机和工作站上的UNIX类操作系统。它不仅继承了UNIX的特征,而且在许多方面超过了UNIX。作为UNIX类操作系统,它具有下列基本特征:

是真正的多用户、多任务操作系统;是符合POSIX标准的系统;提供具有内置安全措施的分层的文件系统;提供shell命令解释程序和编程语言;提供强大的管理功能,包括远程管理功能;具有内核的编程接口;具有图形用户接口;具有大量有用的实用程序和通信、联网工具;具有面向屏幕的编缉软件。大量的高级程序设计语言已移植到Linux系统上,因而它是理想的应用软件开发平台,而且,在Linux系统下开发的应用程序具有很好的可移植性。同时,Linux还有许多独到之处:(1)它的源代码几乎全部都是开放的。(2)它可以运行在许多硬件平台上。(3)它不仅可以运行许多自由发布的应用软件,还可以运行许多商品化的应用软件。(4)强大的网络功能。Linux系统的另一特征是它能充分发挥硬件的功能,因而它比其他操作系统的运行效率更高。因此,Linux将有广泛的应用前景。1.5.2UNIX、GNU与LinuxLinux是一种类UNIX系统,二者有相当的渊源,同时,Linux遵循GNU的GPL许可证,是自由软件家族中的一员,因此,要了解Linux,就必须先了解他们三者之间的关系。1.Linux与UNIX系统Linux的源头要追溯到最早的UNIX。UNIX系统正式发表于1974年,到1975年的第6版中,引入了多道技术。1980年,Bell实验室公布了VAX11/780系统平台的32位操作系统UNIX32V。一个可以运行UNIX程序的系统就是UNIX。经过多年发展,UNIX从实验室走出来并成为了操作系统的主流。直到今天,UNIX系统以其稳定、高效的性能在服务器高端市场中依然占有绝对优势。很多公司也开发了用于PC的UNIX。UNIX是一个简单却非常优秀的操作系统模型。Linux系统最初以UNIX为原型,以实现POSIX标准作为其目标,到2000年为止,Linux核心从0.01版发展为2.4版。Linux具有稳定高效的处理性能,拥有稳定庞大的用户群体,得到众多厂商有力的支持,成为操作系统发展的热点。Linux在低端服务器市场上已经对WindowsNT/2000造成了极大的压力。2.自由软件运动与LinuxLinux只是自由软件家族中的一员,是其中最具影响的成员之一。在计算机工业发展的初期,软件只是硬件的附属品。但是,公司很快认识到软件的价值,对软件实施了版权控制,并限制源代码的发布。RichardStallman在其他人的协作下创作了通用公共许可证(GeneralPublicLicense,GPL)。GPL保证任何人有共享和修改自由软件的自由,任何人有权取得、修改和重新发布自由软件的源代码,并且规定在不增加附加费用的条件下得到源代码。3.Linux的历史Linux可以说完全是一个互联网时代的产物,它是在互联网上产生、发展和不断壮大起来的。Linus在自己的PC上,利用Tanenbaum教授自行设计的微型UNIX操作系统MINIX为开发平台,开发了属于他自己的第一个程序。Linus说刚开始的时候他根本没有想到要编写一个操作系统内核。“于是我又不得不写一个磁盘驱动程序,然后是一个文件系统。而一旦当你有了任务切换器、文件系统和设备驱动程序之后,你当然就拥有了一个UNIX”或者至少是它的一个内核。Linux就以这样一种极其古怪但也极其自然的方式问世了。Linus并没有在MINIX新闻组中公布它。他只是在赫尔辛基技术大学的一台FTP服务器上发了一则消息,说用户可以下载Linux的公开版本。到1992年1月止,全世界大约只有100个左右的人在使用Linux。1993年,Linus的第一个“产品”版Linux1.0问世的时候,是按完全自由发行版权进行发行的。Linux与GPL的结合,使许多软件开发人员相信这是一个有前途的项目,开始参与内核的开发工作,并将GNU项目的C库、gcc、Emacs、bash等很快移植到Linux内核上来。商业软件公司的加盟也使大多数Linux的普通用户吃了定心丸。Linux从一开始就主要是在一些软件行业中的高手之间流行的,并且很快就在全球范围内集结了一大批职业的和业余的技术专家,形成了一个数量庞大而且非常热心的支持者群体。他们能够通过网络很快地响应使用者所遇到的任何问题。

1997年,Linux支持者群体在众多的软件公司中一举胜出,荣获了美国《InfoWorld》杂志的最佳技术支持奖,而这一奖项原本只是为商业公司而设立的。Linux核心的版本发展情况见表1.1。该表摘自参考文献[2],表中最后一项,程序行数(LinesofCode,LOC)包含了Linux可应用于如x86、PPC、SPARC等所有平台的程序代码。

表1.1Linux核心发展情况(截止1998年)年份

使用者数量

版本大小(LOC)199110.0110k

19921k0.9640k199320k0.99100k1994100k1.0170k1995500k1.2250k

19961.5M2.0400k19973.5M2.1800k19987.5M2.1.1101.5M当Linux走向成熟时,一些人开始建立软件包来简化新用户安装和使用Linux的方法。这些软件包称为Linux发布或Linux发行版本。在早期众多的Linux发行版本中,最有影响的要数Slackware发布。Linux文档项目(LDP)是围绕Slackware发布写成的。目前,RedHat发行版本的安装更容易,应用软件更多,已成为最流行的Linux发行版本,2000年秋天已经发行了7.0版本;而Caldera则致力于Linux的商业应用,它的发展速度也很快。中文化的Linux发行版本也有很多,国内自主建立的如BluePointLinux、FlagLinux、XtermLinux以及美国的XLinux、TurboLinux等。每种发行版本都有各自的优点和弱点,但它们都提供相对完整的应用软件及帮助文档,都使用相同的内核和开发工具,大家都使用同一个名称——Linux系统。1.6Linux的内核特征Linux操作系统的核心稳定而高效,以独占的方式执行最底层任务,保证其他程序的正常运行。它是整个系统的核心,具有独特的性质。本节试图从操作系统接口、功能及内核结构等几个方面来展示Linux核心的特征。1.6.1接口特色按照POSIX标准,一个可以运行UNIX程序的系统就是UNIX。Linux系统提供和一般UNIX系统相同的标准界面,包括程序级的和用户级的,因此也是一个UNIX系统,一般,大家称之为类UNIX系统,以区别于其他传统意义上的UNIX系统。在程序级,Linux系统提供标准的UNIX函数库,一个在Linux下开发的应用程序,可以几乎不经过任何改动就可以在其他UNIX系统下编译执行,完成同样的功能。Linux系统对用户同时提供图形和文本用户界面,文本界面是shell接口,图形界面是XWindow系统。UNIX下的基本命令,在Linux下功能和使用方式都完全相同。而最早在UNIX平台开发的图形用户界面XWindow系统,在Linux系统下运行良好并可以展示与其他版本UNIX系统下相同甚至更好的效果。更为可喜的是,在XWindow系统基础上,自由软件开发者们为Linux开发了不少种类的桌面系统,在这样的环境下,用户几乎可以不再需要传统的文本用户界面,所有的操作都可以通过鼠标点击来完成。这样的系统有方便快捷的KDE(KDesktopEnvironment),基于CORBA组件技术,具有图形功能的GNOME(GNU’sNetworkObjectModelEnvironment)等等,它们都遵循GPL,都处在高速发展阶段,相信他们的功能会更加完善。桌面系统的发展,基于桌面系统的办公、家用软件的发展,将会使Linux操作系统的用户界面更加友好,Linux系统针对办公用户及普通家庭的普及工作也将具有更明显的竞争力和更美好的前景。1.6.2功能特色Linux核心最早运行在Intel80386系列PC机上,现在,它也可以运行在Apple系列、DECAlpha系列、MIPS和Motorola68000系列的计算机上,同时,一些改进的嵌入式Linux核心还可以运行于手机、家电等设备上。从Linux2.0开始,它不仅支持单处理器的机器,还能支持对称多处理器(SMP)的机器,实现真正的多任务工作。Linux系统可以支持多种硬件设备。Linux系统下的驱动程序开发和Windows系统相比要简单得多。最初的硬件设备驱动程序,都是由自由软件开发者们提供的,随着Linux系统的普及,越来越多的硬件

厂商也开始提供设备驱动,这对于广大使用者无疑是又一个好消息。Linux采用多级分页的存储管理模式,具体的技术特征将在后面介绍。Linux自身使用的专用的文件系统为Ext2,可以提供方便有效的文件共享及保护机制。同时,它可以通过虚拟文件系统的技术,支持包括微软系列操作系统所使用的Fat16、Fat32和NTFS等文件系统在内的几十种现有的文件系统。Linux系统具有内置的TCP/IP协议栈,可以提供各种高效的网络功能,包括基本的进程间通讯、网络文件服务等。1.6.3结构特征Linux内核基本采用模块结构,单内核模式,这使得系统具有很高的运行效率,但系统的可扩展性及可移植性受到一定的影响。为了解决这个问题,Linux使用了附加模块技术。利用模块技术,可以方便地在内核中添加新的组件或卸载不再需要的内核组件,而且这种装载和卸载可以动态进行。内核模块的引入也带来了对系统性能、内存利用和系统稳定性的一些影响,可动态装卸的模块需要系统增加额外的资源来记录、管理,而装入的内核模块和其他内核部分一样,具有相同的访问权限,差的内核模块会导致系统不稳定甚至崩溃,一些恶意的内核模块可能对系统安全造成极大的威胁。总的来讲,Linux内核基本采用模块式结构构造,同时加入动态的模块技术,在追求系统整体效率的同时,实现了内核的动态可伸缩性。这样的结构,给系统移植带来一定的负面影响,但是,在广大自由软件爱好者们不懈的努力下,Linux系统仍然不断地推出支持新硬件平台的版本,Linux可以运行的硬件平台超过任何一种商业系统,具有较好的平台适应性。1.7Linux的发展及展望1.7.1开发模式自由软件的开发模式不同于以往任何一种软件开发模式。软件工程的发展,实现了软件的工程化生产——在经过详细的需求分析之后,进入设计阶段,然后是实现、测试等等,整个过程有严格的工作流程、时间限制和质量控制,程序员在整个生产过程中的作用,相当于传统工厂里流水线上的工人,只是按照“图纸”完成某个零部件加工而已,这样的开发模式强调的是统一规划,集中管理。一大批分布于世界各地的软件爱好者,以互联网为纽带,通过BBS、新闻组及电子邮件等现代通讯方式,同时参与一个软件开发项目。一个初步工作的软件雏形首先发布出来,然后大家同时开始工作,分别结合自己的实际经验和需要,寻找软件中的漏洞,提出改进意见,发布在互联网上,很快,另外的人也发现了漏洞,接着,有人又提出了改进方案,给出了补丁,经过这些人分头修整,这个软件好像滚雪球一样,以很快的速度不断完善。在这样的开发模式中,程序员是独立的实体,他们大多是用业余时间来为自由软件服务的,没有工作任务的压力,他们创作性工作带来的成就感是他们最大的动力。这样的开发模式称为“巴扎”(Bazaar)模式自由软件的出现,改变了传统的以公司为主体的封闭的软件开发模式。采用了开放和协作的开发模式,无偿提供源代码,容许任何人取得、修改和重新发布自由软件的源代码。这种开发模式激发了世界各地的软件开发人员的积极性和创造热情,大量软件开发人员投入到了自由软件的开发中。软件开发人员的集体智慧得到充分发挥,大大减少了不必要的重复劳动,并使自由软件的漏洞能得到及时发现和克服。任何一家公司都不可能投入如此强大的人力去开发和检验商品化软件。这种开发模式使自由软件具有强大的生命力。1.7.2内核版本为了确保看似无序的市集开发过程能够有序地进行,自由软件一般都必须采取强有力的版本控制措施。Linux内核采用的是双树系统。一棵树是稳定树,主要用于发行;另一棵树是非稳定树或者开发树,用于产品开发、改进。一些新特性、实验性改进等首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,就在稳定树中进行相同的改进。按照Linus的观点,一旦开发树经过了足够的发展,开发树就会成为新的稳定树,如此周而复始地进行下去。源代码版本序号的形式为x.y.z。对于稳定树来说,y是偶数;对于开发树来说,y是比相应稳定树大一的奇数。截止到2000年10月,最新的稳定内核版本号是2.4.test9。这种开发会比常规惯例要快,因为每一版本所包含的改变比以前更少了,内核开发人员只需花很短的时间就能够完成一个实验开发周期。当今,Linus率领分布在世界各地的Linux内核开发队伍正在完善他们的作品。Linux内核2.x版本充分显示了Linux开发队伍的非凡的创造力和市集开发模式的价值。Linux核心开发者的名单记录在文件/usr/src/linux/CREDITS中。事实上,UNIX开始发展时,也采用了类似的开发模式。这种开发模式使得UNIX的安全漏洞比其他操作系统解决得更彻底。从充分发挥开发人员的集体智慧这一点看,采用这种开发模式无疑是一大进步。1.7.3国内应用状况随着Linux核心的不断成熟,各种性能稳定、安装方便、支持多语种的发行版本被广泛地使用。Linux得到广大硬件、整机厂商和应用程序厂商的大力支持,这一切,都使得Linux这个年轻的系统充满了希望。由于多种原因,Linux在国内的推广比国外晚了几年,近年来有更多的软件爱好者开始了Linux的学习、应用和研究开发,同时,许多大学还把它作为操作系统课程实验的内容,这些都为Linux在中国的推广使用奠定了基础。Linux的使用开始于国内的高校和科研单位,最初大家在各地的电子公告牌上研论问题,随着讨论的深入,他们开始成立各种民间组织,建立自己的主服务器。爱好者们在这些地方,下载软件,自由地讨论Linux方面的问题,寻找志同道合者切磋,方便而高效地交流信息。这为Linux的进一步推广和本地化创造了良好的环境。目前国内较有影响的推广项目是1997年6月17日在国家经济信息中心网上建立的自由软件协会站点(图1.3),其网址是:/freesoft.html,这既是一个大型自由软件库,也是一个自由软件应用的示范项目。整个系统建立在Linux基础上,提供WWW、FTP、DNS、News和邮件服务,从开通到2000年12月,访问人数已超过70万人次。同时,国内也出现了多家Linux发行商,推出多种汉化的Linux版本,如BluePoint、XtermLinux、FlagLinux等等,同时也提供系统集成、技术支持等服务。总的来讲,国内Linux发展还处于一个比较低的层次,初级入门用户很多,实际应用用户少、而从事自由软件开发的人就更少了。1.7.4发展方向Linux内核本身的发展方向主要是硬件支持、嵌入系统和分布式系统这三个方面。提供更多高性能的硬件驱动程序,让更新、更好的硬件迅速在Linux系统下工作,是Linux普及和广泛应用的基础。随着以计算技术、通信技术为主体的信息技术的快速发展和Internet的广泛应用,嵌入式软件成为软件业的新热点。面对如此巨大的电子产品市场和潜在用户群,嵌入式软件的应用前景十分广阔,而Linux系统本身的开放特性以及稳定的性能,都比较适合作为开发嵌入系统的原型,国内外都有这样的研究项目,也有相当成功的事例。分布系统是当前操作系统发展的另一个重要领域。以Linux内核为基础,按照自由软件开发模式,发展高性能的自由分布操作系统,是操作系统发展的必然趋势。

此外,Linux上的桌面系统、应用软件,尤其是软件开发工具也是Linux发展的重要方面。桌面系统直接关系到Linux界面的友好性,易用性。应用软件关系到系统的可用性,而在自由软件开发模式当中引入软件工程新技术和成功经验,有助于快速开发Linux平台上的应用软件。1.8小结本章首先介绍了操作系统的一般概念及发展历史,接着介绍了操作系统的外部接口、管理功能及其内部结构,特别强调了计算机系统层次结构的概念。以此为基础,详细剖析了Linux系统的接口、功能和结构,包括Linux的发展及其开发模式。操作系统是计算机系统的基本系统软件,在整个计算机系统中处于核心地位,它是这样一些程序模块的集合——它们管理和控制计算机系统中的硬件和软件资源,合理地组织计算机工作流程,以便有效地利用这些资源为用户提供一个功能强大、使用方便和可扩展的工作环境,从而在计算机与用户之间起到接口作用。Linux是在日益普及的Internet上迅速形成和不断完善的操作系统。Linux操作系统高效、稳定,适应多种硬件平台,支持多种文件系统,它遵循GPL协议,整个系统的源代码可以自由获取,并且在GPL许可的范围内自由修改、传播,这就为学习、应用、开发操作系统及其他软件提供了良好的基础和较高的起点。学习操作系统一般概念和原理,对于理解、使用和管理Linux系统,开发应用软件以及系统软件,都具有相当重要的意义。习题1-1操作系统的基本功能有哪些?1-2从技术的角度讲,Linux是一个什么样的操作系统?你认为它有哪些不足?如何改进?1-3阅读通用许可证协议和参考文献[1]、[2],深入了解自由软件的“巴扎”开发模式,你愿意让大家共享你的软件吗?为什么?你认为“巴扎”模式有哪些优点?哪些缺点?缺点如何改进?1-4访问Linux核心代码站点

,了解Linux核心发展的最新进展及新增功能。1-5访问Internet,了解一个国内的自由软件项目,向大家介绍这个项目的管理及进展情况,给出你对该项目的评价及改进意见。第2章处理机管理2.1作业2.2进程2.3线程2.4小结习题提高处理机(CPU)的使用率,使它尽可能处于工作状态,是操作系统管理功能的主要目标之一。在Linux系统中,提高处理机使用率的技术措施主要是多道和分时,处理机在进程之间切换,按照一定的规则轮流执行每个进程。对于单个处理机的系统,这些进程宏观上看似并行执行,而微观上来看仍然是串行执行的,这种执行方式被称为并发执行。操作系统通过并发控制机制,对处理机进行分配、调度,在保证每个进程都得到公平合理执行的同时,使系统中的各种资源得到充分的使用。本章主要围绕处理机管理展开,着重介绍进程的概念,同时也包括相关的两个基本概念:作业和线程。2.1作业作业是用户向计算机系统提交一项工作的基本单位,是用户在一次事务处理或计算过程中要求计算机所做工作的总和。作业和程序是两个相互联系而又不同的概念。如果一次业务处理可以由某一个程序完成,就是说这个业务处理只要提交这一个程序就够了,这种情况下,这个程序就是一个作业。通常,完成一次业务需要由多个程序协同完成,这时,多个程序、这些程序需要的数据以及必要的作业说明一起构成一个作业。系统通过作业说明书或者作业控制语句(JCL)控制程序和相应的数据执行,完成整个业务处理。按照对作业的处理方式,可以分为联机、批处理等作业。Linux系统中的shell提供了操作系统和用户之间的联机命令接口。Linux的shell同时提供了程序级接口。用户通过提交一个命令或一个命令序列以批处理方式执行特定的操作(详见本书第2部分)。在Linux分时批处理系统中,也可以根据对作业执行时的响应特征分为前台作业和后台作业。在多用户系统中,多个用户、不同类型的作业可能同时请求执行,控制和管理这些作业,协调它们之间的关系,就是作业调度,作业调度是处理机调度的一部分。2.2进程计算机内存中同时存放多个相互独立的已经开始运行的程序实体,大家按照某种规则轮流使用处理器,这是现代多道操作系统实现资源共享,提高系统资源利用率的主要方式。描述这些程序实体的概念就是进程。在多道情况下,每个进程独立地拥有各种必要的资源,占有处理机,独立地运行。在多道系统中,同时存在多个进程,所以当某个进程进入等待状态时,操作系统将把处理机控制权拿过来并交给其他可以运行的进程。进程之间存在着相互制约、相互依赖的约束关系。一种最糟糕的情况是所有进程都拥有部分资源,同时在等待其他进程拥有的资源,这样,大家都无法运行,进入一种永久等待的状态,这种情况称为死锁,死锁是对系统资源极大的浪费,必须设法避免。本节着重讨论现代多道操作系统中的核心概念——进程,这是理解操作系统工作原理的基础和关键。首先介绍单个进程的状态、状态转换的条件和控制原语、进程在系统中的静态描述等,接着介绍多个进程之间的约束关系,由此引出进程间通信的概念,通信是协调、解决进程间约束关系的惟一手段,这种约束关系处理不当造成的最严重的后果就是死锁。2.2.1进程的概念进程(process)的概念最早出现在60年代中期,用于多道系统,在Linux系统中,进程也称为任务(task)。简单地讲,进程就是正在运行的程序,更为严谨的表达是,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。进程的概念对于理解操作系统有决定性的意义,而真正理解进程,必须了解它的基本性质。进程是操作系统分配资源和进行调度的独立单位,具有独立性。同时,具有动态性。多道系统中同时存在多个进程,这些进程拥有各自的资源,各自独立地执行,对于单处理机系统,进程宏观上同时运行而微观上是依次执行,这种情况称为并发执行。1.进程和程序进程和程序是一对相互联系的概念。程序是指令的有序集合,是一个静态的概念,描述完成某个功能的一个具体操作过程,而进程是程序针对某一组数据的一次执行过程,更强调动态特征。一个完整的进程,包括程序、执行程序所需要的数据,同时还必须包括记录进程状态的数据资料。在多道分时操作系统中,按照时间片轮流在各个进程间切换。对于单处理器系统,每一个时刻只能有一个进程在执行,当分配给该进程的时间片用完之后,不管该进程运行到什么程度,都必须立即停止,然后让出处理器资源,下一个进程进入执行状态。让出处理器的进程必须记录好正在运行的状态,包括寄存器、堆栈等各种信息,这些信息保证当处理器下次切换到这个进程的时候,进程能够正确地从上次执行到的位置继续往下执行。一个程序在处理相同或不同的操作数据时可以同时对应于多个进程。一个进程也可以包含多个程序,某个程序在运行过程中,可能同时会调用到多个其他程序,这些具有调用关系的多个程序共同构成一次完整的运行活动,即一个完整的进程。举一个直观的例子。我们在Linux系统下使用编辑器vi进行编辑,同时打开多个窗口,编辑多个不同名称的文件,vi编辑器是一个可执行程序,不同的文件就是不同的操作数据,而对应于这些文件同时打开的每一个编辑窗口就对应着一个进程,每一个进程都处于不同的状态。如果说程序是提供计算机操作的一组工作流程的话,进程就是具体的工作过程,按照同样的工作流程,针对不同的原料,可以同时开始多个工作过程,得到多种不同的成品。这种工作流程和工作过程的关系就可以类比为程序和进程的关系。2.进程和作业作业是用户向计算机系统提交一项工作的基本单位,是用户在一次事务处理或计算过程中要求计算机所做工作的总和。进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是操作系统分配资源和进行调度的基本单位。作业是描述用户向系统提交工作任务的实体单位,而进程是系统完成工作任务时程序执行的实体单位。从这个角度讲,他们处于不同的层次,作业描述用户和操作系统之间的任务委托关系,而进程描述操作系统内部任务的具体执行过程。一个用户的任务,即作业,由用户提交给系统,必须以进程的形式具体完成。对于批处理系统,通常,作业放在外存中专门的作业队列中等待进入内存执行,要经过一次宏观调度,由外存进入内存,以进程的形式运行。而对于UNIX/Linux这样的分时系统,没有宏观调度,作业不经过调度,直接进入内存,以进程的形式开始运行。任何一个进程,都存在于内存中,并且是已经开始运行的动态实体。2.2.2进程描述我们知道,进程是一个动态的概念,描述程序的一次运行活动。它存在于系统的内存中,是操作系统可感知、可控制的动态实体,是系统分配各种资源、进行调度的基本单位。1.进程控制块现在我们来讨论进程在内存中的静态存在方式。在多道系统中,处理机在多个进程之间来回切换,每个进程都会在暂停、运行这两种状态之间来回转换。当一个进程在处理机切换过来重新进入运行状态时,它必须严格精确地接着上次运行的位置继续进行,进程的静态描述可以保持切换现场,确保准确衔接,保证进程调度的实现,顺利完成程序所规定任务。进程切换现场称为进程上下文(context),包含了一个进程所具有的全部信息,一般包括:进程控制块(ProcessControlBlock,PCB)、有关程序段和相应的数据集,具体组成见图2.1。程序段是某个进程执行的相关指令集合,和静态的程序段有明确的对应关系,相应数据集是这个程序段正在操作的那部分数据,PCB是记录进程各种状态的数据体,PCB是操作系统管理感知、控制进程的数据实体,通过它,就可以找到进程的程序段和数据集,系统正是通过PCB来控制进程的。一般来讲,PCB记录着进程的所有资料,是全部或部分常驻内存的,PCB记录着程序段和数据集的地址指针,通过这些指针,就可以得到具体的指令和数据。PCB记录了进程的全部控制信息,一般较庞大而复杂,它可以按照功能大概分成四个组成部分:进程描述信息、进程控制信息、进程相关的资源信息和CPU现场保护结构(如图2.1)。图2.1进程描述数据关系示意图(进程上下文)2.Linux的PCBLinux系统的进程控制块PCB用一个称为task-struct的结构体来描述。(1)进程描述信息通过进程描述信息,Linux系统可以惟一地确定某一个进程的基本情况,可以了解该进程所属的用户及用户组等信息,同时还能确定这个进程与所有其他进程之间的关系。这些描述信息包括:进程号、用户和组标识以及描述进程家族关系的连接信息。①进程号(pid,processidentifier)Linux系统为每一个进程分配一个标识号,通过这个标识号识别、控制、调度这个进程,别的进程也通过这个标识号来识别这个进程并与之通信,用户也可以使用操作命令或系统调用通过标识号来控制该进程。②用户和组标识(userandgroupidentifier)Linux系统中有四类不同的用户和组标识,主要用来控制进程对系统文件的访问权限,实现系统资源的安全访问。

Linux使用组将文件和目录的访问特权授予一组用户,一个进程可以同时属于多个组,这些组都被放在进程的task-struct中的group数组中。③连接信息(Links)Linux系统中的进程之间形成树状的家族关系,连接信息记录某个进程的父进程、兄弟进程(具有相同父进程的进程)以及子进程的信息,描述一个进程在整个家族系统中的具体位置。(2)进程控制信息进程控制信息记录了进程的当前状态、调度信息、记时和时间信息以及进程间通信信息,是系统确定进程的状态、了解进程之间的关系、进行进程调度的主要依据。①进程当前状态进程的生命周期中,总是不停地在各种状态之间转换,有关进程的状态及转换规则,在下一小节讨论。②调度信息系统的调度程序利用这部分信息决定哪一个进程应该运行,包括优先级、实时优先级、计数器和调度策略。③记时信息包括时间和定时器,给出进程占有和利用CPU的情况,是调度的依据,也是进行统计、分析以及记费的依据。④通信信息多个进程之间通信的各种信息也记录在PCB中。Linux支持典型的UNIX进程间通信机制——信号、管道,也支持SystemⅤ通信机制——共享内存、信号量和消息队列。(3)进程资源信息Linux的PCB中包含大量的系统资源信息,这些信息记录了与该进程有关的存储器的各种地址和资料、文件系统以及打开文件的信息等等。通过这些资料,进程就可以得到运行需要的相关程序段以及必要的数据。(4)CPU现场信息进程的静态描述必须保证一个进程在获得处理机并重新进入运行状态时,能够精确地接着上次运行的位置继续进行。相关程序段和数据集以及处理机现场(或处理机状态)都必须保存。处理机(CPU)现场信息一般包括处理机的内部寄存器和堆栈等基本数据。task-struct是Linux系统的进程控制块(PCB),通过对PCB的操作,系统为进程分配资源并进行调度,最终完成进程的创建和撤销。系统利用PCB中的描述信息来标识一个进程,根据PCB中的调度信息决定该进程是否应该运行。如果这个进程要进入运行,首先根据其中的CPU现场信息来恢复运行现场,然后根据资源信息获取对应的程序段和数据集,接着上次的位置开始执行,同时通过PCB中的通信信息和其他进程协同工作。2.2.3进程状态及转换系统通过PCB对进程进行控制,进程不断地在不同的状态之间转换。1.进程的基本状态在分时系统中,一个进程拥有了所需要的全部资源,就可以开始执行,当分配的时间片结束,让出CPU资源,这种只要能够占有CPU就能进入执行的状态称为就绪状态。有时,多个进程之间互相制约,某个进程必须等到某个事件发生(才能够竞争CPU资源,这是等待状态,当等待的事件发生之后,这个进程被唤醒,由等待状态进入就绪状态,直到获得CPU才开始执行。等待状态、就绪状态和执行状态是一个进程所具有的最基本的三种状态,见图2.2。图2.2进程基本状态及转换示意图2.Linux系统进程状态Linux系统的2.2.16版本进程共有六种状态,包括运行状态、可中断等待状态、不可中断等待状态、僵死状态、暂停状态和交换状态,而在2.4.0版本中取消了交换状态,加入独占状态。表2.1Linux系统(2.2.X—2.4.X版本)进程状态表进程状态值说明TASK-RUNNING0运行态TASK-INTERRUPTIBLE1等待态,可中断TASK-UNINTERRUPTIBLE2等待态,不可中断TASK-ZOMBIE4僵死态TASK-STOPPED8暂停态TASK-SWAPPING16交换态(2.4.X版本已取消)TASK-EXCLUSIVE32独占态(1)运行状态(running)Linux系统中的运行状态实际包含了上述基本状态中的执行和就绪两种状态,进程到底是正在运行还是处于就绪状态准备运行,要靠当前是否占有CPU资源来区分。(2)等待状态Linux系统把基本的等待状态进一步细化为可中断的等待态和不可中断的等待态两种。处于这种状态的进程都在等待某个事件或某个资源,可中断等待状态的进程可以被信号唤醒而进入就绪状态等待调度,而不可中断等待状态的进程是因为硬件资源无法满足,不能被信号唤醒,必须等到所等待的资源得到之后由特定的方式唤醒。(3)僵死状态(zombie)由于某些原因进程被终止,这个进程所拥有的内存、文件等资源全部释放之后,还保存着PCB信息,这种占有PCB但已经无法运行的进程就处于僵死状态。(4)暂停状态处于暂停状态的进程,一般都是由运行状态转换而来,等待某种特殊处理。比如处于调试跟踪的程序,每执行到一个断点,就转入暂停状态,等待新的输入信号。(5)交换状态处于交换状态的进程正在执行内存、外存的交换工作。这个状态在2.2.X版本的内核中基本已经不使用,在2.4.X版本中没有这种状态。(6)独占状态它应该是等待状态的一种,处于独占状态的进程位于等待队列中,当等待的事件发生时,只有处于这种状态的进程被唤醒,其他处于可中断和不可中断等待状态的进程则继续等待。Linux2.4引入独占状态后,如果事件发生,只唤醒处于独占状态的那一个进程,这就可以大大提高Apache这类Web应用的效率,使Linux更适合网络服务器的角色。来看Linux系统进程的状态转换情况。采取一定的简化措施:按照进程是否占有处理机为依据,把进程的运行状态分为执行和就绪两种状态;等待状态统一考虑,不再区分是否可中断,独占状态也作为一种等待状态处理;不涉及交换状态。见图2.3。图2.3Linux系统进程状态及转换示意图图2.3同时也记录了一个进程在整个生命周期的变化过程。从图的左下方开始看,系统在某种特定的情况下,响应某个要求,首先分配各种资源,创建一个新的进程,进程进入就绪队列。所有的进程必须在就绪之后,才有资格竞争CPU,进入运行状态。这样,进程的整个生命周期中,大致的转换路径总是沿着三个闭合回路进行。就绪状态和执行状态形成第一个回路。进程进入就绪态,放入可执行队列等待,一旦被调度函数选中,就切换现场,进入运行状态,等自己的时间片耗尽之后,马上保护现场,让出CPU,转入就绪状态,等待新的调度。执行状态、等待状态和就绪状态形成第二个回路。处于执行状态的进程,有时需要等待某个事件或某种资源的发生,这时,继续占有CPU也无法开展工作,就转入等待状态,CPU由下一个被调度的进程占有。当等待进程所等待的事件发生后,等待进程被唤醒,进入就绪状态。执行状态、暂停状态和就绪状态构成第三个回路。当接收到某种特殊的信号,比如SIGSTOP(Linux的停止信号)时,处于执行状态的进程放弃CPU,保护现场之后,进入暂停状态,直到获得另外一个特殊的信号才进入就绪状态。一个处于执行状态的进程调用退出函数exit之后,进程就会进入僵死状态,这种状态下,进程释放了PCB之外的所有系统资源。也就是说,它在系统中只留下这个进程的一个PCB。僵死进程的父进程通过PCB了解到该进程所处的状态后,采取相应的处理措施,回收PCB,这个进程就完成了它的使命,从僵死走向彻底消亡,上图右上方的虚箭头表示了这种结局。2.2.4进程控制进程控制,是指对系统中的全部进程实施有效的管理,使得进程能够及时创建、撤销,正确地完成进程各状态之间的转换,使得多个进程高效率并发执行,达到系统资源高度共享的目的。进程状态之间的转换转换通常由三种不同的方式控制:进程控制原语、系统核心函数(比如调度)、和外部事件发生(比如中断)。这里说的所谓原语,指系统状态下执行的一些具有特定功能的程序段,这些程序段具有“原子性”,是执行过程中不可分割的最小单位。用于进程控制的原语有:创建原语、撤销原语、阻塞原语、唤醒原语等。(1)创建原语进程创建原语用于建立一个新的进程,这个新进程可以由内核调用进程创建原语建立,也可以由父进程执行进程创建原语生成一个子进程,子进程还可以生成子进程,以形成树形进程家族结构。进程创建原语的主要任务是形成进程的PCB,因此,调用者必须提供有关的参数,例如进程名、进程优先级、进程正文段起始地址、资源清单等。(2)撤销原语当一个进程完成了指定的任务或由于某种错误导致异常终止时,要撤销这个进程以便释放进程占用的资源。进程撤销原语根据调用者提供的信息,找到指定的进程,回收其占用的资源和PCB。(3)阻塞原语当正在运行的进程需要等待某一事件,由自己调用阻塞原语把自己阻塞起来成为等待状态。阻塞原语主要完成保护CPU现场的工作,即首先中断处理机保存该进程的CPU现场,然后把被阻塞的进程置为等待状态,插入到相应的等待队列,最后转入进程调度程序,从就绪队列中选择一个进程投入运行。(4)唤醒原语当处于等待状态的进程所等待的事件出现时,由发现者进程调用唤醒原语唤醒被阻塞的进程。进程控制原语由系统执行。同时,操作系统还提供了一些用于进程控制的系统调用和操作命令,用户可以通过程序或者命令的方式控制进程。2.2.5进程约束现代操作系统中,程序并发执行,多个进程各自独立地运行,同时竞争和共享系统中有限的资源,这种竞争与合作构成了系统进程之间的约束关系。每个进程独立地申请和释放系统资源,把申请某一类资源的进程称为该类资源的消费者,把释放同类资源的进程称为该类资源的生产者,就得到描述进程约束关系的一般模型:生产者-消费者问题,也称为有界缓冲区问题。比较简单的情况,两进程共享一个长度为N(N>0)的有界缓冲区,一个进程Pp往缓冲区中送数据,是生产者,另一个进程Pc从缓冲区中读取数据,是消费者,如图2.4,下面来讨论它们间的约束关系。图2.4简单的生产者-消费者问题首先,生产者进程Pp和消费者进程Pc共享同一个有界缓冲区,对这个缓冲区的操作必须是独占的。这种不允许多个并发进程交叉执行的资源称为临界资源,临界的程序段资源称为临界部分或临界区。临界资源是由于不同并发进程共享某个资源造成的,不可能通过增加资源的方法解决。这种因为共享某一公有资源而引起的在临界资源内不允许并发进程交叉执行的现象,称为进程间的间接约束。由于对临界资源的共享,而产生了临界区问题。对于有着临界区问题的并行进程之间必须互斥,以保证不会同时进入临界区。其次,对生产者进程Pp和消费者进程Pc访问共享有界缓冲区的顺序有严格的要求。具体来讲,这种限制为:(1)消费者进程Pc要接收数据时,有界缓冲区必须至少有一个单元是满的;(2)生产者进程Pp要发送数据时,有界缓冲区必须至少有一个单元是空的。这样存在一组相互独立的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程执行速度的过程,称为进程间的直接制约。存在直接制约关系,相互发送消息进行互相合作、互相等待,各自按照一定的速度向前推进的过程称为同步。消费者进程和生产者进程之间因为共享缓冲区,相互竞争而间接制约,具有互斥关系,同时相互以对方的运行结果为条件而直接制约,也具有同步的关系,是一对同时具有竞争和合作的进程。在并发系统中,进程之间相互制约,具有同步和互斥是相当普遍的现象。这种进程之间的相互关系,依靠单个进程自身的力量是无法解决的,必须以进程间的相互通信为基础,互相发送信息,才能协调解决。具体的同步、互斥实现方案有很多种,分别基于不同的通信方式。2.2.6进程通信进程间通信是协调解决多个进程之间的约束关系,实现进程共同进展的关键技术,是多道系统中控制进程并发执行必不可少的机制。进程间的通信有两种方式:一是互相发送少量的控制信息,一般只传递一个或者几个字节的数据,进程利用这些简单的信息,实现互斥和同步,控制运行速度,这种简单的通信方式被称为进程间的低级通信;另外一种方式称为进程间的高级通信,基本不涉及进程执行速度控制,用来在进程之间传递大量的信息,由于这种通信方式主要用于交换信息,因此,在开发本地进程间通信的同时,也为远程进程间的通信,和计算机网络的开发及控制奠定了基础。1.进程通信类型按照通信进程双方的地位,可以把进程通信分为:主从式、会话式、消息或邮箱机制以及共享存储区四种类型。(1)主从式主进程一方在整个通信过程中处于绝对的控制地位,它可以直接控制从进程的动作,自由地使用从进程的资源和数据。(2)会话式一方进程提供服务,另外一方进程在得到服务方的许可之后,可以使用其提供的服务。在通信过程中,双方的连接关系固定,客户进程提出服务请求,服务进程根据情况控制服务的状态和内容。(3)消息或邮箱机制通信双方具有平等的地位,和现实生活中的邮件类似。通信双方通过缓冲区或邮箱存放被传送的数据,不需要建立双方直接的连接关系。申请通信的发起方进程不管接收方进程的状态,把信息直接送入双方共享的缓冲区(或者邮箱)中,接收进程在合适的时机去读取缓冲区(或者邮箱)以接收信息。(4)共享存储区共享存储区通信方式中,通信双方进程共享内存中的一段存储空间,共同操作这个存储区,达到数据共享的目的。通信过程中,数据一直存放在共享存储区中,不需要移动,因此特别适用于大量数据的传递。2.Linux系统的进程通信Linux系统提供了多种通信机制,利用这些机制,可以方便地进行进程之间的相互协调,实现进程的互斥和同步。(1)信号(signal)信号属于Linux系统的低级通信,主要用于在进程之间传递控制信号。信号可以发给一个或多个进程,可以是由某个进程发出,也可以由键盘中断产生,还可以是由shell程序向其子进程发送任务控制命令时产生。进程在某些系统错误环境下也会有信号产生。除了两个信号外,进程可以忽略这些信号中的绝大部分,这两个信号是引起进程终止执行的SIGSTOP信号和引起进程退出的SIGKILL信号。至于其他信号,进程可以选择处理它们的具体方式。信号没有固有的相对优先级。并不是系统中每个进程都可以向所有其他进程发送信号,只有核心和超级用户具有此权限。普通进程只能向具有相同uid和gid的进程或者在同一进程组中的进程发送信号。信号是通过设置task-struct结构中signal域里的某一位来产生的。如果进程没有阻塞信号并且处于可中断的等待状态,则可以将其状态改成running,若确认进程还处在运行队列中,就可以通过信号唤醒它。(2)管道(pipe)管道是UNIX操作系统传统的进程通信技术。Linux管道通信包括无名管道和有名管道两种,通过文件系统来实现。管道也是一种特殊的文件类型,实际上是通过文件系统的高速缓冲实现的。两个进程通过管道进行通信时,两个进程分别进行读和写操作,都指向缓冲区中同样的物理单元,一个进程写入数据,另一个进程从缓冲区中读取数据,从而实现信息传递。管道方式只能按照先进先出方式单向传递信息。管道方式可以用来进行大规模的数据传递。(3)SYSTEMⅤ进程间通信信号量、消息队列和共享内存是UNIX/Linux系统常用的通信方式。消息队列用来在进程之间传递分类的格式化数据,共享内存方式可以使不同进程共同访问一块虚拟存储空间,通过对该存储区的共同操作来实现数据传递,信号量主要用于进程之间的同步控制,通常和共享内存共同使用。这三种方式在系统中是作为一个整体实现的。共享内存是这三种方式中通信效率最高的,它在进程的虚拟空间中进行,而且不需要数据的移动也可以实现大规模的数据传递。(4)套接字(socket)套接字是用来通过网络实现运行于不同计算机上的进程之间通信的机制。它可以实现数据的双向规模传递,是整个网络通信的基础。具体的原理和实现与网络协议等有关,不做具体的介绍。2.2.7死锁死锁,是指所有并发进程都拥有部分资源,同时都在等待其他进程拥有的资源,而且在得到对方资源之前不会释放自己占有的资源,所有进程都进入永久等待状态而无法运行的情况。死锁是并发进程约束关系处理不当造成的最严重的后果,是对系统资源极大的浪费,必须设法避免。死锁出现的根本原因是系统资源的有限性。并发进程竞争资源,调度不当,就可能出现死锁的情况,因此必须采取适当的措施来消除死锁。产生死锁的必要条件有四个:并发进程之间是互斥关系,每个进程必须独占某个系统资源;进程占有的资源在未结束使用之前,不能被强行剥夺,只能由该进程自己释放;进程需要的资源采用部分分配的方式,在等待新资源的同时,继续占有已分配的资源;各占有资源的进程形成环路,每一个进程已获得的资源同时被下一个进程请求。解决死锁的方案就是破坏死锁产生的必要条件。方法分为预防、回避、检测恢复三种。预防指采取某种策略,控制并发进程对资源的请求,保证死锁的四个必要条件在系统运行的任何时刻都无法满足。避免指系统采取某种算法,对资源使用情况进行预测,使资源分配尽可能合理,避免死锁的发生。这两种方法需要大量的系统开销,而且系统的资源也无法得到充分的利用。因此,一般系统都采取检测恢复的方法,这种方法是在死锁发生之后,根据系统情况,检测死锁发生的位置和原因,使用外力,重新分配资源,破坏死锁发生的条件,系统就可以从死锁状态恢复正常运行,这样的方法只要使用少量的系统资源,尤其是CPU时间就可以排除死锁。2.3线程多道处理系统中,进程是系统调度和资源分配的基本单位,计算机的CPU不停地在不同进程之间切换,进程切换现场称为进程上下文,每一次切换过程,系统都要对换出进程的上下文做详细记录,然后恢复换入进程的上下文。因此,系统的进程管理过程要耗费相当多的系统资源和CPU时间,尤其是对于需要频繁进程切换的任务。针对进程切换的时间和资源耗费问题,为了减少系统进程切换的时间,提高整个系统的效率,引入了线程的概念。2.3.1线程的概念线程是在一个进程内的基本调度单位。线程可以看作是一个执行流,拥有记录自己状态和运行现场的少量数据(栈段和上下文),但没有单独的代码段和数据段,而是与其他线程共享。多个线程共享一个进程内部的各种资源,分别按照不同的路径执行,同时线程也是一个基本调度单位,可以在一个进程内部进行线程切换,现场保护工作量小。一方面通过共享进程的基本资源而减轻系统开销,另一方面提高了现场切换的效率,因此,线程也被称为轻权进程或轻量级进程。许多流行的多任务操作系统基本都支持线程。按照系统的管理策略,线程可以分为用户级线程和系统级线程(内核级线程)两种基本类型。用户级线程指不需要内核支持,在用户程序中实现的线程都需要用户程序自己完成。系统级线程由内核完成线程的调度并提供相应的系统调用,用户程序可以通过这些接口函数对线程进行一定的控制和管理。用户级线程不需要额外的内核开销,一般只要提供一个线程库即可,剩下的工作就主要由用户自己负责了。但是由于用户级线程与系统内核无关,当一个进程因I/O而被调度程序切换为等待状态时,属于该进程的某个执行线程可能仍然处于执行状态。系统级线程的调度由内核完成,不需要更多用户干预,但要占用更多的系统开销,效率相对低一些。线程也是系统中动态变化的实体,它描述程序的运行活动,在内存中需要记录。线程的记录信息要保证系统能够准确地进行线程切换。在线程的生命周期里,线程作为一个基本的执行单位而存在,不断地在执行和停止的状态之间转换。线程的基本状态是执行、就绪和等待。线程的同步是一个相当关键的问题。线程之间的通信相对容易,而线程间的同步问题需要更仔细地对待,特别是用户级线程,这个问题相当突出。2.3.2线程和进程进程是操作系统资源分配和系统调度的基本单位,每一个进程都有自己独立的地址空间和各种资源,线程也是一种系统调度的基本单位,多个线程可以共享一个进程的资源,在存储方面,线程占用的资源更少。进程的调度主要由操作系统完成,而线程根据其类型的不同,可以由系统调度(内核级线程),也可以由用户进行调度(用户级线程)。进程调度的过程中要进行切换,切换现场的保护与恢复要求对进程上下文做完整的记录,要消耗一定的存储资源和处理机时间;线程共享进程的资源,可以在进程内部切换,不涉及资源保存和内存地址变换等操作,可以节约大量的空间和时间资源。因此,对于切换频繁的工作任务,多线程方式比多进程方式可以提供更高的响应速度。多个线程共享同一进程的资源,线程相互间通讯容易。而进程间通讯一般必须要通过系统提供的进程间通讯机制。进程和线程都是用来描述程序的运行活动,是存在于系统存储区中的动态实体,都有自己的状态,整个生命周期都在不同的状态之间切换。2.3.3Linux系统的线程Linux可以同时支持内核级线程(也称为系统级线程)和用户级线程。Linux的系统级线程在表示格式、管理调度等方面与进程没有严格的区分,都是当作进程来统一对待。Linux系统级线程和进程的区别主要在于资源管理方面,线程可以共享父进程的部分资源(执行上下文)。在Linux系统中,线程共享资源的类型是可以控制的,系统调用clone

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论