《操作系统概念》第二章翻译(3)

类别:软件工程 点击:0 评论:0 推荐:

2.1     硬件保护

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

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

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

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

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

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

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

2.5.1          双模式操作

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

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

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

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

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

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

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

2.5.2          I/O保护

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

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

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

 

图2.8

2.5.3          内存保护

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

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

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

图2.9

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

图2.10

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

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

2.5.4          CPU保护

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

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

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

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

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

2.2     网络结构

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

2.6.1          局域网

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

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

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

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

图2.11

2.6.2          广域网

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

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

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

图2.12

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

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

2.3     摘要

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

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

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

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

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

本文地址:http://com.8s8s.com/it/it36796.htm