优秀课件笔记之操作系统用户界面

来源:互联网 发布:plc与单片机的具体介绍 编辑:程序博客网 时间:2024/06/04 18:16

1、本文所以内容来自 著名高校课件和学生笔记(校园里面经常见到有人高价买笔记)
2、任课教师不会提供参考文献,所以只能对作者表示感谢,如果引用了您的作品,可以用回复方式补充参考文献。
3、我不对文章无关问题进行解答,文章内容也比较难,我也很难解答您遇到的问题,如果发现BUG可以用回复方式帮我修正。
4、本课 计算机操作系统
,适用于计算机操作系统课、考研

本课其他部分的导航条见页面底部

 第2章 操作系统用户界面
§2.1 作业的基本概念
§2.2 作业的建立
§2.3 命令控制界面接口
§2.4 系统调用
§2.5 UNIX用户界面
本章小结

本章主要从用户使用和系统管理两方面
出发, 讨论操作系统为用户提供的编程接口
和命令控制接口。首先讨论操作系统的命令
控制接口及与其相关的作业控制和管理概
念,然后介绍系统调用与编程接口,最后介
绍操作系统用户界面示例。
§
2.1
作业的基本概念
2.1.1
作业的定义
作业是操作系统中一个常见的概念。关于什么是作业,
有两个方面的解释。 一个是从用户角度看作业,另一个是从
系统的角度来看作业。从用户的角度,可以从逻辑上抽象地
(并非精确地)描述作业的定义,而从系统的角度,则可以定义
出作业的组织形式。
一般编制一个应用程序大致要经过图2.1中所描述的几步。
即由概念或构思出发经过功能设计、结构设计以及详细设计
过程之后,再编制程序和进行编辑输入、编译链接和反复调
试之后再形成执行代码,并被执行,然后输出执行结果和建
立相应的文档等。
图2.1 一般编程过程
在图2.1中,直到编辑为止的各步都可认为是可
由人工独立完成的(尽管也有许多支撑软件存在),但
从编辑输入开始的以下各步却是在用户的要求控制下
由计算机完成。
在一次应用业务处理过程中,从输入开始到输
出结束,用户要求计算机所做的有关该次业务处理的
全部工作称为一个作业。作业由不同的顺序相连的作
业步组成。作业步是在一个作业的处理过程中,计算
机所做的相对独立的工作。一般来说,每一个作业步
产生下一个作业步的输入文件。
l从系统的角度看,作业则是一个比程序更广的概念。
它由程序、数据和作业说明书组成。系统通过作业说
明书控制文件形式的程序和数据,使之执行和操作。
而且,在批处理系统中,作业是抢占内存的基本单位。
也就是说,批处理系统以作业为单位把程序和数据调
入内存以便执行。
l需要说明的是,作业的概念一般用于早期批处理系
统和现在的大型机、巨型机系统中,对于广为流行的
微机和工作站系统,人们一般不太使用作业的概念。
2.1.2 作业组织
如上所述,作业由三部分组成,即程序、数据和
作业说明书。一个作业可以包含多个程序和多个数据
集,但必须至少包含一个程序。否则将不成为作业。
作业中包含的程序和数据完成用户所要求的业务处理
工作。作业说明书则体现用户的控制意图。由作业说
明书在系统中生成一个称为作业控制块(job control
block,JCB)的表格。该表格登记该作业所要求的资
源情况、预计执行时间和执行优先级等。从而,操作
系统通过该表了解到作业要求,并分配资源和控制作
业中程序和数据的编译、链接、装入和执行等。
作业说明书主要包含三方面内容,即作业的基
本描述、作业控制描述和资源要求描述。作业基本描
述包括用户名、作业名、使用的编程语言名、允许的
最大处理时间等。而作业控制描述则大致包括作业在
执行过程中的控制方式。资源要求描述包括要求内存
大小、外设种类和台数、处理机优先级、所需处理时
间、所需库函数或实用程序等。作业说明书的主要内
容如图2.2 所示。
一般来说,作业说明书方式主要用在批处理系
统中,且各计算机厂家都对自己的系统定义有各自的
作业说明书的格式和内容。
另外,在微机系统和工作站系统中,人们常用
批处理文件或shell程序方式编写作业说明书。
图2.2 作业说明书的主要内容
§2.2 作业的建立
严格地说,在分时系统中,从系统角度来看甚
至没有作业的概念。因此,这里主要介绍批处理系统
的作业建立过程。
建立一个作业必须把该作业所包含的全部程序和
数据输入到计算机的外部辅助存储设备上(简称为外
存或辅存),而且,还要由作业注册程序在系统中为该
作业申请建立起一个相应的作业控制块。作业控制块
和作业之间具有一一对应关系。当一个作业的全部程
序和数据输入到外存且在系统中建立了相应的作业控
制块之后,就说一个作业已经建立起来了。
一个作业的建立过程包括两个子过程,一个是作
业的输入,另一个是作业控制块的建立。
作业的输入指将作业的程序、数据和作业说明
书从输入设备(例如键盘)输入到外存,并形成有关初
始信息。必须有外部启动信号,通知系统调用相应的
输入管理程序来负责控制和完成作业的输入工作。
有关作业输入管理程序的详细部分,将在设备
管理和文件系统中讨论。这里需要指出的是,作业输
入管理程序决定了作业的输入方式。再者,与作业输
入过程的启动相似,作业输入过程的结束也必须由用
户给出信号,使得相应设备发出中断信号后结束输入
过程。
下面讨论作业的输入方式。
2.2.1 作业输入方式
作业输入方式可分为5种,即联机输入方式、脱机输入
方式、直接耦合方式、SPOOLING(Simultaneous Peripheral
Operations On-Line)系统和网络输入方式。
1. 联机输入方式
大多用在交互式系统中,用户和系统通过交互会
话来输入作业。外围设备直接和主机相连接。一台主
机可以连接一台或多台外围设备。在单台设备和主机
相连接进行作业输入时,由于外围设备的输入输出速
度远远低于CPU处理速度,有可能造成CPU资源的
浪费。如果使用多台外围设备同时联机输入的话,则
又成为下面将要介绍的SPOOLING系统。
2. 脱机输入方式
又称为预输入方式。脱机输入方式利用低档个人计算机作
为外围处理机进行输入处理。在低档个人机上,用户通过联机
方式把作业首先输入到后援存储器,例如磁盘或磁带上;然
后,用户把装有输入数据的后援存储器拿到主机的高速外围设
备上和主机连接,从而在较短的时间内完成作业的输入工作。
脱机输入解决了快速输入输出问题,提高了主机的资源利
用率,但反过来说,这又是以牺牲低档机为代价的。而且,脱
机输入需要用户进行干预或进行一定的操作,例如移动存储介
质和连接后援存储器等。另外,脱机输入输出方式存在灵活性
差的缺点,即遇到紧急任务需要处理时,无法直接交给主机以
便优先处理。
3. 直接耦合方式
保留脱机输入方式的快速输入的优点,又没有脱机输入方
式的人工干预的缺点和具有较强灵活性的输入方式是直接耦
合方式。直接耦合方式把主机和外围低档机通过一个公用的
大容量外存直接耦合起来,从而省去了在脱机输入中那种依
靠人工干预来传递后援存储器的过程。在直接耦合方式中,
慢速的输入输出过程仍由外围低档机自己管理,而对公用存
储器中的大量数据的高速读写则由主机完成。直接耦合方式
的原理如图2.3所示。
直接耦合方式需要一个大容量的公用存储器,而且需要
把多台低档机和主机、公用存储器固定连接起来。这种输入
方式的成本较高,一般只适用于大型机或巨型机系统。
图2.3 直接耦合输入方式
4. SPOOLING系统
SPOOLING又可译作外围设备同时联机操作。
SPOOLING系统的工作原理如图2.4所示。
在SPOOLING系统中,多台外围设备通过通道
或DMA器件和主机与外存连接起来。作业的输入输
出过程由主机中的操作系统控制。操作系统中的输入
程序包含两个独立的过程,一个过程负责从外部设备
把信息读入缓冲区;另一个是写过程,负责把缓冲区
的信息送到外存输入井中。这里,外围设备既可以是
各种终端,也可以是其他的输入设备,例如纸带输入
机或读卡机等。
图2.4 SPOOLING系统
u通道是一个独立于CPU的专管输入输出的处理机,它控制外设或
外存与内存之间的信息交换。它有自己的通道指令,以驱动外设进
行读写操作。不过,这些指令需要CPU执行相应的“启动通道”指令发
来启动信号之后才开始执行。DMA方式相似于通道方式。与通道不
同的是,在DMA方式中,信息的传送方向、信息传送的源地址和目
的地址以及传送长度等都是由CPU控制而不是由DMA器件控制的。
uSPOOLING系统的输入方式既不同于脱机方式,也不同于直接耦
合方式。在系统输入模块收到作业输入请求信号后,输入管理模块
中的读过程负责将信息从输入装置读入缓冲区。当缓冲区满时,由
写过程将信息从缓冲区写到外存输入井中。读过程和写过程反复循
环,直到一个作业输入完毕。
u当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最
后一批信息写入外存并调用中断处理程序结束该次输入。然后,系
统为该作业建立作业控制块JCB,从而使输入井中的作业进入作业
等待队列,等待作业调度程序选中后进入内存。
5. 网络输入方式
网络输入方式以上述几种输入方式为基
础。
当用户需要把在计算机网络中某一台主
机上输入的信息传送到同一网中另一台主机
上进行操作或执行时,就构成了网络输入方
式。
因为网络输入方式涉及到不同计算机间
的通信问题,且该问题的讨论已超出了本书
的范围,因此,本书中不准备进一步讨论

2.2.2 JCB
的建立
在系统把作业信息输入到外存输入井之后,还要根
据作业说明书内容和有关作业信息在外存中的位置等建
立作业控制块
JCB

JCB
包含了系统对作业进行管理所必
须的信息。
即:作业名、作业估计执行时间、优先数、
作业建立时间、作业说明书文件名、程序语言类型、内
存要求、外设要求、作业状态、以及作业在外存中的存
储地址等。
作业名是为了识别不同作业的需要而设立的。而作业
估计执行时间、建立时间以及优先数等则是为作业调度
算法提供参数。作业估计执行时间一般由用户通过作业
说明书输入,而优先数则既可以由用户输入,也可以由
系统根据某种原则给出。
作业说明书是控制作业执行的依据,显然,只有批处理系
统需要作业说明书。程序语言类型指明该作业所需要的编译
系统和有关的库函数类型等。
作业状态则描述作业生存期的各个阶段。这些阶段是作
业的提交、后备、执行以及完成阶段。从作业输入请求开始
到建立JCB表,作业处于提交状态。在建立JCB表之后到被
作业调度程序选中进入内存,作业在作业等待队列中处于后
备状态。作业进入内存后到执行结束,处于执行状态。最
后,作业执行结束到撤消之间,作业处于完成状态。
作业进入内存处于执行状态并不意味着该作业立即占据
处理机,作业处于执行状态只是表示该作业作为一道程序进
入内存参与对CPU和其他资源的竞争。
对内存和外设等的要求是该作业对硬件资源的
要求。用户在作业说明书中提出的资源要求称为静态
申请。静态申请有一个资源利用率不高的问题, 现代
操作系统较少使用静态申请方式,而大多采用在执行
过程中,由有关系统调用动态申请和释放资源的方式。
这种方式虽然管理较为复杂,但资源的利用率较高。
作业在外存中的地址指明作业在外存中的位置,
以便系统将该作业调入内存时迅速地找到它。
从系统的角度看,JCB表的数量是一个常
数,建立一个作业的过程实质上是在输入了有关
信息之后申请分得和填写一张空白的JCB表的过
程。由于操作系统中所允许的JCB表中项数是一
常数,因此,当JCB表中各项都已分配出去时,
系统无法为用户建立作业。从而,作业建立过程
失败。另外,由于外存输入井的大小也是有限的。
如果输入井中没有足够的空间存放该作业的话,
则作业的创建仍然是失败的。只有在获得JCB表
项和足够的输入井空间之后,一个作业才可能创
建成功。
§2.3 命令控制界面接口
u操作系统为用户提供两个接口界面。一个是系统为用户提供
的各种命令接口界面。用户利用这些操作命令来组织和控制作
业的执行或管理计算机系统。另一个接口是系统调用。编程人
员使用系统调用来请求操作系统提供服务。操作系统的命令控
制界面就是用来组织和控制作业运行的。
u使用操作命令进行作业控制的主要方式有两种。脱机方式即
用户将作业的执行顺序和出错处理方法一并以作业控制说明书
的方式或命令文件方式提交给系统,由系统按照作业说明书或
命令文件中所规定的顺序控制作业执行。执行过程中,用户无
法干涉,只能等待作业正常执行结束或出错停止之后查看执行
结果或出错信息,以便修改作业内容或控制过程。
u脱机控制方式利用作业控制语言来编写表示用户控制意
图的作业控制程序,也就是作业说明书。作业控制语言的
语句就是作业控制命令。不同的批处理系统提供不同的作
业控制语言。
u联机控制方式不要求用户填写作业说明书,系统只为用
户提供一组键盘或其他操作方式的命令。用户使用系统提
供的操作命令和系统会话,交互地控制程序执行和管理计
算机系统。其工作过程是,用户在系统给出的提示符下敲
入特定的命令,系统在执行完该命令后向用户报告执行结
果;然后,用户决定下一步的操作。如此反复,直到作业
执行结束。凡是使用过DOS、Windows或UNIX系统的读
者,对联机控制方式都应该是不陌生的。
u与脱机控制方式相比,联机控制方式的命令种
类要丰富得多。这些命令可大致分为以下几类:
Ø(1) 环境设置。
Ø(2) 执行权限管理。
Ø(3) 系统管理。
Ø(4) 文件管理。
Ø(5) 编辑、编译、链接装配和执行。
Ø(6) 通信。
Ø(7) 资源要求。
u联机控制方式大大地方便了用户。但在某些情况下,用户
反复输入众多的命令也会浪费不必要的时间。因此,在现代
操作系统中,大都提供批处理方式和联机控制方式。这里,
批处理方式既指传统的作业控制语言编写的作业说明书方
式,也指那些把不同的交互命令按一定格式组合后的命令文
件方式。
u近年来,命令控制界面的人机交互方式发生了革命性变化。
无论是Windows系列,还是UNIX系列的操作系统,它们的命
令控制界面都是由多窗口的按钮式图形界面组成。在这些系
统中,命令已被开发成一条条能用鼠标点击而执行的简单的
菜单或小巧的图标。而且,用户也可以在提示符的提示下用
普通字符方式输入各种命令。可以预计,计算机系统的命令
控制界面将会越来越方便和越来越拟人化。
§
2.4
系统调用
u系统调用是操作系统提供给编程人员的唯一接
口。编程人员利用系统调用,在源程序一级动态
请求和释放系统资源,调用系统中已有的系统功
能来完成那些与机器硬件部分相关的工作以及控
制程序的执行速度等。因此,系统调用像一个黑
箱子那样,对用户屏蔽了操作系统的具体动作而
只提供有关的功能。事实上,命令控制界面也是
在系统调用的基础上开发而成的。
u 系统调用大致可分为如下几类:
(1) 设备管理。该类系统调用被用来请求和释放有关
设备、以及启动设备操作等。
(2) 文件管理。对文件的读、写、创建和删除等。
(3) 进程控制。进程是一个在功能上独立的程序的一次执
行过程。进程控制的有关系统调用包括进程创建、进
程执行、进程撤消、执行等待和执行优先级控制等。
(4) 进程通信。该类系统调用被用在进程之间传递消息或
信号。
(5) 存储管理。包括调查作业占据内存区的大小、获取作
业占据内存区的始址等。
(6) 线程管理。包括线程的创建、调度、执行、撤销等。
不同的系统提供有不同的系统调用。一般,每个
系统为用户提供几十到几百条系统调用。
u为了提供系统调用功能,操作系统内必须有事先编制
好的实现这些功能的子程序或过程。显然,这些程序或
过程是操作系统程序模块的一部分,且不能直接被用户
程序调用。而且,为了保证操作系统程序不被用户程序
破坏,一般操作系统都不允许用户程序访问操作系统的
系统程序和数据。那么,编程人员给定了系统调用名和
参数之后是怎样得到系统服务的呢? 这需要有一个类似
于硬件中断处理的中断处理机构。当用户使用系统调用
时,产生一条相应的指令,处理机在执行到该指令时发
生相应的中断,并发出有关信号给该处理机构。该处理
机构在收到了处理机发来的信号后,启动相关的处理程
序去完成该系统调用所要求的功能。
u在系统中为控制系统调用服务的机构称为陷阱(trap)处
理机构。与此相对应,把由于系统调用引起处理机中断
的指令称为陷阱指令(或称访管指令)。在操作系统中,
每个系统调用都对应一个事先给定的功能号,例如0,
1,2,3等。在陷阱指令中必须包括对应系统调用的功
能号。而且,在有些陷阱指令中,还带有传递给陷阱处理
机构和内部处理程序的有关参数。
u为了实现系统调用,系统设计人员还必须为实现各种
系统调用功能的子程序编造入口地址表,每个入口地址
都与相应的系统子程序名对应起来。然后,由陷阱处理
程序把陷阱指令中所包含的功能号与该入口地址表中的
有关项对应起来,从而由系统调用功能号驱动有关系统
子程序执行。
u由于在系统调用处理结束之后,用户程序
还需利用系统调用的返回结果继续执行,因
此,在进入系统调用处理之前,陷阱处理机
构还需保存处理机现场。再者,在系统调用处
理结束之后,陷阱处理机构还要恢复处理机
现场。在操作系统中,处理机的现场一般被
保护在特定的内存区或寄存器中。
u系统调用的处理过程如图2.5所示。
图2.5 系统调用的处理过程
u 有关系统调用的另一个问题是参数传递问题。不同的系
统调用需要传递给系统子程序以不同的参数。而且,系
统调用的执行结果也要以参数形式返回给用户程序。那
么,怎样实现用户程序和系统程序之间的参数传递呢?
下面介绍几种常用的实现方法。一种是由陷阱指令自带
参数。一般来说,一条陷阱指令的长度总是有限的,而
且,该指令还要携带一个系统调用的功能号,从而,陷
阱指令只能自带极有限的几个参数进入系统内部。另一
种办法是通过使用有关通用寄存器来传递参数。显然,
这些寄存器应是系统程序和用户程序都能访问的。不
过,由于寄存器长度也是较短的。从而无法传递较多的
参数。因此,在系统调用较多的系统中,大多在内存中
开辟专用堆栈区来传递参数。
u另外,在系统发生访管中断或陷阱中断
时,为了不让用户程序直接访问系统程序,
反映处理机硬件状态的处理机状态字PSW中
的相应位要从用户执行模式转换为系统执行
模式。这一转换在发生访管中断时由硬件自
动实现。一般把处理机在用户程序中执行称
为用户态,而把处理机在系统程序中执行称
为系统态。
§2.5 UNIX用户界面
2.5.1 UNIX发展历史与特点
u最初的UNIX操作系统是1969年由AT&T(贝尔实验室)的汤普
逊(Thompson)、里奇(Ritchie)等人在PDP-7上开发成功的16
位微机操作系统。它经历了从开发、发展、不断演变和获得
广泛应用以致逐渐成为工作站等小型机的标准操作系统的演
变过程。
uUNIX系统是从美国麻省理工学院(MIT)1965 年开始进行开
发的另一个分时操作系统Multics的基础上演变而来的。
Multics(Multiplexed Information and Computing Service
System)是MIT和贝尔实验室等为美国国防部研制的。
uMultics对操作系统的发展带来了巨大的影响,特
别是对UNIX 系统。UNIX系统是汤普逊和里奇等把曾
在Multics的          分时终端上编写的“Space Travel”游戏程
序移置到PDP-7上时编写出来的。它继承了Multics
的文件系统的树形结构、Shell命令语言以及面向过
程的结构化设计方法和采用高级语言编写操作系统等
特点。
uUNIX系统正式发表在1974年美国计算机学会杂志
ACM上。当时已是第5版,且已在大学里得到较多的
使用和好评。不过,直到1975年发表的第6版中才引
入多道技术,从而使得UNIX成为一个真正的多用户
分时系统。
u从1972年开始,UNIX系统已移植到PDP-11系列机上运行。
到1979年,贝尔实验室又将其移植到类似于IBM 370的32位
机Interdata 8/32上。从而公布了得到西部电气公司正式承认
的UNIX第7版。同时,贝尔实验室于1980年又公布了为
VAX11/780机编写的操作系统UNIX32Ⅴ。
u在UNIX32Ⅴ的基础上,1980年加里福尼亚大学伯克利分
校发表了VAX-11型机用的BSD4.0和BSD4.1。
u1982年,AT&T又相继公布了UNIX SystemⅢ的3.0,4.0
和5.0等版本。UNIX 系统的发展走上了以AT&T 和伯克利分
校二者为主开发的道路。
u1983年AT&T推出了UNIX SystemⅤ和几种微处理机上的
UNIX。同年,伯克利分校公布了BSD4.2版。
u1984年IBM公布了IBM/PC上的UNIX。Microsoft在1985年
将UNIX改造为适用于16位PC机的Xenix。
u在1985年,Cray公司公布了用于超大型机的UNIX系统。
1986 年,UNIX SystemⅤ发展到了修订版Res2.1和Res3.0;
BSD4.2升级到BSD4.3及Sunmicro公司开发了基于
BSD4.2/4.3的SUN工作站操作系统SUNOS。同年MIT在UNIX
的基础上,开发出了近年来已成为工作站图形界面标准的
Xwindow系统。
u在上述背景下,美国IEEE组织成立了POSIX委员会专门从
事UNIX 的标准化工作。POSIX委员会完成了UNIX系统标准
化,并按其定义重新实现UNIX。标准UNIX意味着一个可以运
行UNIX应用软件的平台,它为用户提供一个标准的用户界
面,而不在于系统内部如何实现。
u后来,UNIX System Ⅴ Res4.0版以及
BSD4.3版等统一了用户界面的UNIX操作系统
相继推出,使UNIX系统的开发工作进入了一
个新的阶段。
u值得一提的是,卡耐基·梅隆大学在UNIX系
统的基础上,引入面向对象的设计思想,于90
年代初开发成功了具有多线程、微内核和分布
式计算环境等先进思想的面向对象操作系统
Mache。该系统的开发成功对以UNIX操作系
统为基础的商用操作系统,例如Solaris等系统
的开发带来了巨大的影响。
u另外,随着网络计算机的不断发展,网络计算(通信
协议、安全管理、网络连接软件等)软件被不断地插
入操作系统内核。DOS系统由于无法处理网络计算问题
而被淘汰之后,Windows系列由于其强大的商业运作背
景和网络计算能力使得它们几乎占据了绝大部分PC机
市场。在这种形势下,一个新的基于UNIX的网络操作
系统Linux被开发了出来。Linux系统与UNIX系统在用
户界面上完全兼容,另外,它向用户开放源代码程
序,从而便于用户根据自己的需要进行修改。因此,
Linux系统一经推出,就得到了广大用户和计算机厂商
的青睐,迅速地形成了一个与Windows系列操作系统相
抗衡的自由软件联盟。目前,已有许多计算机厂商宣
布支持Linux操作系统。
2.5.2 UNIX系统的特点
u UNIX在不长的时间内获得了巨大的成功,这与它在设计上
的特点是分不开的。
(1) UNIX系统是一个可供多用户同时操作的会话式分时操作系
统。
(2) UNIX 系统向用户提供了两种用户友好的界面或接口。这
两种界面是程序一级的界面——系统调用,和操作一级的
界面——命令。对于程序一级的界面系统调用来说,UNIX
系统提供可直接用来编程的高级语言调用形式。而对于操
作一级的界面命令来说,UNIX系统提供一个非内核的Shell
解释程序。Shell不仅可用于终端和系统进行交互、执行命
令和输出结果的界面,而且具有控制变量和可以用来编写
程序。
(3) UNIX系统具有一个可装卸的分层树型结构文件系统。
该文件系统具有使用方便和搜索简单等特点。
(4) UNIX系统把所有外部设备都当作文件,并分别赋予
它们对应的文件名。从而,用户可以像使用文件那样
使用任一设备而不必了解该设备的内部特性,这既简
化了系统设计又方便了用户使用。
(5) UNIX系统核心程序的绝大部分源代码和系统上的支
持软件都用C语言编写。且UNIX系统是一个开放式系
统。所谓开放,即UNIX具有统一的用户接口,使得
UNIX用户的应用程序可在不同的执行环境下运行。
2.5.3 UNIX系统结构
uUNIX系统结构可分为三层。即最内层的UNIX操作系统
核心,它包括文件控制系统和进程控制系统两大部分。
这两部分的实现因厂家和版本而异。最外层是用户程
序,包括许多应用软件。中间层则是Shell命令解释层、
实用程序、库函数等。该层中的Shell解释程序是用户
和UNIX 操作系统的操作界面。UNIX的系统结构如图
2.6所示。
u本书主要介绍UNIX SystemⅤ的内核部分。这是因为作
为面向OA的UNIX操作系统,UNIX SystemⅤ既没有它
的后续版本那么庞大和复杂,又比UNIX第六版在通信、
内存管理等方面有了较大的改善和更能说明本书所讲述
的操作系统的基本原理。
图2.6 UNIX系统结构
2.5.4 UNIX的命令控制界面
Shell是UNIX系统为用户提供的键盘命令解释程序的集合。
Shell 向用户提供300个以上的命令。
基本类包括:
(1) 系统访问命令,例如login,logout等。
(2) 编辑和文件管理命令,例如vi,emacs,cp,rm和ls等。
(3) 编译、链接命令,例如cc,link等。
(4) 维护、管理命令,例如adduser,chown等。
(5) 调试命令,例如dbx等。
(6) 记帐、日期等的命令,例如date等。
(7) 网络通信用命令,例如mailx等。
特殊类命令包括:
(1) 后台命令“&”。
后台命令不要求系统马上执行。例如
$cc pgm.c&
要求系统在空闲时编译程序pgm.c。
(2) 文件名生成符号“*”和“?”
其中“*”和从该字符开始的文件名的字符串匹配,
而“?”则和该字符位所对应的一个字符匹配。例如,
a*.c代表所有以字母a打头的.c文件,而a?.c则只代表
以字母a打头、且文件名长为2个字符的.c文件。
(3) 输入输出重定向符号“<”、“>”和“>>”
在UNIX系统中,进程在对文件进行操作时,要用到文件
描述符。在通过进程执行一个命令时,系统自动地将键盘输
入定义为标识符为0 的文件且称为标准输入。另外,系统终端
显示器定义为文件标识符为1的标准输出,把输出到终端显示
器的错误信息定义为文件描述符为2的标准错误信息输出。
在执行某个命令时,如果要改变输入输出文件,则使用
输入输出重定向符号“>”、“<”和“>>”。其中,a>b表示把文件a
的内容输出到文件b,a<b表示把文件b的内容输出到文件a;
而 a>>b 则表示把文件a 的内容顺序追加到文件b的后面。例
如,ls>a 表示把当前目录下的文件名信息输出到文件a中。如
果文件a不存在,则系统自动创建文件a。
(4) 管道命令“|”
在其他操作系统中,如果有多个程序顺序对一个
数据集进行操作的话,一般都是采用中间文件方式,
即把上一个程序的处理结果输出到中间文件之后,再
把该中间文件作为下一个程序的输入使用。事实上,
由于设置中间文件以及对中间文件的输入输出都要用
到一系列命令,从而既加强系统负担又增加了用户难
度。UNIX Shell则不然.除了上面(3)中所述的文件
输入输出重新定向法之外,还有一种称为管道的不通
过中间文件的数据直接输入方法,即一个命令的执行
结果存放在系统缓冲区内直接作为下一个命令的输入。
管道命令的使用格式是:
命令1|命令 2|命令3 ...
(5) 滤波器功能
UNIX Shell具有对数据进行选取和加工的滤波功能,其中
几个比较主要的命令是:
grep——从指定文件中搜索特定的字符串或包含特定字符串的行等。
sort——对文件内的各行或词组按某种规定的方式分类。
tail——表示文件末尾的指定数行。
使用UNIX Shell的滤波功能,用户可以方便地对大规模数
据集进行分类和查找,并能大大简化不必要的输入输出工作。
另外,UNIX系统的Shell命令还允许用户使用Shell程序语言,
把UNIX命令编制成程序后批处理执行。
2.5.5 UNIX的编程界面
uUNIX系统的另一个用户接口是程序员用的编程接
口,即系统调用。UNIX系统的系统调用以标准实用
子程序形式提供给用户在编程中使用,从而减少用户
程序设计和编程难度,节省用户的编程时间。
u系统调用的主要目的是使得用户可以使用操作系统
提供的有关设备管理、输入输出系统、文件系统和进
程控制、通信以及存储管理等方面的功能,而不必了
解系统程序的内部结构和有关硬件细节,从而起到减
轻用户负担和保护系统以及提高资源利用率的作用。
u因此,UNIX系统的系统调用大致可分为如下几类:
1.有关设备管理的系统调用
用户使用这些系统调用
对有关设备进行
读写和控制等。
例如系统调用
ioctl
为所有设
备的专用命令提供一个一般的、万能的入口
点,它允许一个进程预置与一个设备相联系的
硬件选择项和与一个驱动程序相联系的软件选
择项,从而使设备和相应的驱动程序连接起来。
另外,
系统调用
read

write
可用来对指定设
备进行读写,系统调用
open

close
可用来打
开和关闭某一指定设备。
2. 有关文件系统的系统调用
有关文件系统的系统调用是用户经常使用
而且种类较多的一类。它包括文件的打开
(open)

关闭
(close)


(read)

(write)

创建
(
creat
)
和删除
(unlink)
等调用,还包括
文件的执行
(
execl
)

控制
(
fnctl
)

加锁解锁
(flock)

文件状态的获取
(stat)
和安装文件
系统
(mount)
等。较常用的有文件的打开、创
建、读写和关闭等。下面是一个使用有关文件
系统的系统调用进行文件合并的例子。
main(argc,argv)
int argc;
char *argv[];
{
int fd1,fd2,fd3,n;
char buf[512],ch=′\n′;
fd1=open (argv[1],0); /*打开argv[1]对应的文件,返回标识符fd1*/
fd2=open (argv[2],0); /*打开argv[2]对应的文件,返回标识符fd2*/
fd2=creat (argv[3],0644); /*创建argv[3]对应的文件,返回标识符fd3*/
while ((n=read(fd1,buf,512))>0) /*从fd1中读n<=512字节入buf*/
write(fd3,buf,n); /*将buf中n字节写入fd3*/
write(fd3,&ch,1); /*将换行符号写入fd3*/
while ((n=read(fd2,buf,512))>0) /*从fd2中读n<=512字节*/
write(fd3,buf,n); /*将buf中的字节写入fd3*/
close(fd1);
close(fd2);
close(fd3);
}
3. 有关进程控制的系统调用
u 关于进程控制的系统调用有创建进程的调用fork()、阻塞
当前执行进程自己的系统调用wait()、进程自我终止用的
exit()、获得进程标识符用的getpid()、父进程标识获取
调用getppid()、进程优先级获取用的getpriority()、改变
进程优先数用的nice()、发送和接收信号用的kill()和
signal()、暂停当前进程的执行过程的pause()以及管道
通信调用pipe()等。
u 进程创建调用fork()使用格式是n=fork();该系统调用的返
回值可以是0或大于0的整数或等于-1。n=0时表示系统
将执行子进程的有关程序段,n>0 时表示系统将执行父
进程的程序段,而n=-1则表示子进程未创建成功。无论
n=0或是n>0,父进程的程序段和子进程的程序段都将得
到执行,只是二者执行的时间和顺序上有差别。
下面一个使用系统调用fork的例子。
main()
{
int i;
while ((i=fork())==-1); /* 若创建失败,则反复创建 */
printf(″i=%d\n″,i); /* 打印进程标识符 */
if (i) printf(″It is a parent process!\n″); /* i>0,在父进程中 */
else printf(″It is a child process!\n″); /* i=0,在子进程中 */
}
该程序的执行结果将是打印进程标识符之后,再接连打
印表示父进程和子进程动作的两行字符串It is a parent
process!和It is a child process!。
u 系统调用wait()的返回值是等待子进程的进程标识符。
wait()的功能是阻塞父进程,等待子进程完成后使得父
进程继续工作。
u 进程终止调用exit()终止调用进程本身,并释放所占用
的所有资源。
u 发送信号的系统调用kill()具有两个参数,一个是接收
信号的进程标识pid ,另一个是所要发送的信号sig。
pid和sig二者均为整型值。而且,后面的章节中将会讲
到,sig只能取0~19之间的一个整数值。接收信号的系
统调用sig()也具有两个参数。其中一个是接收的来自
于其他进程的信号sig,另一个则在接收到信号sig之后
去完成的指定功能名func。其中,func()是一用户定义
的函数。
u 例如在有些情况下,用到下列语句: signal(SIGINT,
SIG\--IGN);表示当前执行进程在收到键盘中断信号(按
Del键)之后,不做任何指定的工作,即忽略按Del键对
当前执行进程的影响。
u 管道通信用的系统调用pipe(fd)为同一家族的进程之间
传递数据建立一条管道。其中参数是一个包含2个单元
的整型数组,fd[0]代表管道的读端而fd[1] 代表管
道的写端。管道被创建之后一般和系统调用read()和
write()联合使用。
u 除系统调用外在进程控制中还经常用到两个实用程序,
一个是sleep(n),执行该实用程序使得当前执行进程睡
眠n秒钟。另一个是用于进程互斥的实用程序
lockf(fd,mode,size),其功能是将指定文件fd 的指定区
域进行加锁或解锁,以解决临界资源文件的竞争问题。
4. 有关进程通信的系统调用
进程通信用的系统调用主要包括套接字
(socket)
的建立、链接、控制和删除
;
以及进程间通信用的消
息队列、共用存储区以及有关同步机制的建立、链接、
控制和删除等有关系统调用。
5. 关于存储管理的系统调用
这些系统调用包括获取内存现有空间大小、检
查内存中现有进程以及对内存区的保护和改变堆栈大
小等功能。
6. 管理用系统调用
例如,设置和读取日期和时间,取用户和主机
等的标识符等系统调用。
u 在最初的UNIX SystemⅤ中,共有70多条系统调用。
显然,一个系统提供的系统调用越多,功能就越强,
用户使用起来也就更加方便灵活。
u UNIX的系统调用由一条访管指令——陷阱或陷阱指令
实现。该指令是一条机器硬指令,其操作数部分对应
于系统调用的编号。另外,在系统中有一张系统调用
入口表,用来指示各系统调用处理程序的入口地址,
从而,只要把系统调用的编号与系统调用入口表中处
理程序入口地址对应起来,系统就能够在用户调用系
统调用之后,通过访管指令而找到并执行有关的处理
程序以完成系统调用的功能,有关UNIX SystemⅤ的
系统调用处理,将在第9章中进一步讲述。
本章小结
ü本章简要介绍了操作系统的用户界面。操作系
统的用户界面是评价一个操作系统优劣的重要指
标。操作系统的用户界面包括命令控制界面的编
程界面两部分,其中命令控制界面是基于编程界
面,也就是系统调用之上开发而成的。
ü操作系统的命令控制界面正从早期的脱机控制
方式(批处理系统)和联机控制方式(分时系统)
向多窗口、菜单、按钮以及声控等图形化多媒体
方式变化。命令控制界面的革命与进步是操作系
统最显著的变化之一。
ü系统调用是操作系统提供给编程人员的唯一
接口。编程人员通过系统调用使用操作系统内
核所提供的各种功能。系统调用的执行不同于
一般用户程序的执行。系统调用执行是在核心
态下执行系统子程序,而用户程序则是在用户
态下执行。一般来说,操作系统提供的系统调
用越多,功能也就越丰富,系统也就越复杂。
ü本章还简要介绍了
UNIX
系统的用户界面。