计算机系统结构

计算机系统结构
作者:吕建鹏(译…    文章来源:纯C电子杂志 2005年1月号(总第3期)    点击数:<script language="javascript" src="/Article/GetHits.asp?ArticleID=416" type="text/javascript"> </script> 1443    更新时间:2005-3-2

 

操作系统概念(第六版)

第二章 计算机系统结构

原著:Abraham SilberschatzPeter Baer GalvinGreGangne

翻译:吕建鹏(webmaster@tulipsys.com)

 

在研究计算机系统运行的细节之前,需要对计算机系统结构有一个总体的认识。我们将在本章中学习这个体系结构中的几个完全不同的部分,以此来完善我们的背景知识。本章主要关注计算机体系结构,所以,如果已经掌握了这些概念,你就可以略读或者跳过本章。最初的课题包括了系统启动、I/O和存储器。

操作系统也必须确保计算机系统的正确运行。为确保用户程序不会干扰系统的正常运行,硬件必须要提供合适的机制来保证操作的正确性。在本章的后面,我们将描述基本的计算机体系结构,这是设计可用操作系统的基本知识。最后,我们对网络结构做一个概述。

2.1     计算机系统的运行

一个现代通用计算机系统由一个CPU和多个设备控制器组成,它们通过一条公共总线连接到一起,而这条公共总线提供了对共享存储器的访问能力(图 2.1)。每个设备控制器负责某种特定类型的设备(如磁盘驱动器、音频设备和视频显示器)。CPU和设备控制器能够同时运行,并且相互竞争总线周期。为确保对共享存储器访问的有序性,需要提供一个存储控制器以同步对存储器的访问。

Figure 2.1 A modern computer sysetm.

计算机开始运行(如开启电源或者重新启动)时需要首先运行一个初始化程序。这个初始化程序(或者说是引导程序)往往很简单。它通常存储在计算机硬件中的只读存储器(如固件或EEPROM)内。从CPU寄存器到设备控制器再到内存,引导程序初始化系统的各个方面。引导程序必须要知道如何装入操作系统并开始运行它。因此,引导程序必须要为操作系统内核分配内存空间并将其装入内存。操作系统此时才开始运行第一个进程(比如:“init”),然后等待事件的发生。

事件通常由硬件或软件中断触发产生。硬件随时会通过系统总线向CPU发送信号的方式触发一个中断。软件可能会运行一个特殊的操作触发一个中断,这个特殊的操作被称为系统调用(也称之为监督程序调用)。

现代操作系统是中断驱动的。如果没有进程运行、没有I/O设备运行并且没有用户响应,操作系统将停下来等待事件的发生。事件几乎总是通过中断或自陷发出信号产生。自陷(也称为异常)是一种由软件产生的中断,它由错误(如除以零或无效内存访问)或用户程序请求操作系统执行特殊的服务引起。操作系统的中断驱动的特性定义了系统的一般架构。针对每种类型的中断,操作系统中独立的代码段定义了应该执行什么样的操作。操作系统提供了中断服务程序,由它来负责处理中断。

CPU接收到中断信号时,它会停止当前的工作并立即转向一个确定地点。这个地点通常存储了该中断服务程序的入口地址;处理完成后,CPU恢复被中断的计算。图2.2表明了该操作的时序关系。

Figure 2.2 Interrupt time line for a single process doing output.

中断是计算机体系结构中的重要组成部分。每种计算机都有自己的中断机制,但是有些功能是共同的。中断必须要将控制移交给适当的中断服务程序。一个简单的方法是调用一个通用程序来检查中断信息;然后再调用具体的中断服务处理程序。然而,中断必须要得到快速处理,预定义中断数目是可行的,这样就可以使用一个指向中断处理程序的中断向量表。于是通过这个表间接调用中断程序,就不再需要中间程序了。通常,中断向量表存储在内存的低字节(前100位,大致如此)。这些位置存储了各种设备的中断服务进程地址。这个地址队列(或者说是中断向量)指向由中断请求给定的唯一的设备号,并向中断设备提供中断服务程序地址。MS-DOSUNIX在中断的工作方式上有所不同。

中断体系结构还必须保存被中断的指令的地址。许多老式的设计简单的将中断地址存储在一个确定地点或由设备号索引的地点。更新近的体系结构将返回地址存储在系统堆栈中。如果中断处理程序需要改变处理器状态(如通过修改寄存器值),它必须要显式的保存当前状态,然后在返回之前将其还原。在中断服务结束后,存储的返回地址将被装载到程序计数器中,此时被中断的计算重新开始,就像是中断没有发生过一样。

依据底层处理机提供的功能,有多种方式可以请求系统调用。不管用的是什么方式,它是进程请求操作系统服务的方法。系统调用往往采用自陷到中断向量指定地点的方式。通常可以执行通用的trap指令来产生一个自陷,而有些系统(如MIPS R2000家族)有一个专门的syscall指令。

2.2     I/O结构

正如在第2.1节中所描述的,一个现代的通用计算机系统由一个CPU和多个设备控制器组成,这些设备控制器连接到一条公共总线上。每个设备控制器负责某种特定类型的设备。可能会连接有多个附属设备,这取决于于控制器。例如,小型计算机系统接口(SCSI)控制器具备七个或更多的设备挂载能力。一个设备控制器上有本地缓冲存储器和一系列特定用途的寄存器。设备控制器负责在它控制的外围设备和本地缓冲存储器之间传送数据。根据所控制设备的不同,设备控制器中本地缓冲器的大小也不尽相同。例如:磁盘控制器中缓存的大小应该等于磁盘最小的可寻址空间的大小(也就是一个扇区,通常是512字节),或者是它的倍数。

2.2.1          输入输出中断

要开始一个I/O操作,CPU首先要给设备控制器中相应的寄存器赋值。然后设备控制器检查这些寄存器的内容以决定下一步的动作。例如,如果设备控制器发现一个读请求,它就开始把数据从设备传送到本地缓冲器中。一旦数据传输结束,设备控制器就会通知CPU该操作已经结束。通过触发一个中断来完成这种通信。

通常,在用户进程请求I/O时就会发生这种情况。一旦I/O操作开始,就会有两种可能的情况。最简单的一种,I/O操作开始,然后,在I/O操作完成时将控制返回给用户进程。这种被认为是同步输入输出。另外一种可能被称之为异步输入输出,它并不等待输入输出结束,而是直接将控制返回给用户程序。于是,当其它的系统操作运行时输入输出可以继续进行(图 2.3)。

Figure 2.3 Two I/O methods: (a) synchronous, and (b) asynchronous.

可以有两种方式来等待I/O操作的完成。有些计算机有一个特殊的wait指令,将CPU置于空闲等待状态直到产生下一个中断。没有这种指令的机器可能会有一个等待循环:

Loop: jmp Loop

这种死循环简单的持续运行直到发生一个中断,然后将控制提交给操作系统的另一个部分。这样的循环也可能需要轮流查询多个不支持中断结构的设备;这些设备简单的设置它们寄存器中的一个标志位,然后等待操作系统查询这个标志。

如果CPU总是等待I/O结束,那么它一次最多只能响应一个I/O请求。因此,不论一个I/O中断何时发生,操作系统总是能够准确的知道正在响应中断的具体设备。从另一方面讲,这种方法不允许多个设备的并行I/O操作,也不允许对I/O的重叠操作。

一种更好的方法是开始I/O操作,然后继续处理其它的操作系统代码或用户程序代码。这就需要一个系统调用允许用户程序在需要的时候等待I/O完成。如果没有用户程序准备好,且操作系统无事可做,那么我们还是像以前那样使用wait指令或空闲循环。我们也需要具备同时监控多个I/O请求的能力。为此,操作系统使用一个表来为每一个I/O设备建立一个表项,这就是设备状态表(图 2.4)。每个表项指明了设备的类型、地址和状态(不是功能、空闲或忙碌)。如果这个设备正在处理一个请求,那么请求类型和其它的参数将存储在该设备所对应的表项中。因为也可能同时有其它的进程请求同样的设备,所以操作系统也要为每个I/O设备维护一个等待队列(一个等待的请求列表)。

Figure 2.4 Device-status table.

一个I/O设备需要服务时它会触发一个中断。当发生一个中断时,操作系统首先判断是哪个I/O设备发出了中断。然后查询I/O设备表确定其状态,并且修改相应表项来反映该中断。对于大多数设备来说,一个中断信号标志着I/O请求的完成。如果在该设备的等待队列中有其它的请求,那么操作系统就开始处理下一个请求。

最后,控制从I/O中断中返回。如果一个进程正在等待这个请求的完成(在设备状态表中有记录),那么我们现在就可以将控制返给该进程。否则,我们就返回给I/O中断发生前进行的工作:执行其它的用户程序(此用户程序开始了I/O操作并且该操作已经完成,但是这个程序没有等待该操作执行完毕)或者是等待循环(该程序开始了两个或更多个I/O操作并且正在等待某个结束,但是这个中断来自于另外的操作)。在分时系统中,操作系统可能会转向其它的等待(ready-to-run)进程。

具体的方案可能有所不同。许多交互式系统允许用户事先通过键盘键入数据——在请求数据前输入数据。这样,当设备状态段指明当前没有对该设备的输入请求时,中断可能会发生,以表明接收到了来自终端的字符串。如果允许提前输入,那么就必须提供一个缓冲区来存储事先输入的字符直到某些程序读取它们。通常可能需要为每个输入设备配备一个缓冲区。

异步输入输出的最大的优点是提高了系统效率。在I/O操作发生的同时,CPU可以处理其它工作或是开始其它设备的I/O操作。因为与处理器速度相比I/O速度相当缓慢,所以异步输入输出可以提高系统效率。在 2.2.2 节,我们将描述提高系统性能的另外一种机制。

 

2.2.2          DMA结构

在一个简单的终端输入设备中,从终端读取数据时,输入的第一个字符被发送到计算机中。当接收到这个字符,连接到终端线上的异步通信(或串行端口)设备就向CPU产生一个中断。当接收到来自终端的中断请求时,CPU就会执行一些指令(如果CPU正在执行某个指令,那么中断就要等待该指令执行完毕)。保存这个中断指令的地址,并将控制转移给中断服务程序。

中断服务程序要保存一些CPU寄存器值,因为将来还需要用到这些数据。它要检查最近的输入操作有没有产生错误。然后从设备中读取字符并将其保存在一个缓冲器中。中断服务程序还必须调整指针和计数变量以保证将下一个输入字符存储在缓冲器中的下一个位置。下一步,中断服务程序将在内存中设置一个标记,以此向操作系统的其它部分表明接收到了新的输入。其它的部分则负责处理缓冲器中的数据,并将字符传送给请求数据的程序(2.5节)。然后,中断处理程序恢复刚才保存的寄存器内容并将控制返回给被中断的指令。

如果向9600波特的终端中输入字符,那么终端大约能够以每毫秒一个字符(也就是每1000微秒一个字符)的速度接受和传输。一个优秀的中断服务程序输入一个字符可能需要2微秒,每秒钟留给CPU 998微秒计算(和为其它的中断服务)。根据这个不同点,异步I/O通常具有一个较低的中断优先权,允许首先处理其它的更重要的进程,甚至是一个进程抢占当前进程的中断。然而一个高速设备(比如:磁带、磁盘或者是通讯网络)可能以接近于内存的速度传输数据;举个例子,如果CPU响应每个中断需要2微秒,中断每4微秒到达一次,那么就没有留下多少时间用于执行进程。

为了解决这个问题,在高速设备中应用了直接内存访问DMA)技术。在为设备设置好缓冲器、指针和计数器后,设备控制器直接或者是通过自身的缓冲器将整个数据块读取至内存,整个过程无需CPU干涉。每个数据块仅仅产生一个中断,而不像慢速设备每个字节(或字)就产生一个中断。

CPU的基本操作是相同的。一个用户程序或者操作系统本身可能请求数据传输。操作系统从缓冲池中为数据传输指定一个缓冲器(一个空缓冲区用于输入,一个满缓冲区用于输出)。(根据设备类型,一个缓冲器典型的大小在1284,096字节之间。)下一步,设备驱动程序(操作系统的一部分)将源地址、目标地址和传输数据长度设置到DMA控制器的寄存器中。然后,DMA控制器命令开始I/O操作。当DMA控制器执行数据传输时,CPU可以自由的执行其它的任务。因为存储器一次通常只能够传输一个字,DMA控制器从CPU中“窃取”了存储周期。在进行DMA传输时,周期挪用(cycle stealing)降低了CPU的执行速度。传输结束后DMA控制器就向CPU发出中断。

 

2.3     存储器结构

计算机程序必须在主存储器(也称之为随机读写存储器或简称RAM)中才可以被执行。主存储器是唯一能够被处理器直接访问的大块存储空间(容量在数百万到数十亿字节之间)。它是一种半导体存储器,被称为动态随机读写存储器(DRAM,它由存储器字队列组成。每个字都有它自己的地址。通过调用loadstore指令来对具体的地址进行读写。load指令一次将一个字从主存储器移动到CPU的某个内部寄存器中;store指令则将寄存器内容转移到主存储器中。除了直接调用loadstore指令以外,CPU自动的从主存储器中读取指令执行。

在采用冯诺伊曼体系结构的计算机系统中,一个典型的指令周期首先从内存中读取指令,然后将指令存储到指令寄存器中。该指令将被解码,也可能需要从内存中读取操作数并将操作数存储到一些内部寄存器中。要注意到,内存单元仅仅被视为内存地址流;并不知道内存地址是如何产生的(来自指令计数器、变址寻址、间接寻址、线性地址等等)或者它们是什么(指令还是数据)的地址。因此,我们可以忽视内存地址是怎样产生的。我们仅仅知道内存地址序列由正在运行的程序产生。

理想的,我们希望能够将程序和数据长久的保存在主存储器中。但实际上这是不可能的,主要有如下两个原因:

1.  主存储器通常太小而不能长久的存放所需的全部程序和数据。

2.  主存储器是一种易失性存储设备,会在掉电时丢失存储的信息,某些其它的原因也会造成数据丢失。

这样,大多数计算机提供了辅助存储器作为对主存储器的一个扩充。辅助存储器主要用来长久的保存大量数据。

磁盘是应用最常用的辅助存储器,它可以保存程序和数据。大多数程序(网页浏览器、编译器、文字处理软件、电子制表软件等)在载入内存前存储在磁盘上。有些程序利用磁盘存放原始数据和运算结果。因此,合适的磁盘管理程序对一个计算机系统来说是相当重要的,这个问题将在第十四章中讨论。

从更大的方面讲,前面提到的寄存器、主存储器和磁盘可能仅仅是许多存储系统的一部分。另外还有高速缓冲存储器、CD-ROM、磁带等。每个存储系统都提供了基本的数据存储能力,并且能够保持数据不会丢失。各种各样的存储系统之间的主要不同点在于速度、价格、尺寸和易失性。我们将在 2.3.1 节到2.3.3节讨论主存储器、磁盘和磁带,因为它们具备了所有重要的具备商用价值的存储设备的一般特性。将在第十四章中讨论软盘驱动器、硬盘驱动器、CD-ROMDVD等设备的具体特性。

 

2.3.1          主存储器

主存储器和处理器内部寄存器是唯一能够由CPU直接访问的存储器。有些机器指令将内存地址作为参数,但是却没有指令将磁盘地址作为参数。所以,指令运行时所需要的数据必须要存储在这些能够直接访问的存储设备中。如果数据不在内存中,那么CPU首先把它们转移到内存中,然后才能够对它们进行操作。

I/O操作的情况下(就像2.1节提到的那样),每个I/O控制器拥有许多寄存器,这些寄存器用于存储即将被传输的命令和数据。通常,具体的I/O指令允许在这些寄存器和系统内存之间进行数据传输。为了更加便捷的访问I/O设备,许多计算机系统采用了内存映象I/O。这样,内存的一部分地址范围被留出来并映射到设备寄存器中。对设备寄存器的访问就可以通过读写内存地址实现。这种技术适用于视频控制器等能够快速响应的设备。在IBM个人计算机中,显示屏上的每块区域都被映射到内存中相应的区域。在屏幕上显示文本就像往(相应的)内存映象中写入文本一样简单。

内存映象输入输出也适用于其它一些设备,比如用于将调制解调器和打印机连接到计算机上的串行和并行端口。CPU通过对这些设备的寄存器进行读写来实现与它们的数据传输,这部分寄存器被称为I/O端口。为了通过存储映象串行端口发送一长串字节,CPU首先将数据字节写入数据寄存器,然后在控制寄存器中设置一个标志位来表明数据准备完毕。设备接收到该数据字节后将控制寄存器中的标志位清零以表明准备好接收下一个字节。然后,CPU传输下一个字节。如果CPU以轮询方式检查每一个控制位,那么就有一个(周期)恒定的循环来检查设备是否准备好,这种方式被称为程序控制输入输出(PIO。如果CPU不对控制位进行轮询检查,而是通过接收中断(设备准备好接收下一个字节时会向CPU发出一个中断)来实现,那么这种数据传输被称为中断驱动

CPU中的寄存器的访问时间通常是一个CPU时钟周期。大多数CPU能够以每个时钟跳变一个或多个操作的速率完成对指令的解码并实现对寄存器内容的简单操作。主存储器就不同了,它通过存储总线进行数据传输。内存的访问通常需要花费多个CPU时钟周期才能完成,这样,因为缺乏完成指令所需的数据,处理器通常需要停止运行(stall)。由于要频繁的访问内存,这种情形简直忍无可忍。解决方法是在CPU和主存储器间添加快速存储器。一个缓冲存储器可以调节CPU和内存间的速度差异,它被称为高速缓冲存储器,这将在 2.4.1 节讨论。

 

2.3.2          磁盘

磁盘为现代计算机系统提供了大容量的辅助存储空间。从理论上讲,磁盘相对来说要简单一些(图2.5)。每个盘片是像CD一样的平坦的圆形物体。盘片直径通常在1.8 5.25 英寸 之间。盘片的两面覆盖了一层磁性材料。我们通过在盘片上进行磁性记录来存储信息。

Figure 2.5 Moving-head disk mechanism.

一个读写头在每个盘片表面“飞行”。磁头与磁盘取数臂相连,磁盘取数臂作为一个单元控制所有的磁头。盘片表面被划分为圆形的磁道,磁道又被划分为扇区。在同一取数臂位置上的磁道集组成一个柱面。一个磁盘可能由数千个柱面组成,每个磁道又包含了数百个扇区。通用的磁盘驱动器的存储容量的度量单位为吉。

当磁盘运行时,驱动马达高速旋转。大多数驱动器的转速在每秒60200转之间。磁盘速度分为两部分。传送速率是数据在驱动器和计算机之间的流动速率。定位时间(有时也被称为随机存取时间)由寻道时间和旋转等待时间组成。寻道时间是磁盘取数臂移动到指定柱面所需的时间。旋转等待时间则是指指定的扇区旋转到磁头所需的时间。典型的磁盘的数据传输速率为数兆每秒,寻道时间和旋转等待时间为数毫秒。

因为磁头在盘片上面很薄的一层气垫(其厚度以微米计)上飞行,所以就会有磁头碰到盘片的危险。虽然盘片由一层薄薄的保护膜覆盖着,但有时磁头仍会损伤磁表面。这种事故被称为磁头碰撞。磁头碰撞所造成的盘片损伤是不可修复的;这就需要更换磁盘了。

有种磁盘是可移动的,根据需要可以使用不同的磁盘。可移动磁盘通常有一个盘片,这个盘片放入驱动器之前有一个塑料外套来保护它免收损害。软磁盘是一种廉价的可移动磁盘,它用一个软塑料外壳包裹着一个软盘片。软盘驱动器的磁头往往直接接触磁盘表面,所以这种驱动器的转速就要比硬盘慢很多,这样可以减少对磁盘表面的损耗。可移动磁盘的工作方式与硬盘非常相似,其存储容量由兆度量(注:原著认为移动磁盘的容量以吉为单位度量,这可能是个错误,因为这儿没有提到便携硬盘)。

软盘驱动器通过一组导线与计算机连接,这组导线被称为输入输出总线。现有多种总线标准,其中包括增强型IDE接口(EIDEATA小型计算机系统接口(SCSI。总线上的数据传输通过一个被称为控制器的特殊电子芯片实现。主控制器位于总线末端的计算机中。磁盘控制器构建在每个磁盘驱动器中。为了进行磁盘的I/O操作,计算机将命令发送到主控制器中,通常通过映象内存I/O端口,就像在 2.3.1 节中所描述的那样。然后主控制器通过消息将命令发送到磁盘控制器中,然后磁盘控制器再运行磁盘驱动硬件来执行该命令。磁盘控制器往往有一个内建的高速缓冲存储器。磁盘驱动器中的数据传输在高速缓冲存储器和磁盘表面进行,然后数据以电子速率传输到主控制器中。

2.3.3          磁带

磁带是一种在早期应用广泛的辅助存储器。虽然它能够长久的存储大量数据,但是与主存储器相比它的读写速度太慢了。另外,磁带的随机读写速度仅仅是磁盘的千分之一。所以磁带不适合作为辅助存储器使用。磁带通常主要用作备份,用来存储不常用的数据以及用于在系统间传输数据。

磁带缠绕在线轴上,通过在读写头前缠绕或反绕进行工作。将磁带移动到所需的位置需要耗费数分钟,但是一旦定位完毕,磁带驱动器的写入速度可与磁盘驱动器相当。根据具体的磁带驱动器,磁带的存储容量很不一样。有些磁带能够存储一张大容量磁盘23倍的数据。磁带和其驱动器通常根据(磁带的)宽度分类,这包括:4819毫米和1/41/2英寸。

2.4     存储器体系

根据速度和价格,计算机系统中应用的各种各样的存储器系统可以通过一个分级层次结构进行组织(图 2.6)。更高层的存储器价格更贵,速度更快。当我们往该层次下面转移时,通常每位的价格会降低,但读写周期会增加。这种权衡是有道理的;如果给定的一种存储系统与另外一种相比更快更便宜(其它的特性相同),那么就没有理由选择更贵更慢的存储器。事实上,包含纸带和磁心存储器在内的许多早期的存储器早就进了博物馆了,现在磁带和半导体存储器已经变得更快更便宜。在图2.6中,位于顶端的三层存储器可能采用半导体存储器构造。

除了速度和价格上的不同之外,各种存储系统在易失和非易失性上的也有所不同。易失性存储器在掉电后会丢失数据。由于缺乏昂贵的电池和备用发电机,必需要将数据写入非易失性存储器中以保证数据的安全存储。在图2.6中所表示的层次结构中,电子磁盘上面的存储系统是易失性的,而下面的是非易失性的。电子磁盘可被设计为易失性的或非易失性的。在正常的操作期间,电子磁盘将数据存储在一个大型的DRAM阵列中,这是易失性的。但是许多电子磁盘驱动器隐含着一个磁硬盘和一个备用电池。如果外部电源被阻断,那么电子磁盘控制器将数据从RAM拷入磁盘中。当外部电源恢复时,控制器又将数据拷回到RAM中。

设计一个完整的存储系统必需权衡以下几个方面:尽可能的提供廉价的非易失性的存储器,只有在必要的情况下才使用昂贵的存储器。在两个组件的访问时间或速率差距很大的情况下可以使用高速缓冲存储器来提高系统性能。

 

Figure 2.6 Storage-device hierarchy.

2.4.1          高速缓冲存储技术

高速缓冲存储技术是计算机系统中相当重要的一个概念。数据通常存储在一些存储系统(如主存储器)中。在使用数据时,首先要把它转移到更快速的存储器(高速缓冲存储器)中。当我们需要使用特定的数据片段时,首先检查它是否在高速缓冲存储器中。如果在,就直接读取;否则,就从主存储系统中读取,并向高速缓冲存储器中添加一个备份(这样是为了下次使用这个数据。当然,这只是个假设,我们未必会再次用到它)。

另外,变址寄存器等内部可编程寄存器为主存储器提供了高速缓冲存储能力。程序员(或编译器)通过实现寄存器分配和替换算法以决定哪些数据保存在寄存器中,哪些保存在主内存中。也有些高速缓冲存储器完全以硬件实现。例如,大多数系统使用一个指令高速缓冲存储器来存储要执行的下一条指令。如果没有高速缓冲存储器,CPU就必须要在从主存储器中取指令时等待几个周期。类似的,大多数系统在其存储体系中拥有一个或多个高速数据缓冲存储器。因为这在操作系统的范畴之外,所以在本书中我们并不关心这种纯硬件的存储设备。

由于受到高速缓冲存储器的容量限制,高速缓冲存储器管理的设计是一个相当重要的问题。精心选择的高速缓冲存储器的容量和替换策略能够使高速缓冲存储器的访问比达到80%99%之间,在很大程度上提高了系统性能。在第十章中将讨论软件控制的高速缓冲存储器的替换算法。

可以将主存储器看成辅助存储器的高速缓冲存储器,因为辅助存储器的数据必须要拷到主存储器中才能使用,而主存储器中的数据必须要放到辅助存储器中才能安全存储。长期驻留在辅助存储器中的文件系统数据可能会出现在多个存储层次中。在最高层,CPU可能会维护一个高速缓冲存储器来保存主存储器中的文件系统数据。电子式RAM(也成为固态磁盘)可以用作高速存储设备,通过文件系统接口可以实现对它的访问。大容量的辅助存储器是磁盘。反过来,为了预防磁盘故障所造成的数据丢失,磁盘中存储的数据通常备份在磁带或可移动磁盘上。为了降低存储成本,有些系统能够将辅助存储器中的旧文件归档保存到第三方存储器中,如:小型盒式磁带机(jukebox)。

依据硬件设备和操作系统控制软件,数据可能直接或间接的在多个存储层间转移。例如,从高速缓冲存储器到CPU和寄存器的数据传输完全由硬件实现,而不受操作系统的干预。另一方面,磁盘到内存的数据传输通常由操作系统控制。

 

2.4.2          一致性

在存储器层次体系结构中,同样的数据可能会同时出现在多个层次中。例如:假设文件B中的一个整型数A被加1,而文件B保存在磁盘中。首先,加法操作进程通过一个I/O操作将A调入主存。然后,又将A拷入cache和内部寄存器中。这样,A的拷贝就会同时在多个地方出现:磁盘、主存、cache和某个内部寄存器(图2.7)。一旦加法操作在内部寄存器中完成,那么内部寄存器中的A的值就与其它存储器中的不同了。只有将A的新值从内部寄存器写回到磁盘后A的值才会相同。

Figure 2.7 Migration of integer A from disk to register.

在单任务计算环境中,这种策略并不困难,因为总是要将A拷贝到最高层的存储器中进行访问。然而,在一个多任务的环境中,CPU往返于多个进程。如果同时有几个进程要访问A,那么每个进程都必须要获得最近更新的A的值,这一点必须要非常的小心。

在多处理机环境中就更为复杂了,除了要维护内部寄存器之外,每个CPU还有一个本地cache。这样,多个cache中可能会同时保留一个A的拷贝。因为各个CPU并发运行,所以我们必须要确保某个cache中的A的更新要立即反映到其它的cache中。这被称为超高速缓存相关性,通常是一个硬件问题(在操作系统层面之下)。

在分布式环境中,这甚至更加复杂。在这样的环境中,相同文件的多个拷贝(或复制品)可以保存在分布在空间内的多个不同的计算机中。因为能够访问和更新这些拷贝,所以我们必须要确保一处的更新尽快的影响到其它的地方。有多种方法可以解决这个问题,我们将在第十六章中讨论。

 

2.5     硬件保护

早期的计算机是单用户、程序员操作的(single-user programmer-operated)系统。当一个程序员通过控制台操作计算机时,他就会完全控制整个系统。然而,随着操作系统的发展,这种控制权交给了操作系统。早期的操作系统被称为常驻监督程序,通过开启常驻监督程序,操作系统开始执行许多原先由程序员负责的功能(尤其是I/O)。

另外,为了提高系统利用率,操作系统开始在多个程序间同时共享系统资源。利用假脱机技术,在某一进程的I/O操作进行的同时可以执行另外的程序;磁盘中的数据可同时由多个进程使用。多道程序设计允许同时在内存中保留多个程序。

这种共享在提高了利用率的同时带来了不少问题。在没有共享的系统中,一个程序错误仅仅影响到其自身。而在共享的情况下,一个程序错误可能会牵连多个进程。

例如,考虑简单的批处理操作系统( 1.2.1 节),它只是提供了自动作业队列。在对列循环中,如果一个程序正在读取输入卡片,它会读取所需的全部数据。在没有干扰的情况下,将由下一个作业读取卡片,然后是再下一个,依次类推。这个循环可能会导致许多作业不能正确操作。

在多道程序系统中甚至会发生更多很微妙的错误,一个不正确的程序可能会修改程序或其它程序的数据,甚至是常驻监督程序自身。MS-DOSMacintosh OS中都可能发生这种错误。

若没有针对这种错误的保护,或者计算机每次只能执行一个程序或者怀疑所有的输出的正确性。优良设计的操作系统必须要确保一个错误(或恶意代码)不会导致其它程序错误执行。

通过硬件可以检测到许多程序错误。这些错误通常由操作系统处理。如果一个用户程序以某种方式出现故障——例如,试图执行非法指令或访问超出用户地址空间的内存——硬件将自陷给操作系统。自陷通过中断向量将控制交给操作系统。不论一个程序何时发生错误,操作系统必须要非正常的终止它。通过执行与正常的用户请求终止代码相同的代码可以处理这种状况。给出一条适当的错误消息,并可能会转储该程序的内存。内存转储通常将信息写到一个文件中,这样用户或程序员就可以对此进行检查并可能改正及重新运行这个程序。

 

2.5.1          双模式操作

为了确保操作的正确性,我们必须要保护操作系统和所有的程序以及它们的数据不受错误工作的程序的影响。对许多共享资源来说,保护是必须的。许多操作系统提供了硬件支持来允许我们区分不同的操作模式。

我们至少要区分两种不同的操作模式:用户模式监控模式(也称为管理模式系统模式特权模式)。在计算机硬件中添加一个比特位(被称为模式位)来表示当前的模式:监控模式(0)或用户模式(1)。利用模式位,我们可以区别一个任务是以操作系统的行为执行还是用户的行为执行。就像我们将要看到的那样,这种体系结构上的改进在系统运行的许多其它方面也是非常有用的。

在系统引导时,硬件以监控模式开始运行。然后装入操作系统并以用户模式开启用户进程。无论自陷和中断何时发生,硬件都会从用户模式转向监控模式(将模式位的状态转为0)。这样,不管操作系统何时获得计算机的控制权,它都处于监控模式。在将控制转给用户程序前系统总是要转为用户模式(通过将模式位设置为1)。

双模式操作向我们提供了保护操作系统不受用户错误侵扰的方案,也保护了用户不受其他用户错误的侵扰。通过指定一些能够造成伤害的机器指令作为特权指令可以实现这种保护。在监控模式下,硬件允许执行特权指令。如果试图在用户模式下执行特权指令,那么硬件就会视该指令非法并自陷给操作系统。

特权指令的概念也为我们提供了与操作系统交互的方法,就是请求操作系统执行一些只能由操作系统才能执行的任务。每个这样的请求通过执行一条特权指令调用。这样的请求被称为系统调用(也被称为监督程序调用或操作系统功能调用)——就像是2.1节所描述的。

当系统调用执行时,硬件视之为软件中断。在操作系统中,控制通过中断向量转移给服务进程,模式位被设为监控模式。系统调用服务进程是操作系统的一部分。监控程序检测中断指令以确定发生了什么样的系统调用;程序参数则表明了用户程序所请求的服务类型。该请求的附加信息通过寄存器、堆栈或内存(将内存地址转移给寄存器)传递。监控程序检测参数的正确性,执行这个请求,然后将控制返回给系统调用。

硬件对双模式支持的缺乏会给操作系统带来严重的缺点。例如,MS-DOS针对于Intel 8088体系结构,这种结构中没有模式位,所以也就没有双模式。用户程序以写数据的方式覆盖操作系统就能够毁坏整个系统,并且多个程序同时对某一设备进行写操作也会产生灾难性的后果。最新的Intel CPU(如Pentium系列)提供了对双模式的支持。这样,新近的操作系统(如Microsoft Windows 2000IBM OS/2)利用了这一特性并为操作系统提供了更有力的保护。

 

2.5.2          I/O保护

如果用户程序调用非法的I/O访问操作系统自身的内存地址或拒绝释放CPU,那么该用户程序就会损坏系统的正常运行。我们能够利用多种机制来确保不会在系统中发生这样的事情。

为了阻止用户执行非法的I/O操作,我们将所有的I/O指令定义为特权指令。这样,用户不能够直接调用I/O指令;而必须要通过操作系统执行。为了实现对I/O的完全保护,我们必须确保用户程序不会在监控模式下获得对计算机的控制。

考虑计算机在用户模式下的执行情况。不论中断或自陷何时发生,它都会转入监控模式,跳转到中断向量指定的地址。如果一个用户程序在运行期间使用一个用户程序的地址覆盖了中断向量中原先的地址。那么,当相应的自陷或中断发生时,硬件通过(修改过的)中断向量将控制移交给用户程序!用户程序就可以在监控模式下获得对计算机的控制了。事实上,用户程序可以通过许多其它的方式在监控模式下获得对计算机的控制。另外,经常发现的新臭虫为绕过系统保护提供了机会。将在第十八章和第十九章中讨论这些问题。如此,为了完成I/O操作,用户程序执行系统调用来请求操作系统以其自己的方式执行I/O操作(图2.8)。操作系统运行在监控模式,它会检查请求的有效性,并(在请求有效地情况下)完成I/O请求。最后,操作系统返回给用户。

Figure 2.8 Use of a system call to perform I/O.

2.5.3          内存保护

为了确保操作的正确执行,我们必须保护中断向量免受用户程序的修改。另外,我们也必须保护操作系统中的中断服务进程不被修改。即使用户不能非法获得对计算机的控制权,对中断服务进程的修改也有可能破坏计算机系统和它的假脱机和缓冲处理的正确运行。

我们必需要认识到:至少要为中断向量和操作系统的中断服务进程提供保护。一般而言,我们要保护操作系统不会受到用户进程的访问,另外,也要保证用户进程不被其它的用户进程访问。这种保护必须要由硬件提供。就像我们将在第九章所描述的,有多种方法可以实现。这里,大概的介绍一下一种可能的实现方法。

为了分离每个进程的内存空间,我们要能够确定程序可访问的地址范围并保护该范围之外的内存空间。我们可以通过使用两个寄存器来提供这种保护,一个记录基地址,一个记录界限,如图2.9所示。基址寄存器保存了最低的合法的物理内存地址;界限寄存器则保存了范围的大小。例如,如果基址寄存器的值为300040,界限寄存器的值为120900,那么程序能够访问到的合法的地址在300040420940之间。

Figure 2.9 A base and a limit register define a logical address space.

CPU利用寄存器比较在用户模式下产生的每个地址就可以实现这种保护。运行在用户模式下的程序对监控进程或其他用户进程的内存的任何访问企图都将导致一个给监控程序的自陷,这被视为致命错误(图2.10)。这种机制阻止了用户进程对操作系统和用户程序的代码或数据结构的修改(意外的或故意的)。

Figure 2.10 Hardware address protection with base and limit registers.

只有操作系统能够使用特殊的特权指令写入基址寄存器和界限寄存器。因为特权指令只能够在监控模式下执行,而且只有操作系统才能够在监控模式下运行,所以只有操作系统才能够写入基址寄存器和界限寄存器。这种机制允许监控程序修改寄存器值,而阻止用户进程修改寄存器。

运行在监控模式下的操作系统拥有对监控程序内存和用户内存的无限制的访问权力。这种规定允许操作系统将用户程序载入用户内存、在错误发生时释放内存、访问并修改系统调用参数等。

 

2.5.4          CPU保护

除了对I/O和内存的保护,我们必须明确要由操作系统来维护控制。我们必须要阻止用户进程困在死循环中或不调用系统服务,以及永远不能将控制交还给操作系统。(We must prevent a user program from getting stuck in an infinite loop or not calling system services, and never returning control to the operating system.)为了达到这一目标,我们可以使用计时器。可以将寄存器设为在指定周期后向计算机发出中断。这个周期可以是固定的(例如,1/60秒)也可以是可变的(例如,在1毫秒到1秒)。可变计时器通常由一个固定频率的时钟和一个计数器实现。操作系统设置这个计数器。每次时钟“滴嗒”时,计数器减1。当计数器减至0时,就发生一个中断。例如,10比特的计数器和1毫秒的时钟允许中断发生的间隔在1毫秒到1,024毫秒(210=1,024)之间,步调为1毫秒。

在将控制交给用户之前,操作系统要确保已经设置好了计时器。如果计时器产生中断,控制将自动的转移给操作系统,操作系统可能视其为致命错误,也可能给程序更多时间。很明显,修改计时器的指令为特权指令。

这样,我们就能够利用计数器来限定程序的运行时间。一个简单的方法是使用允许程序运行的时间长度来初始化计数器。例如,如果一个程序有着7分钟的时间限制,那么就将计数器初始化为420。只要计数器是正的,控制就会交给用户程序。当计数器变为负值时,因为已经到了设定的时间限制,操作系统将终止程序的运行。

对计时器的更为广泛的应用是为了实现分时。在大多数简单的情况下,可以将计时器设置为每N毫秒产生一次中断,这里N时间片,也就是每个用户在下一个用户获取对CPU的控制之前可以执行N毫秒。在每个时间片的末端调用操作系统来实现各种内部处理工作,比如:对时间记录加N,该时间记录以指明(为了计算的需要)用户程序已运行的总时间。为了准备下一个程序的运行,操作系统也要保存寄存器、内部变量和缓冲器,并且要修改其它的一些参数。这个过程被称为上下文转换;将在第四章中讨论这个问题。上下文转换后,下一个程序从它上一次停下的地方(它的上一个时间片结束时)继续运行。

计时器的另外一个作用是计算当前时间。每隔一段时间计数器就发出一次中断信号,这就允许操作系统根据初始化时间计算出当前时间。如果设定的初始时间为下午1:00,每秒钟产生一个时钟中断,那么1427次中断之后我们就可以计算出当前时间为下午1:23:47。有些计算机以这种方式获取当前时间,但是因为中断处理时间会延缓软件时钟,所以为了保证时间的精确性,计算要非常的仔细。大多数计算机有一个单独的与操作系统分离的硬件日历钟(time-of-day clock)。

 

2.6     网络结构

局域网(LAN广域网(WAN是两种基本的网络结构。二者的主要区别在于地理位置分布范围的不同。局域网由在小地理范围(例如,独立的建筑物或邻近的建筑群)内分布的处理器构成。而广域网由跨越广阔的地理范围(如美国)内的相互独立的计算机构成。这些不同点意味着通信网络在速度和可靠性上的巨大差异,而且也反映在分布式操作系统的设计上。

 

2.6.1          局域网

局域网于70年代早期作为大型计算机的一种替代品出现的。对于许多企业来说,使用一系列自主运行的小型机要比一台大型机更经济。因为小型机可能需要一些外围设备(如磁盘和打印机),而且单独的企业也可能需要某种形式的数据共享,所以自然而然的就需要把这些小型机连接到网络上。

局域网通常覆盖一个小地理范围(例如,独立的建筑物或邻近的多个建筑物),往往用在办公环境中。这种系统上的各个点离得很近,所以相对于广域网来说局域网的通信连接就会有较高的速度和较低的误码率。为了获取更高的速度和可靠性,就需要高质量的(昂贵的)电缆。对于较远的距离来说,使用高质量电缆的代价是非常高昂的,所以电缆不可以独占使用。

局域网大多使用双绞线和光缆连接。根据网络所采用的拓扑结构,大多为多路访问总线网络(multiaccess bus)、环形网络和星形网络。通信速度在1兆每秒(如AppleTalk、红外和最新的Bluetooth局部无线网络)到1吉每秒(如以太网)之间。大多数的速度为10兆每秒,记为10BaseT Ethernet100BaseT Ethernet需要更高质量的电缆,但它以100兆每秒的速度运行,这种网络日渐普及。基于光缆的FDDI的应用也逐步增多。FDDI是一种基于令牌环的网络,它的速度为100兆每秒。

一个典型的局域网可能由许多不同的计算机(从巨型机到膝上计算机或PDA)、多种共享的外围设备(如激光打印机和磁带驱动器)和提供对其它网络的访问的一个或多个网关(专门的处理器)构成(图2.11)。以太网是一种通用的局域网结构。以太网采用多路访问总线结构,所以它没有中央控制器,这样很容易向网络上添加新主机。

Figure 2.11 Local-area network.

 

2.6.2          广域网

广域网诞生于60年代末,主要是作为一个学术研究项目。该项目旨在提供多节点间的高效连接,并且允许广泛的用户群体经济便利的共享数据。

Arpanet是设计和开发的第一个广域网。从1968年开始,Arpanet从一个只有四个节点的实验性网络逐步成长为由数百万台计算机系统组成的世界范围内的网络——Internet

因为广域网中的每个节点分布在一个广阔的地理范围内,所以相对来说通信连接速度较慢可靠性较低。电话线、租用(专用数据)线路、微波和卫星信道是典型的连接方式。这些通信连接由专用的通信处理机控制(图2.12),通信处理机负责定义节点在利用网络通信所用的接口,也负责在各个节点间传输数据。

Figure 2.12 Communication processors in a wide-area network.

例如,Internet WAN提供了在地理上独立的主机相互通信的能力。计算机主机间典型的不同点在于类型、速度、字长和操作系统等。通常在局域网上的主机可以通过区域网络(regional network)连接到Internet(如美国东北部的NSFnet)利用路由器与全球通信网连接。网络间的连接常常使用电话服务系统,这被称为T1,它能够通过租用线路提供1.544兆每秒的传输速率。因为网络节点需要更快的Internet访问速率,所以就将多个T1单元集中到一起并行工作以提供更高的吞吐量。例如,T328T1的集合,它的传输速率为45兆每秒。路由器控制信息在网络中的传输路径。路由选择可以是动态的(为了提高通信效率),也可以是静态的(为了降低安全风险或计算通信费用)。

其它的WAN使用标准的电话线作为主要的通信方式。调制解调器是一种从计算机接收数据并将其转换为电话系统所使用的模拟信号的设备。在目的节点,调制解调器将模拟信号转换为数字信号并由节点接收数据。UNIX新闻网络UUCP允许系统在预定时间通过调制解调器相互交换信息。然后,消息被传送到邻近的系统中,并且以这种方式,或者将消息传送给网络上的每个主机(公共信息),或者传送给目标主机(机密信息)。WAN的数据传输速率通常要比LAN慢;它的传输率1,200比特每秒到高于1兆每秒之间。UUCP已经被PPP取代。ppp通过调制解调器连接,允许家庭计算机与Internet完全连接。

2.7     摘要

多道程序系统和分时系统在单机上重叠CPUI/O操作提高了计算机性能。这样的重叠需要CPUI/O之间的数据传输通过轮询或中断驱动访问I/O端口的方式实现,或者是使用DMA数据传输。

计算机要完成执行程序的任务,程序必须要保存在主存中。主存是唯一能够由处理器直接访问的大容量存储空间。它是一个字或字节的队列,容量在几十万到几亿之间。每个字都有它自己的地址。主存是易失性的存储设备,掉电后会丢失存储的信息。大多数计算机系统支持辅助存储器作为主存的扩展。对辅助存储器的需求主要是为了能够长久的保存大量数据。最常用的辅助存储设备是磁盘,它能够存储程序和数据。磁盘是一种支持随机存取的非易失性存储设备。磁带往往用于备份不常用的数据,也能够作为媒介在多个系统间进行数据传输。

在计算机系统中,依照速度和价格可以将广泛的存储器系统通过一个层次结构进行组织。更高层的存储器价格更贵,但是速度更快。当我们往层次结构的下面转移时,每位的价格通常会降低,然而访问速度会提高。

操作系统必须要确保计算机系统能够正确操作。为了阻止用户程序干扰系统的正常运行,硬件使用了两种模式:用户模式和监控模式。有些指令(如I/O指令和停机指令)是特权指令,它们只能在监控模式下执行。也必须要保护操作系统所驻留的内存免于用户的修改。利用一个计时器可以阻止死循环的运行。这些策略(双模式、特权指令、内存保护、计时器中断)是操作系统正确运行的基础,将在第三章中详细讨论。

LANWAN是两种基本的网络类型。LAN通常使用昂贵的双绞线或光缆连接,它允许在小地理范围内分布的处理机进行通信。WAN通过电话线、租用线路、微波或卫星信道连接,它允许分布在广阔的地理范围内的处理机进行通信。LAN的典型传输速率高于100兆每秒,而WAN的传输速率在1,200比特每秒到高于1兆每秒之间。

 

词汇


ATAadvanced technology attachment, ATA

IDEIntegrated Drive Electronics

半导体存储器:semiconductor memory

常驻监督程序:resident monitor

超高速缓存相关性:cache coherency

程序控制输入输出:programmed I/O, PIO

初始化程序:initial program

传送速率:transfer rate

磁带:magnetic tape

磁道:track

磁盘:magnetic disk

磁盘控制器:disk controller

磁盘取数臂:disk arm

磁头碰撞:head crash

磁心存储器:core memory

点对点协议:Point-to-Point Protocol, PPP

电子磁盘:electronic disk

调制解调器:modem

定位时间:positioning time

动态随机读写存储器:dynamic random-access memory, DRAM

端口:port

非易失性存储器:nonvolatile storage

冯诺伊曼体系结构:von Neumann architecture

辅助存储器:secondary storage

高速缓冲存储技术:caching

高速缓冲存储器:cache

高速缓冲存储器管理:cache management

固态磁盘:solid-state disk

上下文转换:context switch

管理模式:supervisor mode

光缆分布式数据接口:Fiber Distributed Data Interface , FDDI

广域网:wide-area network, WAN

基址寄存器:base register

计时器:timer

监督程序调用:monitor call

监控模式:monitor mode

界限寄存器:limit register

局域网:local-area networks, LAN

可变计时器:variable timer

可移动的:removable

控制器:controller

路由器:router

模式位:mode bit

内存转储:memory dump

盘片:platter

日历钟:time-of-day clock

软(磁)盘:floppy disk

扇区:sector

设备驱动程序:device driver

设备状态表:device-status table

时间片:time slice

输入输出总线:I/O bus

随机存取时间:random-access time

随机读写存储器:random-access memory, RAM

特权模式:privileged mode

特权指令:privileged instruction

停机指令:halt instruction

通信处理机:communication processor

同步输入输出:synchronous I/O

系统调用:system call

系统模式:system mode

小型计算机系统接口:small computer system interfaceSCSI

旋转等待时间:rotational latency

寻道时间:seek time

以太网:Ethernet

异步输入输出:asynchronous I/O

异常:exception

易失性:volatility

易失性存储器:volatile storage

引导程序:bootstrap program

内存映象输入输出:memory-mapped I/O

用户模式:user mode

增强型IDE接口:enhanced integrated drive electronicsEIDE

直接内存访问:direct memory access, DMA

纸带:paper tape

指令寄存器:instruction register

中断:interrupt

中断驱动:interrupt driven

中断向量:interrupt vector

主控制器:host controller

柱面:cylinder

自陷:trap

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值