linux操作系统 第09章 操作系统接口

                                                                                   第9章  操作系统接口


( 好多人看这篇博客,应该是为了 9.1.2  操作系统的接口 那段描述吧,不知道是不是你们想要的答案 ... ... ) 

9.1  操作系统接口概述
9.1.1  作业与作业调度
  
按操作系统的术语,用户是以提交“作业”的形式来使用系统的。因此,操作系统的接口可以看作是用户提交作业的接口。

  1. 作业的概念
  
作业(job)是用户向计算机系统提交的一项工作。例如,用鼠标点击启动一个应用程序,或在Shell中输入一个命令行,都是在向系统提交一个作业。一个作业应当包括要执行的程序、要处理的数据以及执行的方式。例如,命令行ls -l /etc > abc这个作业告诉系统,执行ls程序,要处理的数据是/etc目录,执行方式是产生详细列表,存入abc文件中。

  作业与进程的概念密切相关,但也有区别。用户提交一个作业后,系统会建立进程来执行这个作业。通常一个作业对应一个进程,此时进程与作业可以看作是同一个事物。但有时一个作业可能对应多个进程,例如“ls -s | sort -nr | more”这个作业就同时启动了3个进程,分别执行ls、sort和more程序,它们协作完成作业规定的任务。此时的作业与进程就是不同的事物了,作业对应的是这些进程的整体。总之,作业是用户的观点,是用户向系统提交工作的实体单位。而进程是系统的观点,是系统完成工作时执行的实体单位。作业描述用户和操作系统之间的工作委托关系,而进程描述操作系统执行任务的过程。

  2. 作业调度
  
对于批处理系统来说,对CPU的调度分为两级,即作业调度和进程调度。作业调度是对CPU的宏观调度,即按照某种策略,选取合适的作业进入系统运行。进程调度则是对CPU的微观调度,即按照某种策略,选择合适的进程占用CPU运行。
  批处理系统中,作业是成批提交的。提交后的作业在外存中的作业队列中等待,经过作业调度程序进行调度,由外存进入内存,再以进程的形式运行。作业调度程序根据某种算法对作业进行选择,合理地搭配作业以使系统的资源利用率达到最高。因此,作业调度是宏观调度,即决定哪些作业可以进入系统。进入系统的作业宏观上处于运行状态,但微观上则是以进程的形式走走停停。

  对于Unix/Linux等交互式系统来说,并没有作业调度的概念。作业一旦被提交便立即进入内存开始运行。这意味着用户需要自己承担作业调度的任务。比如,不要同时启动多个需要竞争同一资源的作业(如多个网络应用)等。在作业的运行过程中,用户可以控制作业运行的方式,比如挂起一个作业、终止一个作业、将作业切换到后台或前台等。控制作业运行的方法见10.6.2小节。

9.1.2  操作系统的接口
  
操作系统接口的功能就是提供一个用户使用系统的界面。根据服务对象的不同,操作系统的接口可以划分为两类:一是供用户使用的用户级接口,二是供程序使用的程序级接口。(你们要的答案)

  1. 用户接口
  
用户接口就是操作系统向用户提供的使用界面。分为脱机接口与交互式接口两种。
  在批处理系统中,用户不能直接与系统交互,而是以提交作业的方式来脱机使用系统的。用户通过预先编写的作业控制语言来控制作业的运行,因此,批处理系统的用户接口就是作业控制语言。
  在交互式系统中,用户直接通过终端与系统交互。根据操作方式和表示形式的不同,交互式用户接口分为命令行用户接口和图形用户接口两种形式。

  1) 命令行用户接口
  命令行用户接口(Command Line Interface,CLI)是以命令方式使用系统的用户界面。操作系统提供给用户一组操作命令,用户在文本方式的界面上输入命令与系统交互,执行程序。命令执行的结果也以文本方式显示在界面上。
  命令接口的特点是执行效率高、灵活、可编程实现自动化,但不易使用。

  2) 图形用户接口
  图形用户接口(Graphical User Interface,GUI)是以鼠标驱动方式使用系统的用户界面。操作系统将用户可执行的操作以图形元素(窗口、图标、菜单、按钮等)的方式显示在图形界面上,用户通过点击鼠标或按键来操作界面上的图形元素,实现与系统的交互,运行程序。运行结果也以图形方式显示在界面上。
  图形界面具有很好的直观性,用户不必记忆复杂的命令和语法就可以轻松地使用系统。

  2. 程序接口
  程序级接口是为程序访问系统资源而提供的,它由一组系统调用组成。系统调用(System Call)可以看作是由操作系统内核提供的一组广义指令。程序员在设计程序时,凡涉及到系统资源访问的操作,如文件读/写、数据输入/输出、网络传输等,都必须通过系统调用来实现。所以说,系统调用是操作系统提供给应用程序的唯一接口。
  从层次上来看,用户接口属于高层接口,是用户与操作系统之间的接口。而程序接口则是低级接口,是任何核外程序(包括应用程序和系统程序)与操作系统内核之间的接口。用户接口的功能最终是通过程序接口来实现的。

9.1.3  Linux系统的接口
  Linux系统提供了命令行和图形两种用户接口以及程序接口。Linux的命令行接口是由命令解释程序Shell提供的文本方式的命令行用户界面。Linux的图形接口是基于X Window系统构建的窗口化图形用户界面。Linux的程序接口是由Linux内核提供的一组系统调用。以下各节分别介绍这3个接口的组成结构和原理。

  Linux系统接口的设计继承了Unix的设计哲学,即提供的是工具而非策略(tools, not policy)。这意味着接口不会试图去规定任务应该如何去完成,而是只给用户提供一些基本的工具,让用户自己决定如何去使用这些工具干自己的事情。Unix/Linux的用户“高手”与“新手”所采用的手法可能大相径庭。因此,学习使用Linux是一个持续深入的过程。


9.2  Shell命令接口
  Linux系统的命令行接口是由Shell提供的文本方式的界面,也称为Shell界面。与图形界面相比,Shell界面显得不够简单易用,但它的功能更强大,更成熟,也更可信赖。所以,无论是从事系统开发还是系统管理,Shell都是必然要用到的界面。
9.2.1  Shell界面的组成
  
Shell界面由一组命令和命令解释程序Shell组成。

  1. 命令
  Linux系统提供给用户一组完备的命令,这些命令可以完成用户需要的各种操作,如文件操作、数据传输、进程控制、系统监控管理等。所有命令都需由Shell程序解释执行,所以也称为Shell命令。
  Shell命令分为内部命令和外部命令两类。两者的区别在于,内部命令的实现代码是包含在Shell内部的,外部命令的实现代码是以可执行文件的形式存储在文件系统中的。

  2. 命令解释程序
  
Linux的命令解释程序称为Shell。Shell负责接收用户提交的命令行并解析命令行。如果是内部命令,Shell就调用该命令对应的函数并执行,然后返回;如果是外部命令,Shell就创建一个进程来执行它。

9.2.2  Shell的功能
  
Shell的功能包括以下几项:
  
1. 解析和执行命令
  
Shell的主要功能是在交互方式下解释和执行用户输入的命令。Shell首先从终端读取输入的命令行,然后解析出命令名、各个选项和参数。如果命令行中有特殊字符,如文件通配符、管道和重定向符、后台运行符等,Shell会对其进行相应的处理。处理完命令行后,Shell就启动命令运行,并将运行的结果显示在屏幕上。

  Shell提供了两种执行进程的方式,即前台运行和后台运行。前台进程就是在Shell所在的终端运行的进程。前台进程通过终端与用户交互,响应用户的输入,并向用户显示输出结果。后台进程是脱离了Shell所在的终端而默默地运行的进程。后台进程不与用户交互,常用于执行一些非交互的、耗时的任务。
  有关Shell命令的特殊字符和解析意义将在9.2节中进一步介绍。

  2. 配置命令的运行环境
  
Shell的另一项功能是定制运行环境。环境由一组环境变量组成,环境变量中记录了Shell运行时需要的一些信息,如命令的搜索路径、用户的主目录、系统的主机名、提示符、终端的类型等。它们的取值决定了Shell的具体行为。
  Shell启动时会自动执行一些配置文件建立起自己的环境。用户可以通过修改配置文件来设置适应于自己工作风格的环境。有关Shell的环境变量将在9.3节介绍,有关Shell的配置文件将在10.3节介绍。

  3. 提供内部命令
  
对于操作较为简单而又使用频繁的命令,如echo、cd、pwd等,可以在Shell程序中直接实现。这些由Shell自己实现的命令就是内部命令,其特点是不需创建进程,执行速度快。常用的Shell都提供有几十个内部命令。

  4. 支持Shell编程
  
Shell还能用作解释性的编程语言。用Shell语言编写的程序称为Shell程序(也称为Shell脚本),它是由一系列Shell命令组成的可执行文本文件。Shell提供了一些专用的命令和语法成分,如变量、条件测试、循环控制等,将它们与其他命令相结合即可构造出各种基本的程序结构和逻辑。
  Shell程序的运行方式与普通命令相同,可以看作是高级批处理命令。第9章将专门介绍Shell编程的基本方法。

9.2.3  Shell的版本
  
在Unix诞生之初,系统只配有一个命令解释器,用来解释和执行用户的命令。1979年,AT&T Bell实验室的S.R. Bourne开发出第一个Shell程序——Bourne Shell(程序名是bsh)。以后又陆续出现了由Berkeley大学的Bill Joy开发的C Shell(csh)和由AT&T Bell实验室David Korn开发的Korn Shell(ksh)。
  目前Shell的版本有很多种,基本上是以上3种Shell的扩展和结合。各种Shell虽然在基本功能上是相同的,但附加功能不同,语法风格各异,彼此不尽兼容。

  ● Bourne shell(bsh):最经典的Shell,几乎每种Unix/Linux上都可以使用,适于编程。
  ● C shell(csh):语法与C语言相似,但交互特性更好。
  ● Korn shell(ksh):集合了cshbsh的优点,符合POSIX标准。
  ● Enhanced C shell(tcsh)csh的扩展。
  ● Bourne Again shell(bash)bsh的扩展,同时结合了cshksh的优点。
  ● Public Domain Korn shell(pdksh)ksh的扩展。
  ● Z shell(zsh):结合了bashtcshksh的许多功能。

  Linux系统中默认使用的Shell是Bourne Again shell(bash)。bash是基于Bourne shell开发的GNU自由软件,它符合POSIX标准,且与Bourne shell完全兼容。bash还包含了很多C shell和Korn shell中的优点,如命令自动补齐、命令历史、别名扩展等,方便易用,在编程方面也十分出色。
  此外,Linux系统常用的Shell还有tcsh、zsh以及pdksh。要了解当前Linux系统中所有可用的Shell,可以查看/etc/shells文件。

9.2.4  Shell的工作流程与原理
  
Shell的运行方式有交互式和非交互式两种,在启动时可以用选项指定运行方式。交互式Shell解释执行用户输入的命令,非交互式Shell则专门执行某个或某些指定的命令,不与用户直接交互。本节介绍的是交互式Shell,它的基本工作流程如图8-1所示。从中可以理解Shell的运行机制和原理。

linux操作系统 第09章 操作系统接口_第1张图片 图8-1  Shell的基本工作流程

  1.  Shell的启动
  
从字符控制台登录后,Shell自动启动。这个在登录时启动的Shell称为登录Shell(login shell)。通常默认启动的登录Shell是bash,用户也可以指定其他Shell作为登录Shell。
  另一种方式是用命令启动Shell,即通过输入相应的命令来启动另外一个Shell。如:命令bash将启动一个bash进程,命令ksh将启动一个ksh进程。这些用Shell命令启动的Shell称为子Shell(subshell)。在图形界面中打开一个“终端”窗口时启动的Shell也是子Shell。同样,子Shell还可以启动它的子Shell。
  登录Shell与子Shell的主要区别在于它们的初始化和退出过程有所不同。

  2. 初始化
  
Shell启动后,首先要进行初始化,建立工作环境。登录Shell在初始化时要执行一系列的环境配置脚本文件,建立起完整的运行环境。所有子Shell都工作在登录Shell 所建立的环境之下,因此,子Shell启动时只需执行一个专门用于子Shell定制的脚本文件。
  初始化完成后, Shell显示命令提示符, 等待输入命令行。
  
3. 读取、解析命令行
  
当Shell从终端读入一个完整的命令行后,首先解析出命令名、选项和参数,然后对命令行中的特殊字符进行处理,如替换文件通配符、设置管道、重定向和后台进程等。

  4. 执行内部命令
  
当Shell解析出一条内部命令时,它就调用命令对应的内部函数运行,运行结束后返回,显示命令提示符,等待下一条输入命令。
  执行内部命令的方式是函数调用,也就是说内部命令是在Shell进程内部完成的,是Shell自身的一个操作。

  5. 执行外部命令
  
当Shell解析出一条外部命令时,下一步的任务就是启动那条命令并执行。Shell首先创建一个子进程,在子进程中查找到命令的执行文件,然后用其更换进程映像,运行该命令。此时,作为父进程的Shell有两种运行方式:
  (1) 如果命令是前台运行方式,则Shell将等待命令子进程的结束。子进程运行结束后用信号方式通知Shell并报告运行结果。Shell处理完子进程信号后,再转去接收下一条命令。
  (2) 如果命令是在后台运行的(命令行尾有&字符),则Shell不等待子进程结束,立刻显示命令提示符,准备接收下一条命令。
总之,执行外部命令的方式是为命令建立子进程,子进程与Shell父进程并发运行。

  6. 退出
  
当Shell接收到退出命令时则主动结束运行。Shell的退出有两种情况:如果当前Shell是登录Shell,则退出Shell将导致退出登录;如果当前Shell不是登录Shell,而是它的一个子Shell,则退出Shell就是结束这个子Shell进程,返回到上一级Shell。
  退出Shell的命令是exit,Ctrl+d键的作用与exit命令相同。此外,在登录Shell中也可以使用logout命令退出。

     9.3  X图形窗口接口
9.3.1  X Window系统概述
  
X Window(简称X或X11)系统是一个基于窗口的图形用户接口系统,1984年由麻省理工学院发布。设计X Window的目的是为Unix系统提供一个优秀的图形界面。如今X已成为Unix/Linux系统上的标准图形接口,并被广泛移植到各种操作系统上。
  X的当前版本是1987年发布的X11。目前广泛使用的是1994年5月发布的发行版本X11R6,最新的发行版本是2005年12月发布的X11R7。

  严格地说,X Window并不是一个图形接口软件,它是图形接口系统的标准体系框架。X规定了构成图形界面的显示架构、软件成分及运作协定。只要遵照X的规范开发出的图形界面都可称为X图形界面,即使它们在功能、外观和操作风格上可能差异巨大。
  X Window系统有以下特点:

  1. 独立于操作系统内核
  
X图形界面与系统内核不是集成在一起的,而是相互独立的。X系统也不与任何操作系统捆绑。在操作系统看来,它只是一个应用软件,可以被单独地安装、升级和卸载,无须重新启动系统。X系统也可以被单独地启动和停止,不会影响到其他应用程序的运行。
  
2. 基于网络运行
  
X系统采用“客户/服务器”(Client/Server)模式,基于网络运行。这种模式的独到之处是程序的运行与显示相分离,即在一台机器上运行而在另一台机器上显示。这使用户可以在网络上任意一台机器上运行程序,而将图形界面显示在自己面前的显示屏上。

  3. 高度的可定制性
  
X只为图形界面环境提供了基本的框架,许多开发商都提供符合X标准的软件构件,如X服务器、窗口管理器等。用户可根据需求选择合适的软件构造出个性化的窗口界面。这意味着选择的自由。因此,基于X的图形界面可以是各式各样的。
  
4. 高度的可移植性
  
基于X标准开发的应用程序与终端设备无关,可在任何支持X的终端上显示运行界面。

  5. 效率问题
  
X的主要问题在于效率。由于没有与操作系统内核整合在一起,使得基于X的图形界面不可能有很高的运行效率。这对于一般应用来说不是问题,但对于从事大型3D图形设计的系统来说则显得不足。在这类系统上应用的X系统通常是经过特殊优化的。

9.3.2  X系统的体系结构与工作原理
  
X系统采用了“客户/服务器”的体系结构。一个完整的X系统由3个部分组成:X服务器、X客户和X协议。X系统的体系结构如图8‑2所示。

linux操作系统 第09章 操作系统接口_第2张图片 图8‑2  X Window系统的体系结构

  1.  X服务器
  
X服务器(X Server)是构成X系统的核心成份。它是专门控制终端设备(显示器、键盘和鼠标)实现图形界面交互的软件。X服务器的主要功能如下:
  ● 控制对终端设备的输入/输出操作,维护字体、颜色等相关资源。
  ● 响应X客户程序的请求,完成在显示屏上绘制图形和文字的操作。
  ● 跟踪鼠标和键盘的输入事件,将输入事件和状态信息返回给X客户程序处理。
  总之,X服务器包揽了所有对该终端的操作,X客户只需关注要显示的内容和输入的事件,而不需要了解显示器等硬件的配备与操作细节。

  X系统支持多显示器结构,它允许系统配置多个物理显示器,而更多情况下是在一个物理显示器上模拟出多个虚拟显示器。当有多个显示器存在时,每个显示器都需要独立地运行一个X服务器。运行了X服务器的显示器称为X显示器,它们从0开始依次编号。当X客户需要显示界面时,只要指定X显示器的编号,它的界面就会出现在那个X显示器上。
  对于操作系统而言,X服务器只是一个运行级别较高的应用程序而已。可以像其他应用程序一样独立地安装、更换和升级。Linux系统常用的X服务器有XFree86、Xorg、MetroX,Accelerated-X等。其中,XFree86和Xorg是自由软件,MetroX和Accelerated-X是商用的。2003年之前,XFree86一直都是X的主流。从2004年开始,X.Org基金会开始在XFree86基础上主导开发了Xorg。Xorg遵照GPL许可,目前已经逐渐替代XFree86成为Linux主要发行版上的X服务器。MS Windows系统上的X服务器主要有X Win32和X Manager。

  2.  X客户
  
X客户(X Client)是一些需要在屏幕上显示图形界面的程序。在X系统中,这些程序无法直接在显示屏幕上显示界面,它们只能作为X服务器的客户,请求X服务器完成指定的操作。同样它也不能直接接受用户的输入,而只能通过X服务器获得键盘和鼠标的输入。在这里,X服务器是界面服务的提供者,X客户是界面服务的使用者,两者共同完成界面的交互操作:在向界面输出时,X客户决定要显示的内容,而X服务器完成实际的显示工作;在响应界面输入时,X服务器发现并通知输入事件,X客户处理输入事件。

  X客户多种多样,凡是带有图形界面的程序都是X客户。按功能可以把它们分为以下两类:
  ● X工具:用于支持界面运行环境的程序,如窗口管理器、显示管理器、桌面环境等。
  ●
X应用:用于实现某个应用目的程序,如xterm(虚拟终端)xclock(时钟)xcalc(计算器)xbiff(邮件到达提示)等。

  3.  X协议
  
X协议(X Protocol)是X客户与X服务器之间通信时所遵循的一套规则,它规定了通信双方交换信息的格式和顺序。X客户在向X服务器发送请求,以及X服务器向X客户返回输入事件等信息时,都需遵照X协议才能彼此理解和沟通。
  X协议运行在TCP/IP协议之上,X服务器默认使用TCP 6000端口监听X客户的请求。这意味着X客户和X服务器可以分别运行在网络上的不同计算机上。只要在用户所在的计算机上运行X服务器,则不论是在本地还是在远程计算机上运行X客户,都可以将它们的运行界面显示在用户面前的显示器上。在用户看来,它们没有区别,这就是X系统的网络透明性。

  在有些应用环境,X应用与显示相分离的特性十分有用。例如,在大型网络环境中,通常会设立一些维护良好的服务器系统,如大容量的档案服务器、高性能的应用服务器或配备有特殊软件工具的项目开发平台等。用户可以通过网络远程登录到这些服务器上,启动应用程序运行,并将界面调到自己面前显示。更方便的是,用户可以启动不同机器上的多个应用,将它们的窗口界面都同时显示在本地屏幕上。例如,图8-2中显示屏上显示的3个窗口可能分别来自本地与远程的不同系统。用户可以在这些来自不同系统的窗口之间随意地拷贝和粘贴数据,而完全不用关心底层发生的网络传输。这给用户带来许多操作上的便利和灵活。

9.3.3  X图形界面的组成
  
基于X的图形窗口界面由一个X服务器和各种X客户组成。由于X客户样式繁多,它们的各种搭配使得X Window系统的界面看起来多种多样,不拘一格。

  1. 简单图形界面
  
最简单的图形界面是由一个X服务器和一个X应用程序组成的界面。例如,图8-3就是由X服务器和一个xcalc应用构成的简单图形界面。
  在这种简单界面中,X应用直接向X服务器发送显示输出的请求,X服务器完成显示输出操作,并将鼠标和键盘的输入直接传递给X应用。它们之间的结构关系如图8-4所示。

linux操作系统 第09章 操作系统接口_第3张图片 图8‑3  xcalc的简单图形界面

linux操作系统 第09章 操作系统接口_第4张图片 图8‑4  简单图形界面的结构

  以xclac应用为例,它与X服务器的交互过程大致如下:xclac启动后,向X服务器发出一系列请求,在屏幕上绘出计算器图形。当鼠标点击计算器上的一个按钮时,X服务器将这一输入事件通知xcalc。xcalc请求X服务器用阴影显示该按钮凹下。当鼠标抬起时,X服务器通知xcalc,xcalc请求X服务器恢复该按钮的显示,同时保存按钮对应的字符并分析其含义。如果是数字就请求X服务器在计算器显示屏上显示这个数字;如果是等号“=”就开始计算,并将结果通过X服务器显示出来。

  这种简单图形界面的缺点是:X应用程序本身不具备管理自己的工作区域的能力,它无法移动、放大或缩小自己的界面。因此,当多个X应用同时运行时,它们的界面很可能会重叠在一起,无法使用。图8-5就是启动了xterm、xcalc、xclocks和xbiff四个应用的界面,由于初始位置和大小没有设定好,造成界面重叠,此时只有上面的界面可以正常工作。
  简单图形界面只在特殊情况下使用,比如测试X系统,或在速度很低的网络上远程执行单个应用。

linux操作系统 第09章 操作系统接口_第5张图片 图8‑5  启动多个X应用的简单图形界面

  2. 窗口化图形界面
  
当有多个程序需要同时显示在同一显示屏上时,需要采用窗口机制来管理应用程序的界面。窗口(window)是应用程序与用户交互的可管理的图形化区域。每个窗口都有一个窗口框架,框架由边框、标题栏、控制按钮和控制菜单等元素组成。利用这些元素可以调整窗口尺寸、移动、缩放或关闭窗口。窗口之间可以层次叠放,共享屏幕资源。
  X采用了树型结构来组织各个窗口。背景窗口称为根窗口(root window),所有的应用程序的窗口都是显示在根窗口上,称为子窗口。各应用程序只能工作在自己的窗口范围内,即只能响应来自自己窗口区域的输入事件,也只能向自己的窗口区域输出信息。

  与MS Windows系统不同,在X系统中,X应用程序并不自己实现窗口管理功能。也就是说,应用程序中没有用于显示窗口框架的代码,也没有处理窗口控制事件(缩放、移动、关闭等)的代码。所有应用程序的窗口绘制和窗口控制操作都统一由另一个程序来完成,这个程序就是窗口管理器。

  窗口管理器(Window Manager)是管理窗口的一个X工具软件,负责窗口的建立、删除、层叠、拖动、更改尺寸等工作。当一个应用程序启动时,窗口管理器负责为它的显示区域加上窗口框架。当鼠标点击框架上的控制按钮时,窗口管理器会收到输入事件并进行相应的处理。比如点击了最小化按钮时,窗口管理器就负责把这个窗口隐藏起来,显示它的最小化图标。当点击关闭窗口的按钮时,窗口管理器就会通知那个应用程序退出。图8-6所示是启动了窗口管理器后的界面。显示的还是那4个X应用,但它们的界面已经是窗口化的了。

linux操作系统 第09章 操作系统接口_第6张图片 图8‑6  有窗口管理器的图形界面

  将应用的界面操作与窗口管理操作相分离,这是X的优秀设计思想。这意味着即使一个程序挂起了,它的窗口仍然是可以移动的,可以被最小化和关闭。如果因错误导致X应用崩溃了,它也不会占据着屏幕无法退出,因为窗口管理器总是可以关掉它。
  图8-7是窗口化图形界面的组成和结构关系。

图8‑7  窗口化图形界面的结构

  窗口管理器工作在根窗口,因此当窗口管理器运行时,它将截获所有来自X服务器的输入事件。此时,X应用并不直接与X服务器通信,而是通过窗口管理器中转。当输入事件针对窗口管理器时,比如点击或拖动某应用的窗口框架,或点击空白背景处时,它们会被窗口管理器拦截并进行处理,如移动、关闭窗口、显示窗口管理器菜单等。而当输入事件针对应用时,比如点击计算器的按钮处,则它们会被窗口管理器传递给应用程序进行处理。

  窗口管理器定义了窗口的一致外观与行为,不论是来自哪个系统的应用,其窗口都由窗口管理器统一装饰和指挥。但不同的窗口管理器具有不同的窗口样式和操作风格,通过选用不同的窗口管理器,可以定义出个性化的窗口环境。流行的窗口管理器有twm、kwm、fvwm、WindowMaker、enlightenment、sawmill、sawfish、metacity等。twm是经典的窗口管理器,在几乎所有系统上都可找到。其特点是简陋但很小巧。图8-6就是twm的窗口风格。
  窗口图形界面是应用开发者和系统管理员常用的图形界面形式,经常用于访问远程X应用程序。例如,X应用的开发者在远程的开发平台上调试程序,而在本地观察运行结果。对于普通用户来说,直接使用这样的界面并不方便。

  3. 桌面环境
  
桌面(Desktop)是一个集成的图形化工作环境,通过在屏幕上放置的图标、窗口、菜单、面板等图形元素来模仿人们的日常办公桌面。桌面为普通用户提供了一个更直观、更方便的方式来使用计算机,其设计充分考虑了易用性。用户不需学习任何命令,只需用鼠标点击图标即可完成启动应用、配置系统、管理文件等日常操作。
  桌面启动后的界面如图8-10所示。
  桌面环境是一整套X工具软件的集合,包括窗口管理器、桌面控制程序、文件管理程序和一些工具软件。它们之间的结构关系如图8-8所示。

linux操作系统 第09章 操作系统接口_第7张图片 图8-8  桌面系统图形界面的结构

  通常,桌面系统都配套了一组实用工具软件,主要的一个工具软件是图形化的文件管理器,它使用户可以轻松地进行文件管理操作。另一个重要工具是控制面板,它用于容纳常用的工具和操作,方便用户执行各种任务。此外还有一些图形化的系统管理和配置工具。这些工具软件与应用软件的界面都受窗口管理器的管理,而它们的启动和在桌面上的配置则受桌面控制系统的控制。
  桌面系统通常在系统本地使用,在高速局域网环境下也可以使用远程桌面。
  Linux上流行的桌面环境是GNOME和KDE,将在
9.3.5小节中做简单介绍。

  4. 显示管理器
  
桌面系统的使用非常方便,但手工启动桌面系统的过程却比较麻烦。用户需要先在字符控制台下登录,输入相应命令在另一个图形控制台上启动X和桌面系统,然后再切换到该桌面上工作。为方便用户使用图形界面,Linux系统普遍采用了一种显示管理技术,即通过一个专门的显示管理器程序来管理图形终端,使用户可以直接在图形终端登录系统,进入桌面环境工作。

  显示管理器(Display Manager)是一个管理X显示器的软件,它负责为用户提供一个完整的X会话周期,即从用户登录进入系统直到退出系统的整个过程都是在X显示器中完成的。显示管理器在系统启动时就开始运行,它首先在图形终端上启动X系统,也就是说建立一个可用的X显示器,然后显示一个图形化的登录界面。用户在此界面登录后,它按照配置文件的设置启动一个图形用户界面(默认的配置是启动一个桌面系统)。当用户从界面退出后,它再重新启动登录界面,等待用户的下一次登录。

  系统启动时,默认在7号控制台启动一个显示管理器。常用的显示管理器有xdm、kdm和gdm。kdm用于登录进入KDE桌面,gdm用于登录进入GNOME桌面,xdm按配置文件启动设定的图形界面,常用于提供远程X终端的显示管理。图8-9所示是在fedora9上启动了gdm后显示出的图形登录界面。

linux操作系统 第09章 操作系统接口_第8张图片 图8-9  fedora9 gdm的图形登录界面

9.3.4  X系统的启动与停止
  
启动X Window系统的方法很多,从手动到自动,适合不同人的不同需要。归纳起来有如下几种:
  
1. 手工启动X系统
  
有些情况下需要手工启动X系统,即用命令的方式启动X系统。比如,系统启动时未启动X系统(用作服务器的系统通常如此),或需要访问某个远程X应用。用这种方式启动的界面精简而高效,但需要对X系统有较深入的了解。
  启动操作包括启动X服务器和X客户两部分。X服务器要先于X客户启动。

  1) 启动X服务器
  启动X服务器的命令是:(X [:显示器号])
  其中,显示器号是指定X服务器要控制的显示器编号,缺省时为0。
  例如:X :1&命令将启动一个X服务器,管理1号显示器。用“&”将命令置为后台运行是为了立即返回Shell,执行其他命令。

  Linux系统的7~12号虚拟控制台都是图形终端,用户可以根据需要启动多个X显示器,它们按启动顺序依次占用第7~12号虚拟控制台。即,第一个启动的X显示器占用7号控制台,第二个启动的X显示器则占用8号控制台,…。假设在执行X :1&命令前系统已在7号控制台上默认启动了一个0号显示器,则此命令启动的1号显示器将占用8号控制台。用切换键Ctrl+Alt+F8切换到该控制台就可看到一个带有鼠标指针的黑色根窗口。
  在其他系统上启动X服务器的方法见相应的软件说明。

  2) 启动X客户程序
  手工启动X客户程序的方法是在Shell下输入命令,命令名就是X客户程序的名称。命令除了程序本身定义的选项外,还有两个对几乎所有的X应用都有效的通用选项,即-geometry和-display选项。启动X应用的命令格式如下:
  命令名 [选项] [-geometry选项] [-display选项]
  【-display选项】格式:-display [主机]:显示号[.屏幕号]

  指定显示窗口要输出到哪个显示器,即连接到哪个X服务器。其中,主机是显示器所在的计算机的主机名或IP地址,缺省时表示是本机。显示器号是指要使用的X显示器的编号,屏幕号仅对多屏显示器有效,一般省略。另外,若在Shell的环境变量$DISPLAY中设置了-display的缺省值,则在命令行中可省略此选项。否则此选项不可缺省。
  【-geometry选项】格式:-geometry 宽x高+/-X偏移量+/-Y偏移量

  指定显示界面的大小和位置,以像素为单位,也可简写为-g选项。宽x高定义窗口的大小,缺省时采用应用程序定义的默认大小。X偏移量和Y偏移量定义窗口相对屏幕的位置。<+X偏移量,+Y偏移量>表示以左上角为参照点的位置,即窗口的左上角相对屏幕左上角向右向下的偏移。<+X偏移量,-Y偏移量>、<-X偏移量,+Y偏移量>、<-X偏移量,-Y偏移量>分别表示以左下角、右上角、右下角为参照点的位置。缺省的位置为<+0,+0>,即窗口左上角位于屏幕的左上角坐标。

  例如:
  ①  xterm -display :1   启动xterm,在本机的X显示器1上显示。
  ②  xcalc -display :0   启动xcalc,在本机的X显示器0上显示。
  ③  xterm -display 192.16
9.0.1:0 启动xterm,在192.169.0.1主机的X
                 显示器0上显示。
  ④  xcalc -g +30+30 -display :1  启动xcalc,在本机的X显示器1
                 <+30, +30>处显示。
  ⑤  xclock -g -10+10 -display :1 启动xclock,在本机的X显示器1 <
                -10, +10>处显示。
  ⑥  xbiff -g 50 × 50 -display :1 启动xbiff,在本机的X显示器1上
                 显示,大小为50 × 50。
  图8-3所示是执行命令②后的界面显示,图8-5所示是顺序执行命令①④⑤⑥后的界面显示。

  3) 启动窗口管理器
  用窗口管理器的命令名,按启动X客户的方法启动窗口管理器。如:
  ①  twm -display :1&   在X显示器1上启动twm窗口管
             理器。
  ②  mwm -display :0&   在X显示器0上启动mwm窗口
             管理器。
  图8-6所示是在图8-5的界面上又执行了命令①后的界面。
  要停止用手工方法启动的X系统,则结束对应的X进程即可。

  2. 用xinit命令启动X系统
  
如果是在本机运行X服务器和X客户,使用xinit命令和startx命令可以简化手工启动的过程。
  1)  xinit命令
  xinit命令用于控制本机上的X系统的启动过程,它按命令行参数的设定,启动指定的X服务器和X客户程序。xinit命令的格式是:
  xinit [-X客户启动命令][--X服务器启动命令]
  例如:xinit -xterm -display :1 -- X :1
  该命令将在显示器1启动一个xterm界面。

  如果没有指定X服务器参数,xinit将用~/.xserverrc文件中的命令来启动X服务器,如果也没有这个文件,则xinit将缺省地用X:0启动X服务器;如果没有指定X客户参数,xinit将用~/.xinitrc文件中的命令来启动X客户程序,如果也没有这个文件,xinit将缺省地用xterm -display :0启动一个xterm。所以,如果用户未建立这两个文件,则不带参数的xinit命令等同于xinit -xterm -display :0 -- X :0,即在显示器0启动一个类似图8-3所示的简单界面。
  如果用户希望xinit启动一个预先定制好的图形界面,可以编辑xinit的脚本文件,指定要启动的应用程序和窗口管理器,并设计好初始布局。下面是.xinitrc文件的一个样本:

  xsetroot -solid gray -display :0 &       #设置根窗口背景为实底灰色
  xclock -g 100×100-0+0 -display :0 &
  xbiff -g 50×50-0+130 -display :0 &
  xcalc -g 200×250-0-0 -display :0 &
  xterm -fn 8×16 -g 80×22+0+0 -display :0 &  #选用8×16字体
  twm -display :0
  
有了这个文件,当执行xinit时就会在显示器0上启动如图8-6所示的X界面。当X客户结束时(如点击twm菜单中的exit),X服务器也会随之关闭。

  2)  startx命令
  对于运行单一会话的X系统,startx提供了更为良好的用户接口。startx是一个脚本命令(即Shell程序),它负责读取和处理一系列配置文件,为xinit设置执行参数,然后调用xinit命令启动预定的图形界面。使用startx配置界面比直接使用xinit命令更方便也更容易,往往用于配置较复杂的图形界面,如系统提供的桌面或用户自定义的桌面等。

  startx首先在用户主目录下找.xinitrc及.xserverrc脚本文件。如果用户定义了这两个文件,则执行startx与执行xinit效果是一样的。若未找到用户的配置文件,startx就使用系统配置文件,即/etc/X11/xinit目录下的xinitrc和xserverrc文件。这两个文件指定了构成界面的各项规格和要素。通常系统的默认配置是启动桌面环境(在Fedora中,启动的是GNOME桌面)。这是启动桌面最简单的方法。启动后的界面如图8-10所示。
  按Ctrl+Alt+Backspace键或退出桌面后X即停止。

linux操作系统 第09章 操作系统接口_第9张图片 图8-10  GNOME桌面

  3. 用显示管理器启动
  
显示管理器可用命令xdm、kdm、或gdm(需要root权限)启动。默认在显示器0显示登录界面。按Ctrl+Alt+Backspace或退出桌面后回到登录界面。
  如果系统默认的运行级别是模式5(关于系统运行级别的定义见10.2.1小节),则系统在启动时就会自动在显示器0运行显示管理器,显示图形登录界面。在Fedora系统上默认启动的是gdm。

9.3.5  Linux桌面系统简介
  
目前Linux系统最流行的桌面系统是GNOME和KDE。它们包含用户日常应用所需要的应用程序,如Web浏览器、电子邮件客户端、办公套件、图形图像处理软件等。图形桌面旨在为Linux用户提供一个完美易用的图形化操作环境。

  KDE(Kool Desktop Environment)拥有华丽的界面和丰富的功能,使用习惯也与Windows较类似。与GNOME相比,KDE集成了更多的应用程序和设置桌面的工具,但KDE使用的底层开发库QT不是按GPL所许可方式发布的。GNOME(GNU Network Object Model Environment)提供了相对简单、高效的桌面体验,运行速度更快。另外,GNOME是完全自由的软件,因而获得了更多的商业支持和社区开发者的支持。目前,这两大平台已经实现高度的互操作性,应用程序可以完全共享。两者在功能上和外观上均已达到足够完美的境地。
  由于桌面系统的设计十分人性化,用户无需特别学习就可以直接使用。在此只对GNOME桌面系统作一简单的介绍。

  1.  GNOME概况
  
1999年,墨西哥程序员Miguel de Icaza率领众多开发者共同开发出了Linux下的桌面系统“GNOME 1.0”。GNOME是GNU计划的一部分,它的目标是让每一个普通用户都能轻松地使用Linux系统。
  GNOME遵照GPL许可发行,是完全自由的软件。 正因为如此, GNOME得到了Red Hat的大力支持,成为Red Hat等许多Linux发行版的默认安装的桌面。

  2.  GNOME桌面系统的构成
  
GNOME桌面系统由背景桌面区域、窗口管理器、控制面板、文件管理器和应用软件等元素构成,如图8-10所示。
  1)  GNOME桌面区域
  桌面是用户可使用的屏幕区域,用于放置应用程序的图标和运行程序的窗口。这个区域可能比屏幕上显示的区域大,称为虚拟桌面。在缺省情况下,GNOME虚拟桌面划分为4个桌面区域,称为工作区。工作区之间可以快速切换。

  桌面区域的组成元素包括:
  (1) 桌面背景:在X根窗口(布满屏幕的窗口)上显示的背景图片。
  (2) 桌面菜单:用于配置桌面区域的菜单,右键单击桌面时调出。
  (3) 桌面图标:用于启动应用程序的启动器(animation),双击图标时启动应用。
  (4) 窗口:正在运行的应用程序的显示窗口。

  2) 窗口管理器
  运行中的X程序都受窗口管理器的统一控制,在桌面显示它们的窗口界面。与KDE不同的是,GNOME未与窗口管理器绑定。新版本的GNOME默认使用metacity窗口管理器,其风格以简洁为主,如图8-10所示。也可配置GNOME使用其他的窗口管理器,如sawmill,sawfish,englightenment等。

  3) 文件管理器
  图形化文件管理器Nautilus提供了系统和个人文件的图形化显示。然而,Nautilus不仅仅可以浏览文件,它还可配置系统、浏览影集、启动应用、访问网络等。总之,Nautilus可看作是整个桌面的“外壳”(Shell),相当于Windows系统中的资源管理器Explorer。
  点击桌面上的“计算机”或“主文件夹”图标都可以启动Nautilus。图8-10中后面的窗口就是Nautilus的显示窗口。

  4)  GNOME面板
  GNOME面板(Gnome Panel)是GNOME的控制中心,通常位于屏幕底部,或分为两部分分别置于屏幕上方和下方,样式如图8-11所示。
  GNOME面板程序是一个X客户程序,用于启动应用程序和嵌入的小程序、显示正在运行的程序和切换工作区。面板上放置了一些图标,它们是面板的控制对象,单击图标即可执行其对应的操作。面板上的元素是可配置的,用右键单击面板空白处即可调出面板菜单,然后根据需要配置面板,如向面板中添加、移动和删除对象等。

linux操作系统 第09章 操作系统接口_第10张图片 图8-11  GNOME面板

  面板上主要包含以下几类对象:
  (1) 主菜单:8-11中图标①是主菜单。从主菜单中可以访问几乎全部的应用和工具。
  (2) 启动器:启动器用于启动应用程序。与桌面上的启动器的不同之处在于,面板上的启动器只需单击即可快速启动。因此,用户可以将一些常用的应用启动器添加到面板中。
图8-11中图标
和③都是启动器,分别用于启动WEB浏览器和电子邮件。

  (3) 小程序:小应用程序(applet)与一般的应用程序不同,它不能独立地运行,而是需要运行在某个软件“容器”中。GNOME小应用程序是可嵌入GNOME面板中运行的小工具,用于执行一些简单实用的功能。
  图8-11中的面板上放置了如下几个小程序:
  上面板中,图标
是便签,⑥是字典,⑦是语言切换器,是网络管理器,是时钟,是音量控制器。下面板中,图标用于显示桌面,点击即可隐藏/恢复遮盖桌面的窗口。图标和是任务列表,它们列出每个正在运行的程序,点击即可切换当前显示窗口。图标是工作区切换器,它包含了4个工作区。点击即可切换当前工作区。

  从网络上还可以获取更多实用的GNOME小程序,如气象预报、股市信息、CD播放、CPU频率调节、电池监视等。
  (4) 抽屉:抽屉是面板的扩展,以容纳更多的面板对象。⑤是一个抽屉的图标,点击可以打开和关闭抽屉。
  (5) 按钮:按钮是一些用于执行系统控制操作的图标。是屏幕锁定按钮,是注销按钮,是关机按钮。

  5)  GNOME应用软件
  GNOME集成了一套功能完善、运行稳定的实用工具和应用程序,用户还可以选择安装其他应用。GNOME下常用的工具和软件有:
  ●  OpenOffice.org:办公软件,兼容Windows Office文件格式。
  ●  Evolution:电子邮件客户软件,具备灵活的日历(调度器)功能。
  ●  Firefox:WEB浏览器,各Linux发行版默认安装。
  ● Gimp:图像编辑器,GNU的“PhotoShop”。
  ●  Gaim:即时通讯软件,支持多种流行通讯,如MSN、Yahoo Messenger、ICQ等。
  ●  Totem:视频播放器,支持网络视频播放。

      9.4  系统调用接口
  系统调用是操作系统的程序接口。从某种意义上来说,系统调用定义了操作系统的原始功能,而用户界面都是对系统调用接口的包装。所以,要想深入了解一个操作系统的操作特性,就要熟悉该系统提供的各种系统调用,这是一个系统程序员的必备条件。

9.4.1  系统调用接口概述
  
操作系统的内核进程需要访问核心数据结构和硬件资源,所以它们运行在核心态。用户级的进程包括Shell,vi,X Window等,它们都只能在用户态下运行。这种限制保护了系统不会受到来自用户进程的有意或无意的破坏。
  但是很多情况下,用户进程也需要执行一些涉及系统资源的操作,比如打开、关闭或读/写文件,进行I/O传输等操作。这些操作是无法在用户态下完成的,因此需要进行状态的切换。当用户进程需要完成核心态后才能完成的某些功能时,必须按照内核提供的一个接口进入内核,然后调用内核函数完成所需的功能。这些供用户进程调用的内核函数就是系统调用。

  打个比方,就像在图书馆中,读者可以自由地检索目录、阅读开架图书、复印资料等。但他们无法直接去书库取书,也无权修改图书馆的借书登记和图书管理资料。当他们想借出图书时,只能填写借书单,到指定的借阅柜台,将借书单提交给图书管理人员,由他们来完成登记和取书工作。从行为模式上看,图书管理人员工作在特权状态,他们有权访问和修改图书馆的各种资源。而读者工作在非特权状态,只能在有限的权利和范围内活动。他们之间的接口只有借阅台。

  使用系统调用来访问系统资源的主要目的是为了保护系统资源和内核的安全,以及提高资源利用率。系统调用的另一个作用是方便用户使用,使用户不必了解操作系统的内部结构和有关硬件的细节问题。就像读者在借书时只需提供一个索书号,而不必了解目前书库的具体布局以及图书的具体摆放位置一样。

9.4.2  Linux系统调用接口的组成
  
Linux系统调用接口的组成和结构如图8-12所示。

linux操作系统 第09章 操作系统接口_第11张图片 图8‑12  Linux系统调用接口示意图

  1. 系统调用服务例程
  
Linux内核提供了一组用于实现各种系统功能的内核函数,称为系统调用服务例程(syscall routine)。这些内核函数在形式上与普通C函数相同,调用格式也基本相同。主要区别在于它们运行在核心态,而普通C函数运行在用户态。通过系统调用进程可由用户态转入核心态,在核心态下完成一定的操作后再返回用户态。
  Linux的每个系统调用服务例程都有一个编号,同时在内核中保存了一张系统调用表,该表中保存了系统调用编号和其对应服务例程。

  2. 系统调用总控程序
  
系统调用总控程序(system_call)是操作系统提供给应用程序的一个特殊接口,特殊之处在于它是利用软中断方式陷入内核的入口。执行系统调用的进程先将参数值填入寄存器,然后执行一个特殊的陷入指令(对i386体系结构的CPU来说,就是执行一个INT 0x80软中断指令),这个指令会产生一个“系统调用”中断,使控制跳转到内核的系统调用中断总控程序的入口,同时将CPU切换到核心态。

  系统调用总控程序负责将系统调用派发到它们各自的服务例程。进程在执行陷入指令前已把系统调用号装入寄存器,这样当系统调用总控程序运行时就可以得到系统调用号,用这个号码在系统调用表中查找相应的服务例程,然后调用它执行。
  除了需要传递系统调用号以外,许多系统调用还需要传递一些参数到内核(如文件描述符、要写入的内容和写入字节数等),Linux采用CPU寄存器来传递这些参数。system_call运行时会把这些寄存器的值保存在内核堆栈中,供服务例程使用。

  3. 系统调用封装函数
  
编写应用程序时,直接用陷入指令来执行系统调用的难度较大。所以,Linux随内核一起还提供了一套系统调用的封装(wrapper)函数。系统调用封装函数是用C函数的形式封装的系统调用,在程序中可以像使用普通C函数一样使用这些封装函数,很方便地实现对系统调用服务例程的调用。
  系统调用封装函数的作用就像是图书馆为读者提供了一些服务员,这些服务员活动在读者的空间,为读者提供诸如借书、还书、预约、办证等服务。读者只要告诉负责借书的服务员要借哪本书,他就会代替读者填写和提交借书单,并将借到的书交给读者。

  系统调用封装函数与系统调用服务例程是一对一的关系。在不加区分的情况下,它们都可以被称作系统调用。但习惯上程序员所说的系统调用通常是指前者,即在程序中直接使用的系统调用封装函数。在函数命名方式上,两者的对应关系是:服务例程的名字是系统调用名加“sys_”前缀。如write()系统调用对应的服务例程名是sys_write()。

  4. 标准库函数
  
系统调用提供了系统的一个基本功能集,但编程者更多是通过C标准库函数来使用系统调用的。C库函数是对系统调用的更高一级的引用和封装,它与系统调用不是一对一的关系,可能会引用多个系统调用,或进行一些额外的处理步骤。如printf()函数引用了write()系统调用,同时还提供了格式化的输出功能,因而使用起来更加方便。
  C库函数的作用就如同图书馆为用户提供了更高一级的信息服务。例如读者需要某方面的资料,只要向信息服务员描述对资料的需求,由信息服务员负责检索资料,确定要借的图书,再交借书服务员去办理。最后信息服务员将用户所需的信息摘录整理后交给用户。

  从图8-12中可以看出,应用程序可以用3种方式使用系统调用:一是调用C标准函数,这种方式最简单;二是调用系统调用封装函数,当没有合适的C函数可用,或对性能有特殊要求时,则需要直接使用系统调用;三是直接用软中断指令陷入内核,这仅在特殊情况下,比如做底层软件开发时可能用到。

9.4.3  Linux系统调用
  
Linux系统调用在很多方面继承了Unix的系统调用,简洁而高效,但也做了许多改进。它省去了Unix系统中一些冗余的系统调用,仅仅保留了最基本和最有用的系统调用。实际上,Linux提供的系统调用比大部分操作系统都少得多,而且执行的速度也更快。
  Linux内核提供了大约250多个系统调用(全部系统调用的名称、编号和个数见/usr/include/asm/unistd.h文件)。这些系统调用可以按其实现的功能划分为以下几类:

  1. 进程控制类
  
进程控制类系统调用用于对进程进行控制,如创建进程(fork)、终止进程(exit)、等待进程(wait)、更换进程映像(exec)、获得进程标识号(getpid)、设置优先级(setpriority、nice)等。
  
2. 进程通信类
  
进程通信类系统调用用于在进程之间传递消息和信号,如向进程发信号(kill)、设置信号处理器(signal)、获得消息队列(msgget)、发送消息/接收消息(msgsend/smgrcv)、创建管道(pipe)、创建信号量(semget)、操作信号量(semop)等。

  3. 内存管理类
  
内存管理类系统调用用于对内存进行管理,如映射虚存(mmap)、内存页面加锁和解锁(mlock/munlock)、内存缓冲区数据写回磁盘(sync)等。
  
4. 文件管理类
  
文件管理类系统调用用于对文件、目录和设备进行操作,如创建(creat)、打开(open)、关闭(close)、读(read)、写(write)、改变当前目录(chdir)等。

  5. 系统控制类
  
系统控制类系统调用用于设置或读取系统状态及内核配置,如获取/设置系统时间(time/stime)、重新启动系统(reboot)、获取/设置系统主机名(gethostname/sethostname)等。
  
6. 其他类
  
其他系统调用包括用于进行网络管理、套接字控制、用户管理的系统调用。
  有关各个系统调用的用法请查看相应的联机手册页,命令是:(man -S2系统调用名。)

  9.4.4  Linux系统调用的执行过程
  
系统调用在本质上是应用程序请求操作系统核心完成某种特定功能的一种过程调用,这是一种特殊的过程调用,用法上和一般的函数调用很相似,但是二者是有本质性区别的,即函数调用不会引起运行状态的转换,而系统调用会引起运行状态的转换。
  图8-13描述了printf()函数的执行过程,从中可以看到系统调用执行的全过程:
  (1) 应用程序调用printf()函数,要向屏幕输出一些信息。printf()是一个标准的C库函数,用于输出格式化的字符串。这是一个普通的函数调用,它将程序的控制转到printf()函数中执行。

  (2)  printf()函数对要输出的数据进行求值、转换、格式化等操作,形成实际要输出的字符串。但它自己无法将这个字符串写到屏幕上,因为它运行在用户态,无权直接访问硬件资源。所以,它要调用系统调用write()来完成这件工作,这也是一个普通的函数调用。
  (3) 系统调用write()是一个系统调用封装函数,用于向文件写入数据。它将printf()传递过来的参数存入CPU的寄存器中,这些参数包括系统调用编号(write系统调用的编号为4)、文件描述符(stdout文件的描述符为1)、要写入的字符串等,然后用软中断指令陷入内核中的系统调用总控程序system_call()。

linux操作系统 第09章 操作系统接口_第12张图片 图8‑13  系统调用的执行过程

  (4)  CPU响应此软中断,切换到核心态,进入系统调用中断处理的入口程序system_call()处开始执行。system_call()是系统调用的总控程序,它先执行保存现场操作,将寄存器中的调用参数压到内核堆栈中,然后根据参数中的系统调用编号确定要调用的服务例程,调用该例程执行。此例中它调用的是4号系统调用服务例程sys_write()。
  (5)  sys_write()例程从内核堆栈中取得调用参数,执行实际的屏幕输出操作,完成后将执行结果和返回值保存在内核堆栈中,然后返回system_call()。

  (6)  system_call()以中断返回的方式回到用户态,中断返回时的恢复现场操作将带有执行结果和返回值的现场数据从内核堆栈复制到寄存器中,随后write()开始从断点继续运行。
  (7)  write()取出返回值,返回给printf()。
  (8)  printf()函数运行结束,返回到应用程序。


习    题
  8-1  简述字符命令接口与图形接口的特点。
  8-2  什么是作业?作业和进程有什么区别?
  8-3  Shell的主要功能是什么?
  8-4  Shell内部命令与外部命令有何区别?
  8-5  简述Shell的基本工作过程。
  8-6  X Window系统的主要特点是什么?
  8-7  解释名词“X服务器”、“X客户”、“X协议”的含义。

  8-8  什么是窗口?一个窗口由哪些部分组成?
  8-9  窗口管理器、桌面环境和显示管理器的功能各是什么?
  8-10  在主机192.16
9.0.3上运行xterm,将窗口显示在本地屏幕上,应使用什么命令?
  8-11  Linux系统的流行桌面有哪些?
  8-12  什么是系统调用?系统调用与一般的过程调用有哪些区别?
  8-13  Linux的系统调用由哪些组成部分?
  8-14  Linux的系统调用主要分为哪几类?

你可能感兴趣的:(linux操作系统,linux,运维,big,data)