设备管理是指计算机系统对除CPU和内存以外的所有输入、输出设备的管理。设备管理不但要管理实际I/O操作的设备(如磁盘机、打印机),还要管理诸如设备控制器、DMA控制器、中断控制器、I/O处理机(通道)等支持设备。如何有效而又方便地管理好种类繁多的设备是设备管理的重要任务。
1、设备的分类
I/O设备的种类繁多,从OS观点来看,其重要的性能指标有:数据传输速率、数据的传输单位、设备的共享属性等。
1.按传输速率分类
低速设备:指传输速率为每秒钟几个字节到数百个字节的设备。典型的设备有键盘、鼠标、语音的输入等;
中速设备:指传输速率在每秒钟数千个字节至数十千个字节的设备。典型的设备有行式打印机、激光打印机等;
高速设备:指传输速率在数百千个字节至数兆字节的设备。典型的设备有磁带机、磁盘机、光盘机等。
2.按信息交换的单位分类
块设备(Block Device):指以数据块为单位来组织和传送数据信息的设备。这类设备用于存储信息,有磁盘和磁带等。它属于有结构设备。典型的块设备是磁盘,每个盘块的大小为512B~4KB,磁盘设备的基本特征是:①传输速率较高,通常每秒钟为几兆位;②它是可寻址的,即可随机地读/写任意一块;③磁盘设备的I/O采用DMA方式。
字符设备(Character Device):指以单个字符为单位来传送数据信息的设备。这类设备一般用于数据的输入和输出,有交互式终端、打印机等。它属于无结构设备。字符设备的基本特征是:①传输速率较低;②不可寻址,即不能指定输入时的源地址或输出时的目标地址;③字符设备的I/O常采用中断驱动方式。
3.按资源分配的角度分类
独占设备:指在一段时间内只允许一个用户(进程)访问的设备,大多数低速的I/O设备,如用户终端、打印机等属于这类设备。因为独占设备属于临界资源,所以多个并发进程必须互斥地进行访问。
共享设备:指在一段时间内允许多个进程同时访问的设备。显然,共享设备必须是可寻址的和可随机访问的设备。典型的共享设备是磁盘。共享设备不仅可以获得良好的设备利用率,而且是实现文件系统和数据库系统的物质基础。
虚拟设备:指通过虚拟技术将一台独占设备变换为若干台供多个用户(进程)共享的逻辑设备。一般可以利用假脱机技术(SPOOLing技术)实现虚拟设备。
2、设备控制器
设备的电子部分叫做设备控制器或适配器。设备控制器的主要职责是控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。在小型和微型机中,它常采用印刷电路卡插入计算机中,控制器卡上通常有一个插座,通过电缆与设备相连,控制器和设备之间的接口是一个标准接口,它符合ANSI、IEEE或ISO这样的国际标准。
设备控制器是CPU与I/O设备之间的接口,它既要与CPU通信,又要与设备通信、还应具有按照CPU所发来的命令去控制设备工作的功能。
3、设备管理的目标和功能
1.设备管理的目标
提高设备的利用率。为此,应尽量提高CPU与I/O设备之间的并行操作程度,主要利用的技术有:中断技术、DMA技术、通道技术、缓冲技术。
为用户提供方便、统一的界面。所谓方便,是指用户能独立于具体设备的复杂物理特性之外而方便地使用设备。所谓统一,是指对不同的设备尽量使用统一的操作方式,例如各种字符设备用一种I/O操作方式。这就要求用户操作的是简便的逻辑设备,而具体的I/O物理设备由操作系统去实现,这种性能常常被称为设备的独立性。
2、设备管理功能
设备分配。指设备管理程序按照一定的算法把某一个I/O设备、及其相应的设备控制器和通道分配给某一用户(进程),对于未分配到的进程,则插入等待队列中。
缓冲区管理。为了解决CPU与I/O之间速度不匹配的矛盾,在它们之间配置了缓冲区。这样设备管理程序又要负责管理缓冲区的建立、分配和释放。
实现物理I/O设备的操作。对于具有通道的系统,设备管理程序根据用户提出的I/O请求,生成相应的通道程序并提交给通道,然后用专门的通道指令启动通道,对指定的设备进行I/O操作,并能响应通道的中断请求。对于未设置通道的系统,设备管理程序直接驱动设备进行I/O操作。
二、 I/O控制方式
随着计算机技术的发展,I/O的控制方式也在不断地发展。一般可分为:程序I/O方式、中断方式、DMA方式和通道方式。 I/O的控制方式发展的目标是尽量减少主机对I/O控制的干预。
这里涉及到2种I/O系统,主机型I/O系统和微机型I/O系统。主机型系统以内存为中心,由通道方式控制I/O设备与内存的数据传送。微机型系统是总线结构,由中断或DMA控制I/O设备与内存的数据传送。
1、 程序I/O方式
在早期的计算机系统中,由于没有中断机构,处理机对I/O设备直接进行控制,采取程序I/O(Programmed I/O)方式、 (Polling轮询)或称为忙-等待方式。
即在CPU向设备控制器发出一条I/O指令启动I/O设备进行数据传输时,要同时把状态寄存器中的忙/闲标志busy置为1,然后便不断地循环测试busy。当busy=l时,表示该I/O设备尚未输入完一个字(符),CPU应继续对该标志进行测试,直至busy=0。
busy=0表示该I/O设备已将输入数据送入到I/O控制器的数据寄存器中,于是CPU将从数据寄存器中取出数据,送入内存的指定单元,接着,再启动去读下一个数据,并置busy=l。
在程序I/O方式中,由于CPU的速度远远高于I/O设备,导致CPU的绝大部分时间都处于等待I/O设备完成而循环测试之中,造成了CPU的极大浪费。但是它管理简单,在要求不高的场合可以被采用。
2、中断控制方式
在现代计算机系统中,对I/O设备的控制,广泛地采用中断驱动(Interrupt-driven)方式,即当某进程要启动某个I/O设备时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。设备控制器便按照该命令的要求去控制I/O设备。此时, CPU与I/O设备处于并行工作状态。例如,在输入时,当设备控制器收到 CPU发来的读命令后,便准备接收从相应输入设备送来的数据。一旦数据进入数据寄存器,控制器便通过控制线向CPU发送一中断信号,由CPU检查输入过程中是否出错,若无错,便向控制器发取走数据的信号,然后便通过控制器将数据写入指定内存单元。
所以,中断驱动方式在I/O设备输入数据的过程中,无需 CPU干预,可以使CPU与I/O设备并行工作。仅当输完一个数据时,才需 CPU花费极短的时间去进行中断处理。从而大大地提高了整个系统的资源利用率及吞吐量,特别是CPU的利用率。
3、DMA控制方式
中断驱动I/O方式虽然大大提高了主机的利用率,但是它以字(节)为单位进行数据传送,每完成一个字(节)的传送,控制器便要向CPU请求一次中断(做保存现场信息,恢复现场等工作),仍然占用了CPU的许多时间。这种方式对于高速的块设备的I/O控制显然是不适合。为了进一步减少CPU对I/O的干预,引入了直接存储器访问DMA(Direct Memory Access)控制方式。
DMA方式是一种完全由硬件执行I/O数据交换的工作方式,它需要使用一个专门的DMA控制器(DMAC),DMAC中有控制状态寄存器、传送字节计数器、内存地址寄存器和数据缓冲寄存器。在这种方式中,DMAC采用盗窃总线控制权的方法从CPU接管对总线的控制,成批的数据交换不经过CPU而直接在内存和I/O设备之间进行。
DMA方式下的数据传送过程可分为三个阶段:
(1) 预处理阶段:当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMAC中的内存地址寄存器和传送字节计数器。另外,还把控制状态寄存器中的中断允许位和启动位置成1,从而启动设备,开始进行数据输入。
(2) 数据传送阶段:发出数据传输要求的进程进入等待状态,进程调度程序调度其他进程占据CPU。DMAC不断地窃取CPU工作周期,执行数据传送的操作:向内存发出地址和控制信号,进行地址修改,对传送字的个数计数,直到所要求的字节全部传送完毕。
(3) 后处理阶段:DMAC在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。
DMA方式较之中断驱动方式,又是成百倍地减少了CPU对 I/O控制的干预,进一步提高了CPU与I/O设备的并行操作程度。
4、I/O通道控制方式
虽然 DMA方式比中断驱动方式已显著地减少了CPU的干预,即由以字(节)为单位的干预减少到以数据块为单位的干预。但是CPU每发出一条I/O指令,也只能去读(或写)一个连续的数据块。而当我们需要一次去读多个离散的数据块且将它们分别传送到不同的内存区域,或者相反时,则需由CPU分别发出多条I/O指令及进行多次中断处理,才能完成。
由于DMA每次只能执行一条I/O指令,不能满足复杂的I/O操作要求。在大、中型计算机系统中,普遍采用由专用的I/O处理机–通道来接受CPU的委托,独立执行自己的通道程序来实现I/O设备与内存之间的信息交换,这就是通道技术。通道技术可以进一步减少 CPU的干预,即把对一个数据块为单位的读(或写)的干预,减少到对一组数据块为单位的读(或写)的有关的控制和管理的干预。这样可实现 CPU、通道和I/O设备三者之间的并行工作,从而更有效地提高了整个系统的资源利用率和运行速度。
通道是通过执行通道程序,并与设备控制器来共同实现对I/O设备的控制。通道程序是由一系列的通道指令(或称为通道命令)所构成。通道指令与一般的机器指令不同,在每条指令中包含的信息较多,有操作码、内存地址、计数(读或写数据的字节数)、通道程序结束位P和记录结束标志R。
三、缓冲技术
目前为了解决CPU与I/O设备间速度不匹配的矛盾,提高的I/O速度和设备利用率,在所有的I/O设备与处理机(内存)之间,都使用了缓冲区来交换数据。所以OS必须组织和管理好这些缓冲区。
1、缓冲的引入
在操作系统中,引入缓冲的主要原因:
改善CPU与I/O设备间速度不匹配的矛盾
例如一个程序,它时而进行长时间的计算而没有输出,时而又阵发性把输出送到打印机。由于打印机的速度跟不上CPU,而使得CPU长时间的等待。如果设置了缓冲区,程序输出的数据先送到缓冲区暂存,然后由打印机慢慢地输出。这时,CPU不必等待,可以继续执行程序。实现了CPU与I/O设备之间的并行工作。事实上,凡在数据的到达速率与其离去速率不同的地方,都可设置缓冲,以缓和它们之间速度不匹配的矛盾。众所周知,通常的程序都是时而计算,时而输出的。
可以减少对 CPU的中断频率,放宽对中断响应时间的限制
如果I/O操作每传送一个字节就要产生一次中断,那么设置了n个字节的缓冲区后,则可以等到缓冲区满才产生中断,这样中断次数就减少到1/n,而且中断响应的时间也可以相应的放宽。
提高 CPU和 I/O设备之间的并行性
缓冲的引入可显著提高 CPU和设备的并行操作程度,提高系统的吞吐量和设备的利用率。
2、缓冲的类型
缓冲有硬件缓冲和软件缓冲之分。硬件缓冲是指以专用的寄存器作为缓冲器。软件缓冲是指在操作系统的管理下,在内存中划出若干个单元作为缓冲区。软件缓冲的好处是易于改变缓冲区的大小和数量,但占用了一部分内存空间。
根据缓冲区设置个数的多少,可分为单缓冲、双缓冲和多缓冲。根据缓冲区的从属关系,可以分为专用缓冲区和缓冲池。
单缓冲( Single Buffer )
为了提高 CPU和设备的并行操作程度,每当一个用户进程发出一个I/O请求时,操作系统便在主存的系统区中为之分配一个缓冲区。例如,CPU从磁盘上读一块数据进行计算要分三步:先从磁盘把一块数据读入到缓冲区中,然后由操作系统将缓冲区的数据传送到用户区,最后由CPU对这一块数据进行计算。
当连续读入一组数据时,读入某数据的第一步(输入)和读入它前一个数据的最后一步(计算)是可以并行执行的,这样就提高了CPU和外设的利用率。由于对缓冲区中数据的输入和提取是串行工作的。连续处理一个数据时间=max(C,T)+M。为使两者能并行工作,必须引入双缓冲。
双缓冲( Double Buffer )
双缓冲工作方式(也称为缓冲对换方式)基本方法是在设备输入时,先将数据输入到缓冲区A,装满后便转向缓冲区B。此时操作系统可以从缓冲区B中提取数据传送到用户区,最后由CPU对数据进行计算。
这样可以实现对缓冲区中读入某数据的第一步(输入)和读入它前一个数据的后二步(传送和计算)二者的并行工作,连续处理一个数据时间= max(T,(M+C)),特别是缓冲区中数据的输入和传送的速度基本相匹配时,可获得较好的效果。所以双缓冲进一步加快了I/O的速度,提高了设备的利用率。
循环缓冲( Circular Buffer )
由于数据I/O多数是间断的,可增加缓冲区的个数来改善CPU与I/O设备间速度不匹配的矛盾。我们可以将多个缓冲区组织成循环队列的形式,其中一些队列专门用于输入,另一些队列专门用于输出。输入进程先不断向队列中空缓冲区R输入数据,计算进程再从队列中装满数据的缓冲区G中提取数据用于计算。
缓冲池
当系统配置较多的设备时,使用专用缓冲区就要消耗大量的内存空间,且其利用率不高。为了提高缓冲区的利用率,目前广泛使用公用缓冲池,池中的缓冲区可供多个进程共享。
对于同时用于输入/输出的公用缓冲池,至少含有三种类型的缓冲区:空缓冲区、装满输入数据的缓冲区和装满输出数据的缓冲区。为了管理上的方便,可将相同类型的缓冲区链成一个队列,于是就形成三个队列:空缓冲区队列emq、输入缓冲区队列inq和输出缓冲区队列outq。
3、UNIX系统的缓冲技术
UNIX系统采用缓冲池技术,来平滑和加快文件信息从内存到磁盘的传输,并充分利用以前从磁盘读入已传入用户区、但仍在缓冲区的数据。当从磁盘上读数据时,如果数据已经在缓冲区中,则核心就直接从缓冲区中读出,而不必从盘上读;当数据不在缓冲区时,核心先把数据从磁盘传送到缓冲区,再由缓冲区读出。目的在于尽可能减少磁盘I/O的次数,提高系统运行的速度。
四、I/O系统软件
1、I/O系统的目标
为了提高操作系统的可适应性和可扩展性,目前几乎所有的操作系统都实现了设备的独立性(Device Independence)(也称为设备无关性)。用户程序的设备独立性是:用户程序不直接使用物理设备名(或设备的物理地址),而只能使用逻辑设备名;而系统在实际执行时,将逻辑设备名转换为某个具体的物理设备名,实施I/O操作。
I/O软件的设备独立性是:除了直接与设备打交道的低层软件之外,其他部分的软件并不依赖于硬件。I/O软件独立于设备,就可以提高设备管理软件的设计效率。
逻辑设备是实际物理设备属性的抽象,它并不限于某个具体设备。例如在MS-DOS中,最基本的输入、输出设备(键盘和显示器)用一个公共的逻辑设备名CON(控制台),并由同一个设备驱动程序来驱动和控制;并行打印机的逻辑设备名为PRN或LPTi等等。使用逻辑设备名是操作系统对用户程序的设备独立性的具体支持。
在系统实现了设备独立性的功能后,可以带来以下两方面的好处:
(1)设备分配时的灵活性
当进程以逻辑设备名请求某类设备时,如果一台设备已经分配给其它进程或正在检修,此时系统可以将其它几台相同的空闲设备中的任一台分配给该进程,只有当此类设备全部被分配完时,进程才会被阻塞。
(2)易于实现I/O重定向
所谓I/O重定向,指用于I/O操作的设备是可以更换,应用程序的输入、输出是可以重定向,而不必修改应用程序。在Windows中,默认标准的输入设备是键盘,输出设备是显示器,如果想改变标准的输入、输出设备,可以用转向符。
为了实现逻辑设备名到物理设备名的映射,系统必须设置一张逻辑设备表LUT(Logical Unit Table),能够将应用程序中所使用的逻辑设备名映射为物理设备名,并提供该设备驱动程序的人口地址。
2、I/O软件分层结构
I/O软件采用分层结构,它把软件组织成为一系列的层,低层参与隔离硬件特征,使其它部分软件不依赖硬件;而高层则参与向用户提供一个友好的、清晰而统一的接口。I/O软件一般共分四层:中断处理程序,设备驱动程序,与设备无关的操作系统软件,以及用户级软件(指用户空间的I/O软件)。从功能上看,设备无关层是I/O管理的主要部分;从代码量上看,驱动层是I/0管理的主要部分。分层是相对灵活的,一些具体分层时细节上的处理是依赖于系统的。
现代操作系统通过使用重构设备驱动程序技术,简化了驱动程序的安装。这种系统允许安装好新的输入输出设备后,只要增加相应的设备驱动程序到操作系统,而无需编译操作系统,只要通过一些操作来重新配置系统。这种可重构性,是通过允许在操作系统设计中,动态地将操作系统代码与驱动程序结合起来而实现的。
大部分I/0软件都包含在操作系统中,用户程序的I/0软件是有关实现I/O系统调用的库函数和SPOOLing系统等。
所有设备所需要的I/O功能在与设备独立的软件中实现,这类软件面向应用层并提供一个统一的应用编程接口(API),它提供了一组功能函数,应用程序员能够通过调用它们管理设备。这个接口是设备硬件的一个大大简化了的简单抽象的接口,提供的是对具有逻辑性质的逻辑设备上的逻辑操作。由文件系统和设备管理功能接受、翻译、转换为相应的物理设备、物理性质、物理操作。与设备无关的系统软件实现的功能有:设备驱动程序的统一接口,设备命名,设备保护,提供一个与设备无关的逻辑块,缓冲,存储设备的块分配,独占设备的分配和释放,错误处理等。
设备驱动程序的主要功能将来自上层软件的与设备无关的的抽象请求转为具体请求,向有关的输入输出设备的各种控制器的寄存器发出控制命令,并监督它们的正确执行,进行必要的错误处理。还要对各种可能的有关设备排队、挂起、唤醒等操作进行处理,执行确定的缓冲区策略等。
一旦CPU响应中断,转人中断处理程序。中断处理程序首先检查响应中断的条件是否满足,如果响应中断,则关中断,保存被中断进程现场,分析中断原因,调用并执行中断处理子程序,最后退出中断,恢复现场,开中断。
3、UNIX设备驱动程序结构
设备驱动程序的结构同输入输出设备的硬件特性有关,不同的操作系统中,对设备驱动程序的结构的要求是不同的。UNIX把设备分为块设备或字符设备二类,并规定了两个标准化的接口(设备驱动API):块设备接口或字符设备接口,两个接口都定义了一组固定的函数(close、ioctl、open、read、select、strategy、stop、write),它以统一的文件方式处理物理设备,以此来简化设备的应用编程模型。
在UNIX系统中,每类设备都有一个驱动程序,用它来控制该类设备。任何一个驱动程序通常都包含了满足标准化的接口要求的用于执行不同操作的多个函数,如打开、关闭、启动设备、读和写等函数,它是标准化的接口函数的一个子集,从而可以对特殊设备进行操作。块设备没有read/write的入口点,而用strategy入口点定义了读写操作入口点。
4、中断方式I/O处理
在使用中断的微机系统中,执行输入请求的处理步骤如下:
(1)应用进程请求读操作。
(2)设备启动程序(设备驱动程序的上半部分)查询设备控制器的状态寄存器,确定设备是否空闲;如果设备忙,则设备启动程序等待,直到它变为空闲为止。
(3)设备启动程序把输入命令存人设备控制器的命令寄存器中,从而启动设备。
(4)设备启动程序将相应信息写入到设备状态表的设备对应表项中,如最初调用的返回地址,以及I/O操作的一些特定参数等。然后CPU就可以分配给其他进程使用了,因此设备管理器调用进程管理器的调度程序执行,原进程的执行就被暂停了。
(5)经过一段时间设备完成了I/O操作后,设备控制器发出中断请求,中断CPU上运行的进程,从而引起CPU运行中断处理程序。
(6)中断处理程序确定是哪个设备引起的中断,然后转移到该设备对应的设备处理程序(设备驱动程序的下半部分)执行。
(7)设备处理程序重新从设备状态表中,找到等待I/O操作的状态信息。
(8)设备处理程序拷贝设备控制器的数据寄存器的内容到用户进程的内存区。
(9)设备处理程序返回给应用进程控制权,从而继续运行。
在以上处理I/O操作过程中,中断处理程序和设备处理程序二程序一起完成对中断请求的处理,但二者工作方式不同,前者必须关中断运行,或是以高优先权方式运行;而后者可以开中断运行,或以低优先权方式运行。这种把“长” 中断服务程序分成二个程序的方法是为了减少系统对I/O处理的响应时间。要保证随时可能发生的中断信号不被丢失,要及时做一些信号的保存,读取甚至传递工作,这一阶段的工作要求快速处理,采用关中断方式运行,将其称为中断处理的低级阶段。
而那些与设备有关的数据结构的处理,它要花费中断处理的大部分时间,采用开中断运行,将其称为中断处理的高级阶段。对应在Linux中,把一次中断处理分割为两部分:快速的top half中断处理和慢速的bottom half中断处理。在Windows 2000慢速的中断处理用延迟过程调用DPC。
5、用户空间的软件I/O
早期批处理系统中使用的虚拟技术是以脱机方式工作的。为了缓和CPU和I/O设备之间的速度不比配的问题。利用专门的外围控制机将低速I/O设备上的数据传送到高速磁盘上,或者相反。当多道程序设计的分时系统出现后,SPOOLing技术就孕育而生,它将一台独占设备改造成可以共享的虚拟设备。
什么是 SPOOLing技术
当多道程序程序技术出现后,就可以利用一道程序,来模拟脱机输入时的外围控制机的功能,即把低速I/O设备上的数据传送到高速的磁盘上;再用另一道程序来模拟脱机输出时外围控制机的功能,即把数据从磁盘传送到低速I/O设备上。这样,便在主机的直接控制下,实现脱机输入、输出功能。所以,我们把这种在联机情况下实现的同时与外围设备联机操作的技术称为SPOOLing(Simultaneous Peripheral Operation On Line),或称为假脱机技术。
SPOOLing系统的组成
SPOOLing系统是对脱机输入、输出工作的模拟,它必须有高速随机外存(硬盘)的支持。 SPOOLing系统主要有以下三部分:
(1)输入井和输出井: 在磁盘上开辟的两个大的存储空间。输入井模拟脱机输入时的磁盘,用于收容I/O设备输入的数据。输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据。
(2)输入缓冲区和输出缓冲区: 在内存中开辟两个缓冲区:输入缓冲区和输出缓冲区。输入缓冲区用于暂存由输入设备送来的数据,再传送到输入井。输出缓冲区用于暂存从输出井送来的数据,再传送给输出设备。
(3)输入进程SPi和输出进程SPo:进程SPi 模拟脱机输入时的外围控制机,将用户要求的数据从输入机通过输入缓冲区再送到输入井。当CPU需要输入数据时,直接从输入井读入内存。SPo 进程模拟脱机输出时的外围控制机,把用户要求输出的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备上。
共享打印机
打印机虽然是独享设备。但是通过SPOOLing技术,可以将它改造为一台可供多个用户共享的设备,共享打印机技术已被广泛地用于多用户系统和局域网络。为此,SPOOLing系统创建一个特殊进程,称为守护(daemon)进程,以及一个特殊目录,称为SPOOLing目录。当用户进程请求打印输出时,SPOOLing系统并不是真正把打印机分配给该用户进程,而由守护进程为它在磁盘中申请一个存储空间,并将要打印的数据以文件的形式存放于SPOOLing目录下。然后由守护进程依次完成该目录下文件的打印工作,该进程是唯一一个拥有使用打印机特殊文件权限的进程。 总之,利用SPOOLing技术可以提高I/O的速度,将独占设备改造为共享设备,实现虚拟设备的功能。
五、设备的分配
在多道程序环境下,设备必须由系统分配。每当进程向系统提出I/O请求时,设备分配程序按照一定的策略,把其所需的设备及其有关资源(如缓冲区、控制器和通道)分配给该进程。在分配设备时还必须考虑系统的安全性,避免发生死锁现象。
1、设备分配的策略
独享方式
独享方式是指将一个设备分配给某进程后,便一直由它独占,直至该进程完成或释放该设备为止,系统才能将该设备分配给其它进程使用。这种分配方式是对独占设备采用的分配策略。它不仅往往造成设备利用率低,而且还会引起系统死锁。
共享方式
共享方式是指将共享设备(磁盘)同时分配给多个进程使用。但是这些进程对设备的访问需进行合理的调度。
虚拟方式
虚拟方式是指通过高速的共享设备,把一台慢速的以独占方式工作的物理设备改造成若干台虚拟的同类逻辑设备,这就需要引入SPOOLing技术。虚拟设备属于逻辑设备。
2、设备分配算法
先来先服务:当多个进程同时向某一设备提出I/O请求时,该算法就根据对该设备提出请求的先后次序将这些进程排列成一个设备请求队列,设备分配程序把设备首先分配给队首进程。
优先级高者优先:对优先权高的进程所提出的I/O请求赋予高优先权,在形成设备队列时,将优先级高的进程排在设备队列前面,先得到分配。而对于优先权相同的I/O请求,则按先来先服务原则排队分配。
3、设备分配中的安全性
安全分配方式
每当进程发出一个I/O请求后,便进入阻塞状态,直到其I/O操作完成时才被唤醒。当它运行时不保持任何设备资源,打破了产生死锁一个必要条件—“请求和保持”,所以这种分配方式是安全的。但是这种分配算法使得CPU与I/O设备串行工作,设备的利用率比较低。
不安全分配方式
进程发出一个I/O请求后仍可以继续运行,需要时还可以发第二个I/O请求、第三个I/O请求。只有当进程所请求的设备已被另一个进程占用时,进程才进入阻塞状态。这种分配方式是不安全,因为它可能具备“请求和保持”条件,从而可能造成系统死锁。
六、磁盘I/O
在现代的计算机系统中,都把磁盘作为文件存储器,因为磁盘存储器不仅容量大(硬盘单个容量可达28GB),存取速度快(内部传输率达257MB/sec),而且是可以随机存取的共享设备,是实现虚拟存储器所必需的硬件。提高磁盘I/O速度,系统应选择性能好的磁盘,采用好的磁盘调度算法和设置磁盘高速缓冲区。
1、磁盘结构
磁盘存储器由磁盘驱动器、磁盘控制器和磁盘(片)三个部分组成。在硬盘存储器中,将若干个盘片组合在一起,形成一个盘片组。当驱动器旋转时,所有盘片都沿轴平面转动,目前硬盘转速已达每分钟7200转。紧靠着盘片的是传动臂,臂的末端是读写头。
按磁头的工作方式,可以分为活动头磁盘和固定头磁盘。
活动头磁盘: 活动头磁盘一个盘面上仅配有一个磁头,所有磁头都安装在一个传动臂上,在访问盘面上的磁道时,传动臂在步进电机的控制下,可在整个盘面上从外向内,或从内向外移动,这称为寻道。活动头磁盘只能进行串行读/写,导致I/O速度较馒,但是由于结构简单,仍广泛用于中、小型磁盘设备中。微机上配置的温盘和软盘,都采用活动磁头结构。
固定头磁盘: 固定头磁盘在每条磁道上都有一个读/写磁头,所有的磁头都被装在一刚性磁臂中,通过这些磁头可访问所有的磁道,可以进行并行读/写操作,有效地提高了磁盘的I/O速度。这种结构的磁盘主要用于大容量磁盘上。
2、数据的组织
磁盘的容量
磁盘设备中,一般包含一个或多个盘片,每片分两面,每面又可分成若干条磁道(即n个同心圆)。最外边的磁道标为0道,最里面的磁道为 n-1道。磁道的个数取决于盘的大小和存储的密度。每个磁道又被划分为若干个扇区,一般被划分成10~100个扇区。每一个扇区是磁盘存储信息和传送信息的基本单位(512字节),又称为存储块,或简称为块。我们常用的3.5英寸的软盘怎样来计算的容量呢?
软盘的容量=每扇区的字节数(512字节)×(扇区数/道)×(磁道数/面)×(面数),所以3.5英寸软盘的总量=512×18×80×2=1.44MB。
一个容量较大的硬盘含有若干个盘片,每一个盘片有上下两个盘面。如果硬盘中有4个盘片,则共有8个磁面。磁盘中处于相同磁道(同心园)位置上,但在不同盘面上的磁道的集合,称为柱面。柱面的序号与磁道的序号相同。
显然,存取同一柱面上各磁道中的信息不必移动磁头。而磁盘存取信息的大部分时间是化费在移动磁头到相应磁道上,所以,把相关信息存储在同一柱面上,可以使存取速度更快,更有效。那么,我们又怎样来计算硬盘的容量呢?
硬盘的容量=每扇区的字节数(512字节)×(扇区数/道)×(柱面数)×(磁头数)例如一个硬盘有15个磁头,8894个柱面,每道63个扇区,则它的容量=512×63×8894×15=4.3GB。
物理扇区号和逻辑扇区号
扇区是磁盘存储和传送信息的基本单位。要在磁盘上访问一个扇区,必须给出其磁道号(或柱面号)、盘面号(磁头号)和扇区号,这样才能准确地定位要访问的扇区,这称为扇区的物理地址,即物理扇区号。由物理扇区号表示的扇区称为绝对扇区。为了方便,操作系统通常将其转变为逻辑扇区号加以管理。编址方式为:在磁道上按扇区号增加,在柱面上按磁道号增加,对整个磁盘从柱面0到最后一个柱面增加。例如,每磁道扇区数为S,每个柱面的磁道数为T,那么可将柱面号i,盘面号为j,扇区号为 k的物理扇号转换为逻辑扇区号为:b=k+S*(T*i+j)。操作系统中,都以逻辑扇号为文件分配扇区,也以逻辑扇号来调用块设备驱动程序,进行磁盘的读/写操作。
3、磁盘(移臂)调度算法
磁盘是可被多个进程共享的设备。当有多个进程都请求访问磁盘时,应采用一种适当的调度算法,以减小各进程对磁盘的平均访问(主要是寻道)时间。目前常用的磁盘调度算法有:先来先服务、最短寻道时间优先、扫描算法和循环扫描算法等。
先来先服务FCFS算法
先来先服务FCFS(First Come First Served)是一种最简单的磁盘调度算法。它根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。但此算法由于未对寻道进行优化,致使平均寻道时间可能较长,(平均响应时间长),各进程响应时间变化幅度较小,公平,进程响应时间可预测。
最短寻道时间优先SSTF算法
该算法总是为那些与当前磁头所在的磁道距离最近请求服务,也就是执行寻道时间最短的那个I/O请求。这种调度算法有较好的平均寻道时间。SSTF较之 FCFS有较好的寻道性能,故曾被广泛采用。
SSTF算法虽然获得较好的寻道性能,但它可能导致某些进程长时间的得不到服务(称之为饥饿现象)。因为只要不断有新进程到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求必被优先满足。对中间磁道访问服务比内、外两侧磁道服务好,造成响应时间变化幅度大,在服务请求多时,内外边缘请求被无限期延迟,不可预期。
扫描(SCAN)算法
为了解决SSTF算法饥饿现象,对 SSTF算法略加修改后所形成了SCAN算法。该算法不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头的当前移动方向。即当磁头正在自里向外运动时,SCAN算法要选择的下一个访问对象是其欲访问的磁道在当前磁道之外,又是距离最近的。直至再无更外的磁道需要访问时,才将磁臂换向,自外向里运动。从而避免了饥饿现象的出现。由于这种算法中磁头移动的规律象电梯的运行,所以又称为电梯调度算法。克服SSTF服务集中中间磁道和响应时间变化较大缺点,两侧磁道的访问的频率低于中间磁道。
循环扫描 CSCAN算法
这是SCAN算法的一种变种算法,是为了提供更均匀的等待时间而设计的。CSCAN算法规定磁头只能单向运动(自里向外),当磁头运动到最外面的被访问磁道时,磁头立即返回到最里面的欲访的磁道,即将最小磁道号紧接着最大磁道号构成循环,进行扫描。
N-Step-SCAN算法
在SSTF、SCAN及CSCAN这几种算法中,都可能出现磁臂停留在某处不动的情况。例如,有一个或几个进程对某一磁道有着较高的访问频率,反复请求对某一磁道进行I/O,从而垄断了整个磁盘设备,把这一现象称为“磁臂粘着”。N步SCAN算法是将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子队列,又按SCAN算法处理队列中的每一个请求,这样就可避免出现粘着现象。当 N值取得很大时,会使其性能接近于SCAN算法;当 N=1时,该算法退化为 FCFS算法。
FSCAN算法
FSCAN算法实质上是N-Step-SCAN算法的简化。它只将磁盘请求访问队列分成两个子队列。一个是当前所有请求磁盘I/O的进程队列,由磁盘调度按SCAN算法进行处理。另一个队列则是在扫描期间,新出现的所有请求磁盘I/O的进程队列,这样所有的新请求都将被推迟到下一次扫描时处理。
小结