操作系统概念
进程
在所有操作系统中,一个重要的概念是进程。进程本质上是正在执行的一个程序。与每个进程相关的是地址空间,这是从某个最小值的存储位置(通常是0)到某个最大值的存储位置的列表。在这个地址空间中,进程可以进行读写。该地址空间中存放有可执行程序、程序的数据以及程序的堆栈。与每个进程相关的还有资源集,通常包括寄存器、打开文件的清单、有关进程清单,以及运行该进程所需要的所有其他信息。进程基本上是容纳运行一个程序所需要所有信息的容器。
一个进程暂时被挂起后,在随后的某个时刻里,该进程再次启动时的状态必须与先前暂停时完全相同,这就意味着在挂起时该进程的所有信息都要保存下来。这样在该进程重新启动之后,所执行的操作才能继续进行。在许多操作系统中,与一个进程有关的所有信息,除了该进程自身地址空间的内容以外,均存放在操作系统的一张表中,称为进程表,进程表示数组(或链表)结构,当前存在的每个进程都要占用其中一项。
所以,一个挂起的进程包括:进程的地址空间,以及对应的进程表项(其中包括寄存器以及稍后重启该进程所需要的许多其他信息)。
与进程管理有关的最关键系统调用是那些进程创建和进程终止的系统调用。考虑一个典型的例子。有一个称为命令解释器或 shell 的进程从终端上读命令。此时,用户刚键入一条命令要求编译一个程序。shell 必须先创建一个新进程来执行编译程序。当执行编译的进程结束时,它执行一个系统调用来终止自己。
若一个进程能够创建一个或多个进程(称为子进程),而这些进程又可以创建子进程,则很容易得到进程树。合作完成某些作业的相关进程经常需要彼此通信以便同步它们的行为。这种通信称为进程间通信。
地址空间
通常,每个进程有一些可以使用的地址集合,典型值从 0 开始直到某个最大值。在最简单的情形下,一个进程可拥有的最大地址空间小于主存。在这种方式下,进程可以用满其地址空间,而且内存中也有足够的空间容纳该进程。现在,有了一种称为虚拟内存的技术,操作系统可以把部分地址空间装入主存,部分留在磁盘上,并且在需要时来回交换它们。在本质上,操作系统创建了一个地址空间的抽象,作为进程可以引用地址的集合。该地址空间与机器的物理内存解耦,可能大于也可能小于该物理空间。
文件
操作系统的另一个关键概念是文件系统。如前所述,操作系统的一项主要功能是隐藏磁盘和其他 I/O 设备的细节特性,给程序员提供一个良好、清晰的独立于设备的抽象文件模型。显然,创建文件、删除文件、读文件和写文件都需要系统调用。在文件可以读取之前,必须先在磁盘上定位和打开文件,在文件读过之后应该关闭该文件,有关的系统调用则用于完成这类操作。
进程和文件层次都可以组织成树状结构,但这两种树状结构有不少不同之处。一般进程的树状结构层次不深,而文件树状结构的层次则常常更深。进程树层次结构是暂时的,而目录层次结构则可能存在数年之久。
进程和文件在所有权及保护方面也是有区别的。典型地,只有父进程能控制和访问子进程,而在文件和目录中通常存在一种机制,使文件所有者之外的其他用户也可以访问这些文件。
在 UNIX 中,另外一个重要的概念是特殊文件(special file)。提供特殊文件是为了使 I/O 设备看起来像文件一般。这样,就像使用系统调用读写文件一样,I/O 设备也可通过同样的系统调用进行读写。有两类特殊文件:块特殊文件(block special file)和 字符特殊文件(character special file)。块特殊文件指那些由可随机存取的块组成的设备,如磁盘等。比如打开一个块特殊文件,然后读取第 4 块,程序可以直接访问设备的第 4 块而不必考虑存放该文件的文件系统结构。类似地,字符特殊文件用于打印机、调制解调器和其他接收或输出字符流的设备。按照惯例,特殊文件保存在 /dev 目录中。例如,/dev/lp 是打印机。
在本小节讨论的最后一个特性既与进程有关也与文件有关:管道。管道是一种虚文件,它可连接两个进程。如果进程 A 和 B 希望通过管道对话,它们必须提前设置该管道。当进程 A 想对进程 B 发送数据时,它把数据写到管道上,仿佛管道就是输出文件一样。进程 B 可以通过读该管道而得到数据。这样,在 UNIX 中两个进程之间的通信就非常类似于普通文件的读写了。更为强大的是,若进程想发现它所写入的输出文件不是真正的文件而是管道,则需要使用特殊的系统调用。
输入/输出
所有的计算机都有用来获取输入和产生输出的物理设备。对这些设备的管理全然依靠操作系统。每个操作系统都有管理其 I/O 设备的 I/O 子系统。某些 I/O 软件是设备独立的,即这些 I/O 软件部门可以同样应用于许多或者全部的 I/O 设备上。I/O 软件的其他部分,如设备驱动程序,是专门为特定的 I/O 设备设计的。
shell
操作系统是进行系统调用的代码。编辑器、编译器、汇编程序、链接程序、效用程序以及命令解释器等,尽管非常重要,也非常有用,但是它们确实不是操作系统的组成部分。为了避免可能发生的混淆,这里大致介绍一下 UNIX 的命令解释器,称为 shell。尽管 shell 本身不是操作系统的一部分,但它体现了许多操作系统的特性,并很好地说明了系统调用的具体用法。shell 同时也是终端用户与操作系统之间的接口,除非用户使用的是 GUI。有许多种 shell,如 sh、csh、ksh 以及 bash 等。它们全部支持下面的功能,这些功能可追溯到早期的 shell(即sh)。
用户登录时,同时启动了一个 shell。它以终端作为标准输入和标准输出。首先显示提示符(prompt),它可能是一个美元符,提示用户 shell 正在等待接收命令。假如用户输入
date
shell 创建一个子进程,并运行 date 程序作为子进程。在该子进程运行期间,shell 等待它结束。在子进程结束后,shell 再次显示提示符,并等待下一行输入。
用户可以将输出重定向到一个文件,如键入
date > file
同样,也可以将标准输入重定向,如:
sort <file 1> file2
该命令调用 sort 程序,从 file1 中取得输入,输出送到 file2.
现在,许多个人计算机使用 GUI。事实上,GUI 与 shell 类似,GUI 只是一个运行在操作系统顶部的程序。

浙公网安备 33010602011771号