操作系统概念拾遗(一)
不为考试,重读操作系统——Operating System Concepts
用户界面,所有操作系统都有用户界面(User Interface,UI)。用户界面可以有多种形式,一种是命令行界面(Command-Line interface,CLI),它采用文本命令,并用一定的方法输入(记忆中允许输入并编辑命令的程序);另一种是批界面(batch interface),其中控制这些命令和命令的指令被输入文件中,通过执行文件来实现;最为常用的是图形用户界面(Graphical User Interface,GUI),它具有定点设备来指挥IO。
这里讨论两种最基本的方法,一种方法是提供命令行界面或命令中断(command interpreter),允许用户直接输入通过操作系统完成的命令;一种是允许用户通过图形用户界面与操作系统交互。
命令解释程序,有的操作系统在其内核部分包括命令解释程序。其他操作系统,如Windows XP和UNIX,将命令解释程序作为一个特殊程序,当一个任务开始时或用户首次登录时(分时系统),该程序就会运行。在具有多个命令解释程序选择的系统中,解释程序被称为shell。例如,在UNIX和Linux系统中,有多种不同的shell可供用户选择,如,Bourne Shell,C Shell,Bash Shell。
命令解释程序的主要作用是获取并执行用户指定的下一条命令,这一层中提供的许多命令都是操作文件的:create、delete、list、print、copy、execute等。MS-DOS和UNIX的shell就是这么工作的,执行这些命令有两种常用的方法,一种方法是命令解释程序本身包含代码以执行这些命令,例如,删除文件的命令可能导致命令解释程序转到相应的代码段已设置参数和执行合适的系统调用,对于这种方法所能提供的命令的数量决定了命令解释程序的大小,这是因为每个程序都必须有自己的实现按代码;另一种方法为许多操作系统(如UNIX)所使用,有系统程序实现绝大多数命令,这样命令解释程序不必理解什么命令,他只要用命令来识别文件已装入内存并执行,例如rm file.txt会搜索名为rm的文件,将该文件装入内存,并用参数file.txt来执行。与rm命令相关的功能完全有rm文件的代码所决定,这样程序员能通过创建合适名称的新文件向系统增加新命令。
图形用户界面提供了基于鼠标的窗口和菜单系统,用户移动鼠标把指针定位到屏幕的图像或图标上,图标代表程序、文件、目录和系统功能,根据鼠标指针的位置及鼠标按键便可以调用程序、选择文件和目录或打开包含命令的菜单。
系统调用(system call)是获取操作系统所提供的服务的接口。这些调用通常用C/C++编写,当然,对底层的任务(如必须直接访问硬件的任务),肯可能一汇编语言指令的形式提供。一个简单的程序也会大量使用操作系统,通常,系统每秒会执行数千个系统调用。一般应用程序开发人员根据应用程序接口(Application Programming Interface,API)设计程序。API是一系列提供给应用程序员的函数,包括传递给每个函数的餐宿及程序员期望的返回值。应用程序员常用的API有适用于Windows系统的Win32 API,适用于基于POSIX的系统的POSIX API(包括几乎所有UNIX、Linux和Mac OS X版本),以及用于设计运行于Java虚拟机上程序的Java API。组成API的函数通常为应用程序调用实际的系统调用。
绝大多数程序设酒宴的运行时支持系统(内置到与编译器一起提供的库中的函数)提供了系统调用接口(system-call interface),作为操作系统的系统调用的可用连接。系统调用接口截取API的函数调用,并调用操作系统中响应的系统调用。通常,没个系统调用有一个与其相关的数字,系统调用接口根据这些数字维护一个可索引的表。然后,系统调用接口调用所需的操作系统内核中的系统调用,并返回系统调用状态及其他返回状态。
系统调用的参数传递,向操作系统传递参数有三种方法。最简单的方法是通过寄存器来传递参数,不过有时,参数会比寄存器多;这是,这些参数通常保存在内存的块和表中,并将块的地址(指针)通过寄存器来传递,Linux和Solaris就采用这种方法;参数也可放在或压入栈中,并通过操作系统从栈中弹出,有的系统偏爱块或栈的方法,因为这些方法并不限制所传递参数的数量或长度。
关于Java API,因为Java要运行在平台无关的系统上,在Java程序中不可能直接进行系统调用。然而,Java方法仍然可以调用程序运行所基于的底层体系结构(Windows或Linux)的本地(native)C或C++代码。这些C或C++代码可以调用主机的系统调用,因此允许Java程序间接执行系统调用。这是通过Java本地接口(Java Native Interface,JNI)完成的,它允许Java方法被声明为native。这种本地Java方法作为实际C/C++方法的占位符,因此调用native的Java方法实际上调用了用C/C++编写的本地函数。显然,使用本地方法的Java程序并不是平台无关的。
系统调用的类型,系统调用大致可分成五大类:进程控制(process control)、文件管理(file manipulation)、设备管理(device manipulcation)、信息维护(information maintaince)和通信(communication)。
进程控制:结束,放弃;装入,执行;创建进程,终止进程;获取进程属性,设置进程属性;等待事件,环唤醒事件;分配和释放内存。
文件管理:创建文件,删除文件;代开文件,关闭文件;文件读、写、重定位;获取文件属性,设置文件属性。
设备管理:请求设备,释放设备;读、写、重定位;获取设备属性,设置设备属性;逻辑连接或断开设备。
信息维护:读取时间或日期、设置时间或日期;读取系统数据,设置系统数据;读取进程、文件或设备属性。设置进程、文件或设备属性。
通信:创建、删除通信连接;发送、接受消息;传递状态信息;连接或断开远程设备。
UNIX系统结构图
Java语言的特性主要包括面向对象、平台无关、分布式和多线程。只要Java0程序或者Java Applet一运行,就创建一个JVM实例,这个JVM实例在程序的main()方法被调用时开始执行。JVM和Java API共同组成了Java平台(Java Platform)。Java平台可以在宿主操作系统(如UNIX或Windows)上实现,也可以作为浏览器的一部分或者直接在硬件中实现。正是Java平台使得开发平台无关和可移植程序成为可能,平台的是显示系统相关的,它以标准方式为Java程序抽吸了系统,提供了干净、平台无关的接口。
系统生成,操作系统通常被设计成能运行在一类计算机上,这些计算机位于不同的场所,并具有不同的外设配置。对于某种特定的计算机场所,必须配置和生成系统,这一过程有时称为系统生成(system generation,SYSGEN)。系统生成程序须获得硬件系统的特定配置信息。装入内核已启动计算机的过程称为引导系统,绝大多数计算机系统都有一小块代码,称为引导程序(bootstrap program)或引导装载程序(bootstrap loader)。这段代码能定位内核,将它装入内存,开始执行。有的计算机系统,如PC,采用两部过程:一个简单引导装载程序从磁盘上调入一个复杂的引导程序,再由后者装入内核。
当CPU接收到一个重置事件时——例如,他被家电或重新启动——具有预先定义内位置的指令寄存器被重新装载,并再次开始执行。该位置就是初始引导程序所在,该程序为只读存储器(read-only memory,ROM)的形式,因为系统启动时RAM处于未知状态。
有些系统,有手机、PDA和游戏控制台,在ROM中保存完整的操作系统。在ROM中存储完整的操作系统特别适合小型操作系统,它支持简单的硬件和操作。所有形式的ROM都是固件(firmware),因为他们的特征结余硬件与软件之间。通常,固件存在的问题是再此执行代码比在RAM中执行代码慢。有些系统将操作系统存储在固件中,并将之复制在RAM中已获得更快的执行。