======第五章设备管理======
Posted dearQiHao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了======第五章设备管理======相关的知识,希望对你有一定的参考价值。
计算机系统的一个重要组成部分是 I/O 系统。在该系统中包括有用于实现信息输入、输出和存储功能的设备和相应的设备控制器,在有的大、中型机中,还有 I/O 通道或 I/O 处理机。设备管理的对象主要是 I/O 设备,还可能要涉及到设备控制器和 I/O 通道。而设备管理的基本任务是完成用户提出的 I/O 请求,提高 I/O 速率以及提高 I/O 设备的利用率。设备管 理的主要功能有: 缓冲区管理、设备分配、设备处理、虚拟设备及实现设备独立性等。由于 I/O 设备不仅种类繁多,而且它们的特性和操作方式往往相差甚大,这就使得设备管理成为操作系统中最繁杂且与硬件最紧密相关的部分。
5.1 I/O系统
I/O 系统是用于实现数据输入、输出及数据存储的系统。在 I/O 系统中,除 了需要直接用于 I/O 和存储信息的设备外,还需要有相应的设备控制器和高速总线。在有的 大、中型计算机系统中,还配置了 I/O 通道或 I/O 处理机。
5.1.1 I/O设备
- I/O设备的类型
(1) 按设备的使用特性分类
按设备的使用特性,可将设备分为两类。
第一类是存储设备,也称外存或后备存储器、 辅助存储器,是计算机系统用以存储信息的主要设备。该类设备存取速度较内存慢,但容量比内存大得多,相对价格也便宜。
第二类就是输入/输出设备,又具体可分为输入设备、 输出设备和交互式设备。输入设备用来接收外部信息,如键盘、鼠标、扫描仪、视频摄像、 各类传感器等。输出设备是用于将计算机加工处理后的信息送向外部的设备,利用输入设备接收用户命令信息,并通过输出设备(主要是显示器)同步显示用户命令以 及命令执行的结果。
2) 按传输速率分类
按传输速度的高低,可将 I/O 设备分为三类。
第一类是低速设备,这是指其传输速率仅 为每秒钟几个字节至数百个字节的一类设备。属于低速设备的典型设备有键盘、鼠标器、语音的输入和输出等设备。
第二类是中速设备,这是指其传输速率在每秒钟数千个字节至 数十万个字节的一类设备。典型的中速设备有行式打印机、 激光打印机等。
第三类是高速设备,这是指其传输速率在数百个千字节至千兆字节的一类设备。典型的高速设备有磁带 机、磁盘机、光盘机等。
3) 按信息交换的单位分类
按信息交换的单位,可将 I/O 设备分成两类。
第一类是块设备,这类设 备用于存储信息。由于信息的存取总是以数据块为单位,故而得名。它属于有结构设备。 典型的块设备是磁盘,每个盘块的大小为 512 B~4 KB。磁盘设备的基本特征是其传输速率 较高,通常每秒钟为几兆位;另一特征是可寻址,即对它可随机地读/写任一块;此外,磁盘设备的 I/O 常采用 DMA 方式。
第二类是字符设备,用于数据的输入和 输出。其基本单位是字符,故称为字符设备。它属于无结构类型。字符设备的种类繁多, 如交互式终端、打印机等。字符设备的基本特征是其传输速率较低,通常为几个字节至数 千字节;另一特征是不可寻址,即输入/输出时不能指定数据的输入源地址及输出的目标地 址;此外,字符设备在输入/输出时,常采用中断驱动方式。
4) 按设备的共享属性分类
这种分类方式可将 I/O 设备分为如下三类:
(1) 独占设备。这是指在一段时间内只允许一个用户(进程)访问的设备,即临界资源。 因而, 对多个并发进程而言,应互斥地访问这类设备。系统一旦把这类设备分配给了某 进程后,便由该进程独占, 直至用完释放。 应当注意,独占设备的分配有可能引起进程 死锁。
(2) 共享设备。这是指在一段时间内允许多个进程同时访问的设备。当然,对于每一时 刻而言,该类设备仍然只允许一个进程访问。显然,共享设备必须是可寻址的和可随机访 问的设备。典型的共享设备是磁盘。对共享设备不仅可获得良好的设备利用率,而且它也 是实现文件系统和数据库系统的物质基础。
(3) 虚拟设备。这是指通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个 用户(进程)同时使用。
- 设备与控制器之间的接口
通常,设备并不是直接与 CPU 进行通信,而是与设备控制器通信,因此,在 I/O 设备中应含有与设备控制器间的接口,在该接口中有三种类型的信号(见图 5-1 所示),各对应一 条信号线。1)数据信号线
这类信号线用于在设备和设备控制器之间传送数据信号。对输入设备而言,由外界输入的信号经转换器转换后所形成的数据,通常先送入缓冲器中,当数据量达到一定的比特(字 符)数后,再从缓冲器通过一组数据信号线传送给设备控制器,如图 5-1 所示。对输出设备 而言,则是将从设备控制器经过数据信号线传送来的一批数据先暂存于缓冲器中,经转换器作适当转换后,再逐个字符地输出。
2)控制信号线
这是作为由设备控制器向 I/O 设备发送控制信号时的通路。该信号规定了设备将要执行的操作,如读操作(指由设备向控制器传送数据)或写操作(从控制器接收数据),或执行磁头 移动等操作。
3)状态信号线
这类信号线用于传送指示设备当前状态的信号。设备的当前状态有正在读(或写);设备已读(写)完成,并准备好新的数据传送。
5.1.2 设备控制器
设备控制器是计算机中的一个实体,其主要职责是控制一个或多个 I/O 设备,以实现 I/O 设备和计算机之间的数据交换。它是 CPU 与 I/O 设备之间的接口,它接收从 CPU 发来的命 令,并去控制 I/O 设备工作,以使处理机从繁杂的设备控制事务中解脱出来。
设备控制器是一个可编址的设备,当它仅控制一个设备时,它只有一个唯一的设备地址;若控制器可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个 设备。
设备控制器的复杂性因不同设备而异,相差甚大,于是可把设备控制器分成两类: 一类是用于控制字符设备的控制器,另一类是用于控制块设备的控制器。在微型机和小型机中 的控制器,常做成印刷电路卡形式,因而也常称为接口卡,可将它插入计算机。有些控制 器还可以处理两个、四个或八个同类设备。
- 设备控制器的基本功能
1) 接收和识别命令
CPU 可以向控制器发送多种不同的命令,设备控制器应能接收并识别这些命令。为此, 在控制器中应具有相应的控制寄存器,用来存放接收的命令和参数,并对所接收的命令进行译码。相应地,在磁盘控制器中有多个寄存器和命令译码器等。
2) 数据交换
这是指实现 CPU 与控制器之间、控制器与设备之间的数据交换。对于前者,是通过数据总线,由 CPU 并行地把数据写入控制器,或从控制器中并行地读出数据;对于后者,是 设备将数据输入到控制器, 或从控制器传送给设备。 为此, 在控制器中须设置数据寄存器。
3) 标识和报告设备的状态
控制器应记下设备的状态供 CPU 了解。为此, 在控制器中应设置一状态寄存器, 用其中的每一位来反映设备的某一种状态。当 CPU 将该寄存器的内容读入后,便可了解该设备的 状态。
4) 地址识别
就像内存中的每一个单元都有一个地址一样,系统中的每一个设备也都有一个地址, 而设备控制器又必须能够识别它所控制的每个设备的地址。此外,为使 CPU 能向(或从)寄 存器中写入(或读出)数据,这些寄存器都应具有唯一的地址。为此, 在控制器中应配置地址译码器。
5) 数据缓冲
由于 I/O 设备的速率较低而 CPU 和内存的速率却很高,故在控制器中必须设置一缓冲器。在输出时,用此缓冲器暂存由主机高速传来的数据,然后才以 I/O 设备所具有的速率将缓冲器中的数据传送给 I/O 设备;在输入时,缓冲器则用于暂存从 I/O 设备送来的数据,待 接收到一批数据后,再将缓冲器中的数据高速地传送给主机。
6) 差错控制
设备控制器还兼管对由 I/O 设备传送来的数据进行差错检测。若发现传送中出现了错误,通常是将差错检测码置位,并向 CPU 报告,于是 CPU 将本次传送来的数据作废,并重 新进行一次传送。这样便可保证数据输入的正确性。
- 设备控制器的组成
由于设备控制器位于 CPU 与设备之间,它既要与 CPU 通信,又要与设备通信,还应具有按照 CPU 所发来的命令去控制设备工作的功能,因此,现有的大多数控制器都是由以下 三部分组成的。
1) 设备控制器与处理机的接口
该接口用于实现 CPU 与设备控制器之间的通信。共有三类信号线: 数据线、地址线和控制线。数据线通常与两类寄存器相连接,
第一类是数据寄存器(在控制器中可以有一个或多个数据寄存器,用于存放从设备送来的数据(输入)或从 CPU 送来的数据(输出));
第二类是控制/状态寄存器(在控制器中可以有一个或多个这类寄存器,用于存放从 CPU 送来的控制信息或设备的状态信息)。
2) 设备控制器与设备的接口
在一个设备控制器上,可以连接一个或多个设备。相应地,在控制器中便有一个或多个设备接口,一个接口连接一台设备。在每个接口中都存在数据、控制和状态三种类型的 信号。控制器中的 I/O 逻辑根据处理机发来的地址信号去选择一个设备接口。
3) I/O 逻辑
在设备控制器中的 I/O 逻辑用于实现对设备的控制。它通过一组控制线与处理机交互, 处理机利用该逻辑向控制器发送 I/O 命令;I/O 逻辑对收到的命令进行译码。每当 CPU 要启动一个设备时,一方面将启动命令发送给控制器;另一方面又同时通过地址线把地址发送给控制器,由控制器的 I/O 逻辑对收到的地址进行译码,再根据所译出的命令对所选设备进行控制。设备控制器的组成示于图 5-2 中。
5.1.3 I/O通道
- I/O通道设备的引入
虽然在 CPU 与 I/O 设备之间增加了设备控制器后,已能大大减少 CPU 对 I/O 的干预, 但当主机所配置的外设很多时,CPU 的负担仍然很重。为此,在 CPU 和设备控制器之间又增设了通道。其主要目的是为了建立独立的 I/O 操作,不仅使数据的传送能独立于 CPU, 而且也希望有关对 I/O 操作的组织、 管理及其结束处理尽量独立,以保证 CPU 有更多的时 间去进行数据处理;或者说,其目的是使一些原来由 CPU 处理的 I/O 任务转由通道来承担, 从而把 CPU 从繁杂的 I/O 任务中解脱出来。在设置了通道后,CPU 只需向通道发送一条 I/O 指令。通道在收到该指令后,便从内存中取出本次要执行的通道程序,然后执行该通道程序,仅当通道完成了规定的 I/O 任务后,才向 CPU 发中断信。
实际上,I/O 通道是一种特殊的处理机,它具有执行 I/O 指令的能力,并通过执行通道 (I/O)程序来控制 I/O 操作。但 I/O 通道又与一般的处理机不同,主要表现在以下两个方面:
一 是其指令类型单一,这是由于通道硬件比较简单,其所能执行的命令主要局限于与 I/O 操作 有关的指令;
二是通道没有自己的内存,通道所执行的通道程序是放在主机的内存中的, 换言之,是通道与 CPU 共享内存。
- 通道类型
1) 字节多路通道(Byte Multiplexor Channel)
这是一种按字节交叉方式工作的通道。它通常都含有许多非分配型子通道,其数量可 从几十到数百个,每一个子通道连接一台 I/O 设备,并控制该设备的 I/O 操作。这些子通道按时间片轮转方式共享主通道。当第一个子通道控制其 I/O 设备完成一个字节的交换后,便 立即腾出主通道,让给第二个子通道使用;当第二个子通道也完成一个字节的交换后,同样也把主通道让给第三个子通道;依此类推。当所有子通道轮转一周后,重又返回来由第 一个子通道去使用字节多路主通道。这样,只要字节多路通道扫描每个子通道的速率足够快,而连接到子通道上的设备的速率不是太高时,便不致丢失信息。
图 5-3 示出了字节多路通道的工作原理。它所含有的多个子通道 A,B,C,D,E,…, N,…分别通过控制器各与一台设备相连。假定这些设备的速率相近,且都同时向主机传送数据。设备 A 所传送的数据流为 A1 A2 A3 …;设备 B 所传送的数据流为 B1 B2 B3 …把这些数 据流合成后(通过主通道)送往主机的数据流为 A1 B1 C1 D 1 …A2 B2 C2 D 2 … A3 B3 C3 D 3 …。
2) 数组选择通道(Block Selector Channel)
图 5-3 示出了字节多路通道的工作原理。它所含有的多个子通道 A,B,C,D,E,…, N,…分别通过控制器各与一台设备相连。假定这些设备的速率相近,且都同时向主机传送 数据。设备 A 所传送的数据流为 A1 A2 A3 …;设备 B 所传送的数据流为 B1 B2 B3 …把这些数 据流合成后(通过主通道)送往主机的数据流为 A1 B1 C1 D 1 …A2 B2 C2 D 2 … A3 B3 C3 D 3 …。
字节多路通道不适于连接高速设备,这推动了按数组方式进行数据传送的数组选择通道的形成。这种通道虽然可以连接多台高速设备,但由于它只含有一个分配型子通道,在 一段时间内只能执行一道通道程序,控制一台设备进行数据传送,致使当某台设备占用了该通道后,便一直由它独占,即使是它无数据传送,通道被闲置,也不允许其它设备使用 该通道,直至该设备传送完毕释放该通道。可见,这种通道的利用率很低。
3) 数组多路通道(Block Multiplexor Channel)
数组选择通道虽有很高的传输速率,但它却每次只允许一个设备传输数据。数组多路通道是将数组选择通道传输速率高和字节多路通道能使各子通道(设备)分时并行操作的优 点相结合而形成的一种新通道。它含有多个非分配型子通道,因而这种通道既具有很高的数据传输速率,又能获得令人满意的通道利用率。也正因此,才使该通道能被广泛地用于 连接多台高、中速的外围设备,其数据传送是按数组方式进行的。
- 瓶颈问题
由于通道价格昂贵,致使机器中所设置的通道数量势必较少,这往往又使它成了 I/O 的瓶颈,进而造成整个系统吞吐量的下降。例如,在图 5-4 中,假设设备 1 至设备 4 是四个磁盘, 为了启动磁盘 4,必须用通道 1 和控制器 2;但若这两者已被其它设备占用,必然无法启动磁 盘4。类似地,若要启动盘 1 和盘 2,由于它们都要用到通道 1,因而也不可能启动。这些就是 由于通道不足所造成的“瓶颈”现象。
解决“瓶颈”问题的最有效的方法,便是增加设备到主机间的通路而不增加通道,如 图 5-5 所示。换言之,就是把一个设备连接到多个控制器上,而一个控制器又连接到多个通 道上。图中的设备 1、2、3 和 4,都有四条通往存储器的通路。例如,通过控制器 1 和通道 1 到存储器;也可通过控制器 2 和通道 1 到存储器。多通路方式不仅解决了“瓶颈”问题, 而且提高了系统的可靠性, 因为个别通道或控制器的故障不会使设备和存储器之间没有通路。
5.1.4 总线系统
由图 5-6 可以看出,在计算机系统中的各部件,如 CPU、存储器以及各种 I/O 设备之间的联系,都是通过总线来实现的。总线的性能是用总线的时钟频率、带宽和相应的总线 传输速率等指标来衡量的。随着计算机中 CPU 和内存速率的提高,字长的增加,以及不断地引入新型设备,促使人们对总线的时钟频率、带宽和传输速率的要求也不断提高。这便推动了总线的不断发展,使之由早期的 ISA 总线发展为 EISA 总线、VESA 总线,进而又演变成当前广为流行的 PCI 总线。
- ISA 和 EISA 总线
1) ISA(Industry Standard Architecture)总线
这是为在 1984 年推出的 80286 型微机而设计的总线结构。其总线的带宽为 8 位,最高 传输速率为 2 Mb/s。之后不久又推出了 16 位的(EISA)总线,其最高传输速率为 8 Mb/s,后 又升至 16 Mb/s,能连接 12 台设备。
2) EISA(Extended ISA)总线
到 20 世纪 80 年代末期,ISA 总线已难于满足带宽和传输速率的要求,于是人们又开发 出扩展 ISA(EISA)总线,其带宽为 32 位,总线的传输速率高达 32 Mb/s,同样可以连接 12 台外部设备。
- 局部总线
1) VESA(Video Electronic Standard Association)总线
该总线的设计思想是以低价位迅速占领市场。VESA 总线的带宽为 32 位,最高传输速 率为 132 Mb/s。它在 20 世纪 90 年代初被推出时,广泛应用于 486 微机中。但 VESA 总线 仍存在较严重的缺点,比如,它所能连接的设备数仅为 2~4 台,在控制器中无缓冲,故难 于适应处理器速度的不断提高,也不能支持后来出现的 Pentium 微机。
2) PCI(Peripheral Component Interface)总线
随着 Pentium 系列芯片的推出,Intel 公司分别在 1992 年和 1995 年颁布了 PCI 总线的 V1.0 和 V2.1 规范,后者支持 64 位系统。PCI 在 CPU 和外设间插入一复杂的管理层,用于 协调数据传输和提供一致的接口。在管理层中配有数据缓冲,通过该缓冲可将线路的驱动 能力放大,使 PCI 最多能支持 10 种外设,并使高时钟频率的 CPU 能很好地运行,最大传 输速率可达 132 Mb/s。PCI 既可连接 ISA、EISA 等传统型总线,又可支持 Pentium 的 64 位 系统,是基于奔腾等新一代微处理器而发展的总线。
5.2 I/O 控制方式
随着计算机技术的发展,I/O 控制方式也在不断地发展。在早期的计算机系统中,是采 用程序 I/O 方式;当在系统中引入中断机制后,I/O 方式便发展为中断驱动方式;此后,随 着 DMA 控制器的出现,又使 I/O 方式在传输单位上发生了变化,即从以字节为单位的传输 扩大到以数据块为单位进行转输,从而大大地改善了块设备的 I/O 性能;而通道的引入,又 使对 I/O 操作的组织和数据的传送都能独立地进行而无需 CPU 干预。应当指出,在 I/O 控制方式的整个发展过程中,始终贯穿着这样一条宗旨,即尽量减少主机对 I/O 控制的干预, 把主机从繁杂的 I/O 控制事务中解脱出来,以便更多地去完成数据处理任务。
5.2.1 程序 I/O 方式
早期的计算机系统中, 由于无中断机构, 处理机对 I/O 设备的控制采取程序 I/O(Programmed I/O)方式,或称为忙—等待方式,即在处理机向控制器发出一条 I/O 指令启动输入设备输入数据时,要同时把状态寄存器中的忙/闲标志 busy 置为 1,然后便不断地循环测试 busy。当 busy=1 时,表示输入机尚未输完一个字(符),处理机应继续对该标志进行 测试,直至 busy=0,表明输入机已将输入数据送入控制器的数据寄存器中。于是处理机将 数据寄存器中的数据取出,送入内存指定单元中,这样便完成了一个字(符)的 I/O。接着再去启动读下一个数据,并置 busy=1。图 5-7(a)示出了程序 I/O 方式的流程。
在程序 I/O 方式中,由于 CPU 的高速性和 I/O 设备的低速性,致使 CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成对 CPU 的极大浪费。在该方式中, CPU 之所以要不断地测试 I/O 设备的状态,就是因为在 CPU 中无中断机构,使 I/O 设备无法向 CPU 报告它已完成了一个字符的输入操作。
5.2.2 中断驱动 I/O 控制方式
现代计算机系统中,都毫无例外地引入了中断机构,致使对 I/O 设备的控制,广泛采用 中断驱动(Interrupt Driven)方式,即当某进程要启动某个 I/O 设备工作时,便由 CPU 向相应 的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定 I/O 设备。此时,CPU 与 I/O 设备并行操作。例如,在输入时,当 设备控制器收到 CPU 发来的读命令后,便去控制相应的输入设备读数据。一旦数据进入数据寄存器,控制器便通过控制线向 CPU 发送一中断信号,由 CPU 检查输入过程中是否出错, 若无错,便向控制器发送取走数据的信号,然后再通过控制器及数据线将数据写入内存指 定单元中。图 5-7(b)示出了中断驱动方式的流程。
在 I/O 设备输入每个数据的过程中,由于无需 CPU 干预,因而可使 CPU 与 I/O 设备并行工作。仅当输完一个数据时,才需 CPU 花费极短的时间去做些中断处理。可见,这样可使 CPU 和 I/O 设备都处于忙碌状态,从而提高了整个系统的资源利用率及吞吐量。
5.2.3 直接存储器访问(DMA)I/O 控制方式
- DMA控制方式的引入
虽然中断驱动 I/O 比程序 I/O 方式更有效,但须注意,它仍是以字(节)为单位进行 I/O 的,每当完成一个字(节)的 I/O 时,控制器便要向 CPU 请求一次中断。换言之,采用中断 驱动 I/O 方式时的 CPU 是以字(节)为单位进行干预的。如果将这种方式用于块设备的 I/O, 显然是极其低效的。例如,为了从磁盘中读出 1 KB 的数据块,需要中断 CPU 1K 次。为了 进一步减少 CPU 对 I/O 的干预而引入了直接存储器访问方式,见图 5-7©所示。该方式的 特点是:
(1) 数据传输的基本单位是数据块,即在 CPU 与 I/O 设备之间,每次传送至少一个数 据块;
(2) 所传送的数据是从设备直接送入内存的,或者相反;
(3) 仅在传送一个或多个数据块的开始和结束时,才需 CPU 干预,整块数据的传送是在控制器的控制下完成的。 可见,DMA 方式较之中断驱动方式,又是成百倍地减少了 CPU 对 I/O 的干预,进一步提高了 CPU 与 I/O 设备的并行操作程度。
- DMA 控制器的组成
DMA 控制器由三部分组成:主机与 DMA 控制器的接口;DMA 控制器与块设备的接口;I/O 控制逻辑。图 5-8 示出了 DMA 控制器的组成。这里主要介绍主机与控制器之间的 接口。 为了实现在主机与控制器之间成块数据的直接交换,必须在 DMA 控制器中设置如下四 类寄存器:
(1) 命令/状态寄存器(CR)。用于接收从 CPU 发来的 I/O 命令,或有关控制信息,或设 备的状态。
(2) 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地 址;在输出时,它存放由内存到设备的内存源地址。
(3) 数据寄存器(DR)。用于暂存从设备到内存,或从内存到设备的数据。
(4) 数据计数器(DC)。存放本次 CPU 要读或写的字(节)数。
- DMA 工作过程
我们以从磁盘读入数据为例,来说明 DMA 方式的工作流程。当 CPU 要从磁盘读入一数据块时,便向磁盘控制器发送一条读命令。该命令被送到其中的命令寄存器(CR)中。同时,还须发送本次要将数据读入的内存起始目标地址,该地址被送入内存地址寄存器(MAR) 中;本次要读数据的字(节)数则送入数据计数器(DC)中,还须将磁盘中的源地址直接送至DMA 控制器的 I/O 控制逻辑上。然后,启动 DMA 控制器进行数据传送,以后,CPU 便可 去处理其它任务。此后,整个数据传送过程便由 DMA 控制器进行控制。当 DMA 控制器已 从磁盘中读入一个字(节)的数据并送入数据寄存器(DR)后,再挪用一个存储器周期,将该字 (节)传送到 MAR 所指示的内存单元中。接着便对 MAR 内容加 1,将 DC 内容减 1。若减 1 后 DC 内容不为 0,表示传送未完,便继续传送下一个字(节);否则,由 DMA 控制器发出中断请求。图 5-9 是 DMA 方式的工作流程。
5.2.4 I/O 通道控制方式
- I/O 通道控制方式的引入
虽然 DMA 方式比起中断方式来已经显著地减少了 CPU 的干预,即已由以字(节)为单位的干预减少到以数据块为单位的干预,但 CPU 每发出一条 I/O 指令,也只能去读(或写) 一个连续的数据块。而当我们需要一次去读多个数据块且将它们分别传送到不同的内存区域,或者相反时,则须由 CPU 分别发出多条 I/O 指令及进行多次中断处理才能完成。
I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU 的干预,即把对一个数据块的 读(或写)为单位的干预减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。 同时,又可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。例如,当 CPU 要完成一组相关的读(或写)操作及有关控制时,只需向 I/O 通道 发送一条 I/O 指令,以给出其所要执行的通道程序的首址和要访问的 I/O 设备,通道接到该 指令后,通过执行通道程序便可完成 CPU 指定的 I/O 任务。
- 通道程序
通道是通过执行通道程序,并与设备控制器共同实现对 I/O 设备的控制的。通道程序是由一系列通道指令(或称为通道命令)所构成的。通道指令与一般的机器指令不同,在它的每条指令中都包含下列诸信息:
(1) 操作码。操作码规定了指令所执行的操作,如读、写、控制等操作。
(2) 内存地址。内存地址标明字符送入内存(读操作)和从内存取出(写操作)时的内存 首址。
(3) 计数。该信息表示本条指令所要读(或写)数据的字节数。
(4) 通道程序结束位 P。该位用于表示通道程序是否结束。P=1 表示本条指令是通道程 序的最后一条指令。
(5) 记录结束标志 R。R=0 表示本通道指令与下一条指令所处理的数据是同属于一个记 录;R=1 表示这是处理某记录的最后一条指令。
下面示出了一个由六条通道指令所构成的简单的通道程序。该程序的功能是将内存中 不同地址的数据写成多个记录。其中,前三条指令是分别将 813~892 单元中的 80个字符 和 1034~1173 单元中的 140 个字符及 5830~5889 单元中的 60 个字符写成一个记录;第 4 条指令是单独写一个具有 300 个字符的记录;第 5、6 条指令共写含 500 个字符的记录。
5.3 缓冲管理
5.3.1 缓冲的引入
在设备管理中,引入缓冲区的主要原因可归结为以下几点:、
(1) 缓和 CPU 与 I/O 设备间速度不匹配的矛盾。事实上,凡在数据到达速率与其离去 速率不同的地方,都可设置缓冲区,以缓和它们之间速率不匹配的矛盾。众所周知,CPU 的运算速率远远高于 I/O 设备的速率,如果没有缓冲区,则在输出数据时,必然会由于打印 机的速度跟不上而使 CPU 停下来等待;然而在计算阶段,打印机又空闲无事。显然,如果 在打印机或控制器中设置一缓冲区,用于快速暂存程序的输出数据,以后由打印机“慢慢 地”从中取出数据打印,这样,就可提高 CPU 的工作效率。类似地,在输入设备与 CPU 之 间也设置缓冲区,也可使 CPU 的工作效率得以提高。
(2) 减少对 CPU 的中断频率,放宽对 CPU 中断响应时间的限制。在远程通信系统中, 如果从远地终端发来的数据仅用一位缓冲来接收,如图 5-10(a)所示,则必须在每收到一位 数据时便中断一次 CPU,这样,对于速率为 9.6 Kb/s 的数据通信来说,就意味着其中断 CPU 的频率也为 9.6 Kb/s,即每 100 μs 就要中断 CPU 一次,而且 CPU 必须在 100 μs 内予以响应, 否则缓冲区内的数据将被冲掉。倘若设置一个具有 8 位的缓冲(移位)寄存器,如图 5-10(b) 所示,则可使 CPU 被中断的频率降低为原来的 1/8;若再设置一个 8 位寄存器,如图 5-10© 所示,则又可把 CPU 对中断的响应时间放宽到 800 μs。
(3) 提高 CPU 和 I/O 设备之间的并行性。缓冲的引入可显著地提高 CPU 和 I/O 设备间 的并行操作程度,提高系统的吞吐量和设备的利用率。例如,在 CPU 和打印机之间设置了 缓冲区后,便可使 CPU 与打印机并行工作。
5.3.2 单缓冲和双缓冲
- 单缓冲
在单缓冲情况下,每当用户进程发出一 I/O 请求时,操作系统便在主存中为之分配一 缓冲区,如图 5-11 所示。在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间 为 T,操作系统将该缓冲区中的数据传送到用户区的时间为 M,而 CPU 对这一块数据处 理(计算)的时间为 C。由于 T 和 C 是可以并行的(见图 5-11),当 T>C 时,系统对每一块 数据的处理时间为 M+T, 反之则为 M+C, 故可把系统对每一块数据的处理时间表示为 Max(C,T)+M。
在字符设备输入时,缓冲区用于暂存用户输入的一行数据,在输入期间,用户进程被 挂起以等待数据输入完毕;在输出时,用户进程将一行数据输入到缓冲区后,继续进行处 理。当用户进程已有第二行数据输出时,如果第一行数据尚未被提取完毕,则此时用户进 程应阻塞。
- 双缓冲
为了加快输入和输出速度, 提高设备利用率, 人们又引入了双缓冲区机制,也称为 缓冲对换(Buffer Swapping)。在设备输入时,先将数据送入第一缓冲区,装满后便转向第 二缓冲区。此时操作系统可以从第一缓冲区中移出数据,并送入用户进程(见图 5-12)。接 着由 CPU 对数据进行计算。在双缓冲时, 系统处理一块数据的时间可以粗略地认为是 Max(C,T)。如果 C<T,可使块设备连续输入;如果 C>T,则可使 CPU 不必等待设备输入。 对于字符设备,若采用行输入方式,则采用双缓冲通常能消除用户的等待时间,即用户在 输入完第一行之后,在 CPU 执行第一行中的命令时,用户可继续向第二缓冲区输入下一行 数据。
如果我们在实现两台机器之间的通信时,仅为它们配置了单缓冲,如图 5-13(a)所示, 那么,它们之间在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从 A 机传 送到 B 机,或者从 B 机传送到 A 机,而绝不允许双方同时向对方发送数据。为了实现双向 数据传输,必须在两台机器中都设置两个缓冲区,一个用作发送缓冲区,另一个用作接收 缓冲区,如图 5-13(b)所示。
5.3.3 循环缓冲
当输入与输出或生产者与消费者的速度基本相匹配时,采用双缓冲能获得较好的效果, 可使生产者和消费者基本上能并行操作。但若两者的速度相差甚远,双缓冲的效果则不够理想,不过可以随着缓冲区数量的增加,使情况有所改善。因此,又引入了多缓冲机制。 可将多个缓冲组织成循环缓冲形式。对于用作输入的循环缓冲,通常是提供给输入进程或 计算进程使用,输入进程不断向空缓冲区输入数据,而计算进程则从中提取数据进行计算。
- 循环缓冲的组成
(1) 多个缓冲区。在循环缓冲中包括多个缓冲区,其每个缓冲区的大小相同。作为输入 的多缓冲区可分为三种类型:用于装输入数据的空缓冲区 R、已装满数据的缓冲区 G 以及 计算进程正在使用的现行工作缓冲区 C,如图 5-14 所示。
(2) 多个指针。作为输入的缓冲区可设置三个指针:用于指示计算进程下一个可用缓冲 区 G 的指针 Nextg、指示输入进程下次可用的空缓冲区 R 的指针 Nexti,以及用于指示计算 进程正在使用的缓冲区 C 的指针 Current。
- 循环缓冲去的使用
计算进程和输入进程可利用下述两个过程来使用循环缓冲区。
(1) Getbuf 过程。当计算进程要使用缓冲区中的数据时,可调用 Getbuf 过程。该过程 将由指针 Nextg 所指示的缓冲区提供给进程使用,相应地,须把它改为现行工作缓冲区, 并令 Current 指针指向该缓冲区的第一个单元,同时将 Nextg 移向下一个 G 缓冲区。类似地, 每当输入进程要使用空缓冲区来装入数据时,也调用 Getbuf 过程,由该过程将指针 Nexti 所指示的缓冲区提供给输入进程使用,同时将 Nexti 指针移向下一个 R 缓冲区。
(2) Releasebuf 过程。当计算进程把 C 缓冲区中的数据提取完毕时,便调用 Releasebuf 过程,将缓冲区 C 释放。此时,把该缓冲区由当前(现行)工作缓冲区 C 改为空缓冲区 R。类 似地,当输入进程把缓冲区装满时,也应调用 Releasebuf 过程,将该缓冲区释放,并改为 G 缓冲区。
- 进程同步
使用输入循环缓冲,可使输入进程和计算进程并行执行。相应地,指针 Nexti 和指针 Nextg 将不断地沿着顺时针方向移动,这样就可能出现下述两种情况:
(1) Nexti 指针追赶上 Nextg 指针。这意味着输入进程输入数据的速度大于计算进程处理数据的速度,已把全部可用的空缓冲区装满,再无缓冲区可用。此时,输入进程应阻塞, 直到计算进程把某个缓冲区中的数据全部提取完,使之成为空缓冲区 R,并调用 Releasebuf 过程将它释放时,才将输入进程唤醒。这种情况被称为系统受计算限制。
(2) Nextg 指针追赶上 Nexti 指针。这意味着输入数据的速度低于计算进程处理数据的速度,使全部装有输入数据的缓冲区都被抽空,再无装有数据的缓冲区供计算进程提取数 据。这时,计算进程只能阻塞,直至输入进程又装满某个缓冲区,并调用 Releasebuf 过程 将它释放时,才去唤醒计算进程。这种情况被称为系统受 I/O 限制。
5.3.4 缓冲池
- 缓冲池的组成
对于既可用于输入又可用于输出的公用缓冲池, 其中至少应含有以下三种类型的缓冲区:
① 空(闲)缓冲区;
② 装满输入数据的缓冲区;
③ 装满输出数据的缓冲区。
为了管理上的方便,可将相同类型的缓冲区链成一个队列,于是可形成以下三个队列:
(1) 空缓冲队列 emq。这是由空缓冲区所链成的队列。其队首指针 F(emq)和队尾指针 L(emq)分别指向该队列的首缓冲区和尾缓冲区。
(2) 输入队列 inq。这是由装满输入数据的缓冲区所链成的队列。其队首指针 F(inq)和 队尾指针 L(inq)分别指向该队列的首缓冲区和尾缓冲区。
(3) 输出队列 outq。这是由装满输出数据的缓冲区所链成的队列。其队首指针 F(outq)和队尾指针 L(outq)分别指向该队列的首缓冲区和尾缓冲区。
除了上述三个队列外,还应具有四种工作缓冲区:
① 用于收容输入数据的工作缓冲区;
② 用于提取输入数据的工作缓冲区;
③ 用于收容输出数据的工作缓冲区;④ 用于提取输 出数据的工作缓冲区。
- Getbuf 过程和 Putbuf 过程
在“数据结构”课程中,曾介绍过队列和对队列进行操作的两个过程,它们是:
(1) Addbuf(type,number)过程。该过程用于将由参数 number 所指示的缓冲区 B 挂在 type 队列上。
(2) Takebuf(type)过程。该过程用于从 type 所指示的队列的队首摘下一个缓冲区。 这两个过程能否用于对缓冲池中的队列进行操作呢?答案是否定的。因为缓冲池中的 队列本身是临界资源,多个进程在访问一个队列时,既应互斥,又须同步。为此,需要对 这两个过程加以改造,以形成可用于对缓冲池中的队列进行操作的 Getbuf 和 Putbuf 过程。 为使诸进程能互斥地访问缓冲池队列,可为每一队列设置一个互斥信号量 MS(type)。 此外, 为了保证诸进程同步地使用缓冲区, 又为每个缓冲队列设置了一个资源信号量 RS(type)。既可实现互斥又可保证同步的 Getbuf 过程和 Putbuf 过程描述如下:
Procedure Getbuf(type)
begin
Wait(RS(type));
Wait(MS(type));
B(number):=Takebuf(type);
Signal(MS(type));
end
Procedure Putbuf(type, number)
begin
Wait(MS(type));
Addbuf(type, number);
Signal(MS(type));
Signal(RS(type));
end
- 缓冲区的工作方式
缓冲区可以工作在收容输入、提取输入、收容输出和提取输出四种工作方式下,如图 5-15 所示。
(1) 收容输入。在输入进程需要输入数据时,便调用 Getbuf(emq)过程,从空缓冲队列 emq 的队首摘下一空缓冲区,把它作为收容输入工作缓冲区 hin。然后,把数据输入其中, 装满后再调用 Putbuf(inq,hin)过程,将该缓冲区挂在输入队列 inq 上。
(2) 提取输入。当计算进程需要输入数据时,调用 Getbuf(inq)过程,从输入队列 inq 的 队首取得一个缓冲区,作为提取输入工作缓冲区(sin),计算进程从中提取数据。计算进程用 完该数据后,再调用 Putbuf(emq,sin)过程,将该缓冲区挂到空缓冲队列 emq 上。
(3) 收容输出。当计算进程需要输出时,调用 Getbuf(emq)过程从空缓冲队列 emq 的队 首取得一个空缓冲区,作为收容输出工作缓冲区 hout。当其中装满输出数据后,又调用 Putbuf(outq,hout)过程,将该缓冲区挂在 outq 末尾。
(4) 提取输出。由输出进程调用 Getbuf(outq)过程,从输出队列的队首取得一装满输出 数据的缓冲区,作为提取输出工作缓冲区 sout。在数据提取完后,再调用 Putbuf(emq,sout) 过程,将该缓冲区挂在空缓冲队列末尾。
5.4 I/O 软件
5.4.1 I/O 软件的设计目标和原则
1) 与具体设备无关
对于 I/O 系统中许多种类不同的设备,作为程序员,只需要知道如何使用这些资源来完 成所需要的操作,而无需了解设备的有关具体实现细节。
为了提高 OS 的可移植性和易适应性,I/O 软件应负责屏蔽设备的具体细节,向高层软件提供抽象的逻辑设备,并完成逻辑设备与具体物理设备的映射。
对于操作系统本身而言,应允许在不需要将整个操作系统进行重新编译的情况下,增添新的设备驱动程序,以方便新的 I/O 设备的安装。如在 Windows 中,系统可以为新 I/O 设备自动安装和寻找驱动程序,从而实现即插即用。
2) 统一命名
要实现上述的设备无关性,其中一项重要的工作就是如何给 I/O 设备命名。不同的操作 系统有不同的命名规则,一般而言,是在系统中对各类设备采取预先设计的、统一的逻辑 名称进行命名,所有软件都以逻辑名称访问设备。这种统一命名与具体设备无关,换言之, 同一个逻辑设备的名称,在不同的情况下可能对应于不同的物理设备。
3) 对错误的处理
对于错误的处理,应该尽可能在接近硬件的层面处理,在低层软件能够解决的错误就不让高层软件感知,只有低层软件解决不了的错误才通知高层软件解决。许多情况下,错误恢复可以在低层得到解决,而高层软件 不需要知道。
4) 缓冲技术
由于 CPU 与设备之间的速度差异,无论是块设备还是字符设备,都需要使用缓冲技术。 对于不同类型的设备,其缓冲区(块)的大小是不一样的,块设备的缓冲是以数据块为单位的, 而字符设备的缓冲则以字节为单位。就是同类型的设备,其缓冲区(块)的大小也是存在差异 的,如不同的磁盘,其扇区的大小有可能不同。因此,I/O 软件应能屏蔽这种差异,向高层 软件提供统一大小的数据块或字符单元,使得高层软件能够只与逻辑块大小一致的抽象设 备进行交互。
5) 设备的分配和释放
对于系统中的共享设备,如磁盘等,可以同时为多个用户服务。对于这样的设备,应 该允许多个进程同时对其提出 I/O 请求。但对于独占设备,对其分配和释放的不当,将引起混乱,甚至死锁。对于独占设备 和共享设备带来的许多问题,I/O 软件必须能够同时进行妥善的解决。
6) I/O 控制方式
针对具有不同传输速率的设备,综合系统效率和系统代价等因素,合理选择 I/O 控制方 式,如像打印机等低速设备应采用中断驱动方式,而对磁盘等高速设备则采用 DMA 控制方 式等,以提高系统的利用率。为方便用户,I/O 软件也应屏蔽这种差异,向高层软件提供统 一的操作接口。
综上所述,I/O 软件涉及的面非常宽,往下与硬件有着密切的关系,往上又与用户直接 交互,它与进程管理、存储器、文件管理等都存在着一定的联系,即它们都可能需要 I/O 软 件来实现 I/O 操作。为使十分复杂的 I/O 软件能具有清晰的结构,更好的可移植性和易适应 性,目前在 I/O 软件中已普遍采用了层次式结构,将系统中的设备操作和管理软件分为若干个层次,每一层都利用其下层提供的服务,完成输入、输出功能中的某些子功能,并屏蔽 这些功能实现的细节,向高层提供服务。 在层次式结构的 I/O 软件中,只要层次间的接口不变,对每个层次中的软件进行的修改 都不会引起其下层或高层代码的变更,仅最低层才会涉及到硬件的具体特性。通常把 I/O 软 件组织成四个层次,如图 5-16 所示(图中的箭头表示 I/O 的控制流)。各层次及其功能如下 所述:
(1) 用户层软件:实现与用户交互的接口,用户可直接调用在用户层提供的、与 I/O 操 作有关的库函数,对设备进行操作。
(2) 设备独立性软件:负责实现与设备驱动器的统一接口、设备命名、设备的保护以及 设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。
(3) 设备驱动程序:与硬件直接相关,负责具体实现系统对设备发出的操作指令, 驱动I/O设备工作的驱动程序。
(4) 中断处理程序:用于保存被中断进程的 CPU 环境,转入相应的中断处理程序进行 处理,处理完后再恢复被中断进程的现场后返回到被中断进程。
例如,当一个用户进程试图从文件中读一个数据块时,需要通过系统调用以取得操作 系统的服务来完成,设备独立性软件接收到请求后,首先在高速缓存中查找相应的页面, 如果没有,则调用设备驱动程序向硬件发出一个请求,并由驱动程序负责从磁盘读取目标 数据块。当磁盘操作完成后,由硬件产生一个中断,并转入中断处理程序,检查中断原因, 提取设备状态,转入相应的设备驱动程序,唤醒用户进程以及结束此次 I/O 请求,继续用户 进程的运行。
实际上,在不同的操作系统中,这种层次的划分并不是固定的,主要是随系统具体情 况的不同,而在层次的划分以及各层的功能和接口上存在一定的差异。下面我们将从低到 高地对每个层次进行讨论。
5.4.2 中断处理程序
-
唤醒被阻塞的驱动(程序)进程
当中断处理程序开始执行时,首先去唤醒处于阻塞状态的驱动(程序)进程。如果是采用 了信号量机制,则可通过执行 signal 操作,将处于阻塞状态的驱动(程序)进程唤醒;在采用 信号机制时,将发送一信号给阻塞进程。 -
保护被中断进程的 CPU 环境
通常由硬件自动将处理机状态字 PSW 和程序计数器(PC)中的内容,保存在中断保留区 (栈)中,然后把被中断进程的 CPU 现场信息(即包括所有的 CPU 寄存器,如通用寄存器、段 寄存器等内容)都压入中断栈中,因为在中断处理时可能会用到这些寄存器。图 5-17 给出了 一个简单的保护中断现场的示意图。该程序是指令在 N 位置时被中断的,程序计数器中的 内容为 N+1,所有寄存器的内容都被保留在栈中。
-
转入相应的设备处理程序
由处理机对各个中断源进行测试,以确定引起本次中断的 I/O 设备,并发送一应答信号给发出中断请求的进程,使之消除该中断请求信号,然后将相应的设备中断处理程序的入 口地址装入到程序计数器中,使处理机转向中断处理程序。 -
中断处理
对于不同的设备,有不同的中断处理程序。该程序首先从设备控制器中读出设备状态, 以判别本次中断是正常完成中断,还是异常结束中断。若是前者,中断程序便进行结束处 理;若还有命令,可再向控制器发送新的命令,进行新一轮的数据传送。若是异常结束中断,则根据发生异常的原因做相应的处理。 -
恢复被中断进程的现场
当中断处理完成以后,便可将保存在中断栈中的被中断进程的现场信息取出,并装入 到相应的寄存器中,其中包括该程序下一次要执行的指令的地址 N+1、处理机状态字 PSW, 以及各通用寄存器和段寄存器的内容。这样,当处理机再执行本程序时,便从 N+1 处开始, 最终返回到被中断的程序。
I/O 操作完成后,驱动程序必须检查本次 I/O 操作中是否发生了错误,并向上层软件报 告,最终向调用者报告本次 I/O 的执行情况。除了上述的第 4 步外,其它各步骤对所有 I/O 设备都是相同的,因而对于某种操作系统,例如 UNIX 系统,是把这些共同的部分集中 起来,形成中断总控程序。每当要进行中断处理时,都要首先进入中断总控程序。而对于 第 4 步,则对不同设备须采用不同的设备中断处理程序继续执行。图 5-18 示出了中断处 理流程。
5.4.3 设备驱动程序
- 设备驱动程序的功能
(1) 接收由设备独立性软件发来的命令和参数,并将命令中的抽象要求转换为具体要 求,例如,将磁盘块号转换为磁盘的盘面、磁道号及扇区号。
(2) 检查用户 I/O 请求的合法性,了解 I/O 设备的状态,传递有关参数,设置设备的工作方式。
(3) 发出 I/O 命令。如果设备空闲,便立即启动 I/O 设以上是关于======第五章设备管理======的主要内容,如果未能解决你的问题,请参考以下文章