1. 简介
用户界面负责交互。
计算机系统的用户有两类:一类是使用和管理计算机应用程序的用户,也就是被服务者。另一类是程序开发人员
操作系统为普通用户、管理员用户以及编程人员提供不同的用户界面
操作系统为普通用户和管理员用户提供的界面由一组以不同形式表示的操作命令组成。不同计算机操作系统为用户提供的用户操作命令和表现形式不同,不同时期的操作系统为用户提供的用户操作命令和表现形式也不同。
同一操作系统为普通用户与管理员用户提供的命令集合也是不一样的。UNIX、Linux
另外,操作系统为编程人员提供的界面是系统调用。
2. 一般用户的输入输出界面
作业(job)或任务(task)是一个常见的概念。
2.1 作业的定义
在一次应用业务处理过程中,从输入开始到输出结束,用户要求计算机所做的有关该次业务处理的全部工作称为一个作业。作业由不同顺序相连的作业步组成,作业步是在一个作业的处理过程中计算机所做的相对独立的工作。
一般来说,每一个作业步产生下一个作业步的输入文件。
从系统的角度看,作业则是一个比程序更广的概念,它由程序、数据和作业说明书组成。系统通过作业说明书控制文件形式的程序和数据,使之执行和操作。在批处理系统中,作业是抢占内存的基本单位。
作业的概念一般用于早期批处理系统和现在的大型机、巨型机系统中。
2.2 作业组织
一个作业可以包含多个程序和多个数据集,但必须至少包含一个程序。
作业说明书体现用户的控制意图,由作业说明书在系统中生成一个称为作业控制块(Job Control Block,JCB)的表格。该表格登记该作业所要求的资源情况、预计执行时间和执行优先级等。
作业说明书主要包含3方面内容,即作业的基本描述、作业控制描述和资源要求描述。
作业说明书的内容因计算机厂家而异,无论何种作业说明书,都根据系统提供的控制命令和有关参数按照一定的格式进行编写。
在微机系统和工作站系统中,常用批处理文件或shell程序方式编写作业说明书。
2.3 一般用户的输入输出方式
- 联机输入输出方式 大多用在交互式系统中,通过交互会话来输入输出作业,外围设备直接和主机相连接
- 脱机输入输出方式 为了解决联机输入输出时速度太慢的问题。利用个人计算机作为外围处理机进行输入输出处理。在个人机上,用户通过联机方式把数据或程序首先输入到后援存储器上;然后用户把装有输入数据的后援存储器拿到主机的高速外围设备上和主机连接,从而在较短的时间内完成作业的输入工作。输出过程则与此相反。
- 直接耦合方式 直接耦合方式把主机和外围机通过一个公用的大容量外存直接耦合起来。在直接耦合方式中,慢速的输入输出过程仍由外围机自己管理,而对公用存储器中的大量数据的高速读写则由主机完成。
- spooling系统 外围设备同时联机操作。 在spooling系统中,多台外围设备通过通道或DMA器件和主机与外存连接起来。作业的输入输出过程由主机中的操作系统控制。操作系统中的输入程序包含两个独立的过程,一个过程负责从外部设备把信息读入缓冲区;另一个是写过程,负责把缓冲区的信息送到外存输入井中。spooling系统的输入方式既不同于脱机方式,也不同于直接耦合方式。在系统输入模块收到作业输入请求信号后,输入管理模块中的读过程负责将信息从输入装置读入缓冲区。当缓冲区满时,由写过程将信息从缓冲区写到外存输入井中。读过程和写过程反复循环,直到一个作业输入完毕。当读过程读到一个硬件结束标志之后,系统再次驱动写过程把最后一批信息写入外存并调用中断处理程序结束该次输入。然后,系统为该作业建立作业控制块,从而使输入井中的作业进入作业等待队列,等待作业调度程序选中后进入内存。
- 网络联机方式
3. 命令控制界面
使用操作系统命令进行作业控制的主要方式有两种,即脱机方式和联机方式。脱机方式,即用户将作业的执行顺序和出错处理方法一并以作业控制说明书或命令文件的方式提交给系统,由系统按照作业说明书或命令文件中所规定的顺序控制作业执行。在执行过程中,用户无法干涉。脱机控制方式利用作业控制语言来编写表示用户控制意图的作业控制程序,也就是作业说明书。
联机控制方式,不要求用户填写作业说明书,系统只为用户提供一组通过键盘或其他操作方式输入的命令。用户使用系统提供的操作命令和系统会话,交互地控制程序执行和管理计算机系统。其工作过程是,用户在系统给出的提示符下输入特定的命令,系统在执行完该命令后向用户报告执行结果;然后,用户决定下一步的操作。
命令种类大致可分为:
- 环境设置
- 执行权限管理
- 系统管理
- 文件管理
- 编辑、编译、链接装配和执行编辑命令
- 通信
- 资源要求
联机控制方式使用户直接参与控制作业执行,因而大大地方便了用户。
有种情况下,批处理方式要优于联机控制方式。现代操作系统中, 大都提供批处理方式和联机控制方式。这里,批处理方式既指传统的作业控制语言编写的作业说明书方式,也指那些把不同的交互命令按一定格式组合后的命令文件方式。
Windows系列还是Linux系列的操作系统,它们的命令控制界面都是由多窗口的按钮式图形界面组成的。命令已被开发成一条条能用鼠标点击而执行的简单菜单或小巧图标。而且,用户也可以在提示符的提示下用普通字符方式输入各种命令。
4. Linux与Windows的命令控制界面
4.1 Linux的命令控制界面
Linux的最大特点是其源代码的免费和开放,而且为普通用户与程序员提供通用的标准接口与界面。Linux的命令控制都是用图形化的窗口系统以及Shell程序进行的。
Linux命令主要包括以下几类:
- 系统维护及管理命令,例如date、setenv等
- 文件操作及管理命令,例如ls、find等
- 进程管理命令,例如kill、at等
- 磁盘及设备管理命令,例如df、du、mount等
- 用户管理命令,例如adduser、userdel等
- 文档操作命令,例如csplit、sort等
- 网络通信命令,例如netstat、ifconfig等
- 程序开发命令,例如cc、link等
- X Window管理命令,例如startx、XE86Setup等
用户通常会使用到的命令大多放在/usr/sbin、/usr/bin、/sbin、/bin目录下,使用系统提供的man命令可以格式化并显示某一命令的联机帮助。
Linux交互式使用命令或允许用户自己编写Shell程序以采用批处理方式操作。
Linux Shell是一种交互型命令解释程序,也是一种命令级程序设计语言解释系统,它允许用户编制带形式参数的批命令文件,称作Shell脚本或Shell程序。在Linux下,可以像执行任何其他命令一样直接输入其名称来执行一个Shell程序。
一个Shell程序由以下部分组成:
- 命令或其他Shell程序
- 位置参数
- 变量及特殊字符
- 表达式比较
- 控制流语句,例如while、case等
- 函数
mkdir backup
for file in 'ls'
do
cp $file backup/ $file
if [$-ne0]; then
echo "copying $file error"
fi
done
在这个例子中,首先在当前目录下创建了一个子目录backup,然后在其中循环地建立当前目录下所有文件的备份。mkdir、cp、echo等是Linux命令,for是Shell的循环语句,$file是自定义变量,$?是Shell内部变量,-ne是Shell的表达式比较操作符。
Linux Shell可定制性强,支持命令广,具有良好的作业控制能力,编写的Shell命令又可通过脚本的形式重新组合使用。但Shell脚本作为一种解释程序,执行效率低,操作粒度粗,不适合直接操作计算机的存储和I/O等设备。
4.2 Windows的命令控制界面
Windows的命令控制界面可以分为两大部分,即命令解释器部分和窗口交互部分
Windows通过自带的命令行解释器cmd.exe为用户提供功能强大的命令行控制界面,用户可以通过输入命令来对Windows操作系统进行控制和使用。这些命令包括了从MS-DOS保留下来的一些基本命令以及Windows自有的操作命令,主要分为以下几类:
- 系统信息命令,例如Time、Date、Mem、Driverquery和SystemInfo等
- 系统操作命令,例如ShutDown、Runas和Taskkill等
- 文件系统命令,例如Copy、Del和Mkdir等
- 网络通信命令,例如Ping、Netstat和Route等
每个命令有不同的功能,不同的命令可以按照下面的形式进行组合从而形成新的命令:
Command1 & Command2: 用来分割一个命令行中的多个命令,即Cmd.exe运行第一个命令,然后运行第二个命令
Command1 && Command2: 只有在符号&&前面的命令运行成功时,才运行&&后面的命令
Command1 || Command2: 只有在符号||前面的命令运行失败时,才运行符号||后面的命令
(Command1 & Command2):用户分组或嵌套多个命令
Command1 parameter1;parameter2:用分号分隔命令参数
在使用时,通常有下面两种方式:
- 直接在命令行输入命令
- 使用批处理文件
批处理文件是无格式的文本文件,它包含一条或多条命令,其文件扩展名为.bat或.cmd。在命令提示符下输入批处理文件的名称,cmd.exe就会按照该文件中各个命令出现的顺序来逐个运行它们。
用户在当前目录下新建一个批处理文件exam1.bat,其内容如下:
@echo off
mkdir test
echo hello
pause
其中,@表示不显示当前命令本身,echo off表示后面的命令都不显示,mkdir test表示在当前目录下新建一个test文件夹,echo hello表示打印hello字符,pause表示暂停执行,等待用户响应。
用户可以直接用鼠标双击exam1.bat的图标执行批处理,也可以先运行cmd.exe,在命令提示符输入exam1来执行批处理,脚本中的命令将顺序执行。
批处理文件之间可以相互调用和处理参数的,这样,用户就可以将单元功能模块连接起完成更为复杂的功能
exam2.bat的内容如下:
@echo off
mem> %1/memimfo.txt
echo generate memory info ok!
exam3.bat的内容如下:
@echo off
type %1\*.txt
echo type ok!
%1表示第一个输入参数
将前面的exam1.bat进行改写:
@echo off
mkdir test
call exam2.bat test
call exam3.bat test
echo call ok!
pause
这样,在exam1.bat中对exam2和exam3进行了调用。
5. 系统调用
系统调用时操作系统提供给编程人员的唯一接口。编程人员利用系统调用,在源程序一级动态请求和释放系统资源,调用系统中已有的系统功能来完成那些与计算机硬件部分相关的工作以及控制程序的执行速度等。
命令控制界面也是在系统调用的基础上开发而成的。
系统调用大致可分为如下几类:
- 设备管理
- 文件管理
- 进程控制
- 进程通信
- 存储管理
- 线程管理
一般操作系统都不允许用户程序直接访问操作系统的系统程序和数据。需要一个类似于硬件中断的处理机制。当用户使用系统调用时,产生一条相应的指令,处理机在执行到该指令时发生相应的中断,并发出有关信号给该处理机制。该处理机制在收到了处理机发来的信号后,启动相关的处理程序去完成该系统调用所要求的功能。
在系统中为控制系统调用服务的处理机构称为陷阱处理机构。与此相对应,把由于系统调用引起处理机中断的指令称为陷阱指令(或称访管指令)。在操作系统中,每个系统调用都对应一个事先给定的功能号,例如0、1、2、3等。在陷阱指令中必须包括对应系统调用的功能号。有些还带有传递的参数。
为了实现系统调用,系统设计人员还必须为实现各种系统调用功能的子程序编制入口地址表,每个入口地址都与相应的系统子程序名对应起来。然后,由陷阱处理程序把陷阱指令中所包含的功能号与该入口地址表中的有关项对应起来,从而由系统调用功能号驱动有关系统子程序执行。
由于在系统调用处理结束之后,用户程序还需利用系统调用的返回结果继续执行,因此,在进入系统调用处理之前,陷阱处理机构还需保存处理机现场。再者,在系统调用处理结束之后,陷阱处理机构还有恢复处理机现场。现场一般被保护在特定的内存区或寄存器中。
参数传递问题:系统调用需传递给系统子程序不同的参数,系统调用的执行结果也要以参数形式返回给用户程序。
实现参数传递的一些方法:一种是由陷阱指令自带参数。陷阱指令的长度总是有限的,还要携带一个系统调用的功能号,从而,陷阱指令只能自带极有限的几个参数进入系统内部。另一种办法是通过使用有关通用寄存器来传递参数。这些寄存器应是系统程序和用户程序都能访问的,寄存器长度也较短,无法传递较多的参数。因此,在系统调用较多的系统中,大多在内存中开辟专用堆栈区来传递参数。
另外,在系统发生访管或陷阱中断时,为了不让用户程序不直接访问系统程序,反映处理机硬件状态的处理机状态字(PSW)中的相应位要从用户执行模式转换为系统执行模式。由硬件自动实现。一般把处理机在用户程序中执行称为用户态,而把处理机在系统程序中执行称为系统态。
6. Linux和Windows的系统调用
6.1 Linux系统调用
每个系统调用由两部分组成:核心函数部分提供实现系统调用功能的共享代码,作为操作系统的核心程序驻留在内存中;接口函数部分提供给应用程序API接口,它把系统调用号和入口参数地址传送给相应的核心函数。
功能上可大致分为如下几类:
- 设备管理的系统调用
- 文件系统操作的系统调用
- 进程控制的系统调用
- 存储管理的系统调用
- 管理用的系统调用
- 通信的系统调用
例子:
#include <fcnt1.h>
#include <sys/stat.h>
#define SIZE 1
void filecopy(char*Infile, char*Outfile)
{
char Buffer[SIZE];
int In_fh,Out_fh,Count;
if((In_fh=open(Infile,O_RDONLY))==-1)
printf("Opening Infile");
if((Out_fh=open(Outfile,(O_WRONLY|O_CREAT|O_TRUNC),(S_IRUSR|S_IWUSR))==-1)
printf("Opening Outfile");
while((Count=read(In_fh,Buffer,sizeof(Buffer)))>0)
if(write(Out_fh,Buffer,Count)!=Count)
printf("Writing data");
if(Count==-1)
printf("Reading data");
close(In_fh);
close(Out_fh);
}
6.2 Windows系统调用
Windows的系统调用被进一步写成不同的库函数后放入动态链接库(DLL)中。这些库函数构成了Windows操作系统提供给程序员的编程接口。这个编程接口被称为应用编程接口(API)。
常用的API函数调用分为如下几类:
- 窗口管理类。主要包括按钮函数、光标函数和对话框函数等的调用
- 图形设备接口类。主要包括位图函数、笔刷函数和颜色函数等的调用
- 系统服务类。主要包括内存管理函数、文件函数以及进程和线程函数等的调用
- 国际特性类。主要包括Unicode和字符集函数以及输入方法编辑器函数等的调用
- 网络服务类。主要包括Windows网络函数、Windows套接字、NetBIOS、RAS、SNMP和Net函数等的调用。
例子
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdshow)
{
HANDLE hFile;
LPTSTR lpBuffer="Hello World!";
hFile = CreateFile("C:\\File.txt",GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CloseHandle(hFile);
TCHAR szBuf(128);
DWORD dwRead;
DWORD dwWritten;
hFile = CreateFile("C:\\File.txt",GENERIC_READ | GENERIC_WRITE,
0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(hFile,lpBuffer,strlen(lpBuffer)+1,&dwRead,NULL);
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
if (ReadFile(hFile,szBuf,strlen(lpBuffer)+1,$dwWritten,NULL));
{
messagebox(NULL,szBuf,"EXAM",MB_OK);
}
CloseHandle(hFile);
}