# 设备管理

现代计算机系统配置了各种类型的外围设备，不同的外围设备，由于其构造和物理特性各异，在应用方式和管理方法上也各不相同。

## 概述

### 设备类型

计算机系统中，除了CPU及存储器之外，还有一类比较重要的硬件资源——I/O设备。

I/O设备是计算机与外界进行信息交换的装置，这些设备可以从不同的角度进行分类。常见的有下列几种：

1. 按操作特性分类

* 存储设备：例如磁带机、硬盘、光盘
* 输入/输出（I/O）设备：例如键盘、扫描仪、打印机

1. 按设备的隶属关系分类

* 系统设备（System Device） 属于计算机中最基本的标准配置设备（OS生成时就已经配置好），常常在操作系统启动时自动完成设备的登录。如键盘、显示器和磁盘驱动器等都属于这种类型的设备。
* 用户设备（User Device） 属于非标准配置，可由用户根据实际需要连入系统，在使用之前通过运行对应的驱动程序进行安装、登录。如扫描仪等。

1. 按信息组织方式分类

* 字块设备（Block Device） 也称为存储型设备，其上信息的组织、安排，都以块为单位进行，在进行存取访问时，也是以块进行计量的。常见的有磁盘、磁带等。
* 字符设备（Character Device） 也称为输入/输出型设备，其上的信息是以字符为单位来组织安排的，在信息存取调用时,都是以字符为单位来访问的。如键盘、打印机等。

1. 按资源分配角度分类

* 独占设备（Independence Device ） 一次只允许分给一个用户作业使用的设备。设备一旦被分配，在作业的整个执行期间都被单独占用，别的作业不能与之共用，必须等占用释放后才可再用。而且，如果设备分配不当，可能会造成死锁。多数是一些慢速设备，如打印机等。
* 共享设备（Share Device） 一次可以允许多个作业同时进行访问的设备（一个作业还未撤离设备，另一个作业便可使用的设备）。各作业在执行期间，交替分时地对共享设备进行占用，如磁盘等。
* 虚拟设备（Virtual Device）： 严格来讲，虚拟设备是一种设备管理的技术。该技术可以使慢速独占设备的使用方式变为共享设备的使用方式，以提高独占设备的使用效率，如SPOOLING系统。

### 设备管理的任务和功能

设备管理的任务 (1) 选择和分配IO设备以进行数据传输操作 (2) 控制IO设备和内存之间交换数据 (3) 为用户提供友好的透明接口：使得用户在编程时不必涉及设备的硬件特性，由系统按照用户要求控制设备工作 (4) 提高并行操作度：设备和设备之间、CPU和设备之间，以及进程和进程之间

设备管理的功能 (1) 提供和进程管理系统的接口：将进程的设备资源要求转达给设备管理程序 (2) 进行设备分配：按照设备类型和分配算法把设备及相关硬件分配给请求该设备的进程，并把未得到分配的进程放入等待队列 (3) 实现设备和设备、设备和CPU等之间的并行操作：对于不同的I/O控制方式，需要有相应的硬件支持，如控制器、通道或DMA等 (4) 进行缓冲区的分配、释放及相关的管理：为了减少外部设备和内存与CPU之间的数据速度不匹配的问题，系统设置缓冲区来暂放数据

## 数据传送控制方式

外围设备和内存之间常用的数据传送控制方式有4种： (1) 程序直接控制方式 (2) 中断控制方式 (3) DMA方式 (4) 通道方式

### 程序直接控制方式

由用户进程来直接控制内存/CPU和外围设备之间的信息传送。这种方式的控制者是用户进程。

* 优点：控制简单，不需要多少硬件支持
* 缺点：
  * CPU的利用率大大降低：CPU和外围设备只能串行工作
  * 不能实现设备之间的并行工作：CPU在一段时间内只能和一台外围设备交换数据信息
  * 无法发现和处理由于设备或其他硬件所产生的错误：依靠测试设备标志触发器的状态位来控制数据传送

只适用于那些CPU执行速度较慢，而且外围设备较少的系统。 ![设备管理1](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%861.png)

### 中断方式

为了减少程序直接控制方式中CPU等待时间以及提高系统的并行工作程度，中断(interrupt)方式被用来控制外围设备和内存与CPU之间的数据传送。

中断方式要求CPU与设备(或控制器)之间有相应的中断请求线，而且在设备控制器的控制状态寄存器中有相应的中断允许位。 ![设备管理2](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%862.png) 优点：

* CPU的利用率大大提高（由于采用中断，无需循环测试状态控制寄存器的状态是否已处于“Done” ）
* 能支持多道程序和设备的并行操作（ CPU在另外的进程上下文中执行时，也可以发启动不同设备的启动指令和允许中断指令）

缺点：

* 一次数据传送过程中，可能发生较多次的中断（由于数据缓冲寄存器装满数据之后将会发生中断，而数据缓冲寄存通常较小），这将耗去大量的CPU处理时间。
* 可能造成CPU无法响应中断和出现数据丢失现象（多个外围设备并行操作引起的中断次数急剧增加造成CPU无法相应中断和出现数据丢失现象；如果外围设备的速度也很高，则可能造成数据缓冲寄存器的数据由于CPU来不及取走而丢失）

### DMA方式（Direct Memory Access直接存取方式）

在外围设备和内存之间开辟直接的数据交换通路。DMA方式挪用CPU的一个工作周期把数据缓冲寄存器中的数据直接送到内存地址寄存器所指向的内存区域。从而，DMA控制器可用来代替CPU控制内存和设备之间进行成批的数据交换。

除了在数据块传送开始时需要CPU的启动指令，和在整个数据块传送结束时需发中断通知CPU进行中断处理之外，不再需要CPU的频繁干预。 ![设备管理3](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%863.png) DMA方式与中断方式的一个主要区别

* CPU进行中断处理的次数大大减少
  * 中断方式时是在数据缓冲寄存器满之后发中断要求CPU进行中断处理
  * DMA方式则是在所要求转送的数据块全部传送结束时要求CPU进行中断处理
* 排除了因并行操作设备过多时CPU来不及处理或因速度不匹配而造成数据丢失等现象
  * 中断方式的数据传送是在中断处理时由CPU控制完成
  * DMA方式是在DMA控制器的控制下不经过CPU控制完成

DMA方式的局限性：

* DMA方式对外围设备的管理和某些操作仍由CPU控制（随着系统所配置的外设种类越来越多，数量也越来越大，对外围设备的管理的控制也愈来愈复杂）
* 多个DMA控制器的同时使用是不经济的，且会引起内存地址的冲突并使得控制过程进一步复杂化

### 通道控制(channel control)方式

通道是一个独立于CPU的专门负责I/O控制的处理机。它有自己的指令系统，通道指令受CPU启动（使该通道从内存中调出相应的通道指令执行），并在操作结束时向CPU发中断信号。

引入通道的目的：使CPU从I/O事务中解脱出来；同时为了提高CPU与设备，设备与设备之间的并行工作能力

按照信息交换方式不同，一个系统中可设立三种类型的通道：

* 字节多路通道：以字节为单位传送数据，主要用于连接大量的低速设备，如终端、打印机等。
* 数组多路通道：以块为单位传送数据，传送速率高，主要用来连接中速块设备，如磁带机等。 （前两者都可以分时执行不同的通道指令程序）
* 选择通道：以块为单位成批传送数据，一次只能控制一台设备进行 I/O操作（因为一次只能执行一个通道指令程序），但具有传送速度高的特点，被用来连接高速外部设备，如磁盘机等。

通道控制方式与DMA方式的比较

* 相似处：以内存为中心，实现设备和内存的直接数据交换
* 不同点：
  * DMA方式中，数据的传送由CPU控制；通道方式中，由专管输入输出的硬件——通道来进行控制
  * DMA方式中，每台设备至少一个DMA控制器；通道控制方式中，一个通道可控制多台设备与内存的数据交换

通道方式进一步减轻了CPU的工作负担，增加了计算机系统的并行工作程度。

## 中断技术

### 中断的基本概念

中断(Interrupt)：指计算机在执行期间，系统内发生非寻常的或非预期的急需处理事件，使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序。待处理完毕后又返回原来中断处继续执行或调度新的程序执行的过程。

中断源：引起中断发生的事件被称为中断源。

中断请求：中断源向CPU发出的请求中断处理信号。

中断响应：CPU收到中断请求后转相应的事件处理程序。

禁止中断（关中断）：CPU内部的处理机状态字PSW的中断允许位已被清除，不允许CPU响应中断。   开中断：PSW的中断允许位的设置。

中断屏蔽：在中断请求产生之后，系统用软件方式有选择地封锁部分中断而允许其余部分的中断仍能得到响应。（中断屏蔽是通过每一类中断源设置一个中断屏蔽触发器来屏蔽它们的中断请求而实现的。）

### 中断的分类与优先级

根据中断源产生的条件，中断可分为：

* 外中断：指来自处理机和内存外部的中断，包括I/O中断、外部信号中断、时钟中断、调试中断等。外中断在狭义上一般被称为中断。
* 内中断：指在处理机和内存内部产生的中断，一般称为陷阱(trap)或异常。包括程序运算引起的各种错误，如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等。

中断和陷阱的主要区别： (1) 陷阱通常由处理机正在执行的现行指令引起，而中断则是由与现行指令无关的中断源引起的。 (2) 陷阱处理程序提供的服务为当前进程所用，而中断处理程序提供的服务则不是为了当前进程的。 (3) CPU在执行完一条指令之后，下一条指令开始之前响应中断，而在一条指令执行中也可以响应陷阱。 (4) 有的系统中，陷进处理程序被规定在各自的进程上下文中执行，而中断处理程序则在系统上下文中执行。

### 软中断

硬中断：中断和陷阱要通过硬件产生相应的中断请求

软中断：通信进程之间用来模拟硬中断的一种信号通信方式。

软中断与硬中断的比较：

* 相同点：中断源发中断请求/软中断信号后，CPU/接收进程在适当的时机自动进行中断处理/完成软中断信号所对应的功能。
* 不同点：接收软中断信号的进程不一定正好在接收时占有处理机，相应的处理必须等到该接收进程得到处理机之后才能进行。

### 中断的处理过程

![设备管理4](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%864.png)

## 缓冲技术

### 缓冲的引入

引入缓冲的主要目的:

1. 缓和CPU和I/O设备间速度不匹配的矛盾 凡在数据的到达速率与离去速率不同的地方，都可设置缓冲，以缓和速度不匹配的矛盾。
2. 减少对CPU的中断次数：等到缓冲区满时才产生中断
3. 解决DMA或通道方式时的瓶颈问题

### 缓冲的种类

根据系统设置的缓冲器的个数，缓冲技术分为：

* 单缓冲
* 双缓冲
* 多缓冲
* 缓冲池

#### 单缓冲

在CPU与外设之间只设立一个缓冲区，输入与输出操作全部经该缓冲区来完成。缓冲区是可共享的临界资源，必须互斥使用。

#### 双缓冲

为输入或输出操作设置两个缓冲区。

实际系统中很少采用这一方式，因为计算机系统的外设很多，又有大量的输入和输出，双缓冲很难匹配设备和CPU的处理速度。计算机中大都采用多缓冲或缓冲池结构。

#### 多缓冲及缓冲池

多缓冲是把主存中的多个缓冲区组织成两部分，一部分用于做输入缓冲区，另一部分作为输出缓冲区。缓冲池则是将多个缓冲区连接成一个完整的区域，既可用于输入又可用于输出。

多缓冲及缓冲池也是可共享的临界资源，必须互斥地使用，由系统统一分配和管理。

### 缓冲池的管理

系统把各缓冲区按其使用状况连成三种队列：

1. 空白缓冲队列em，队首指针为F(em)，队尾指针为L(em)
2. 装满输入数据的输入缓冲队列in，队首指针为F(in)，队尾指针为L(in)
3. 装满输出数据的输出缓冲队列out，队首指针为F(out)，队尾指针为L(out)&#x20;

缓冲池有四种工作缓冲区：

* 用于收容输入数据的工作缓冲区（hin）：输入设备--> 缓冲区
* 用于提取输入数据的工作缓冲区（sin）：缓冲区-->CPU
* 用于收容输出数据的工作缓冲区（hout）：CPU--> 缓冲区
* 用于提取输出数据的工作缓冲区（sout）：缓冲区-->输出设备

缓冲池的工作方式：缓冲区在收容输入、提取输入、收容输出和提取输出四种方式下工作。 ![设备管理5](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%865.png)

缓冲池的工作原理：

* 系统开始启动时，所有缓冲区全部排入em队列中。
* 当有输入任务时，收容输入进程执行读操作时，自动从em队列的队首取下一空闲缓冲区，将输入数据装入，待满后排入in队列（装满输入数据）尾部。并对em队列和in队列长度作减一、加一操作。
* 当有输出任务时，收容输出进程从em队列中取下一空闲缓冲区，将输出数据装入，满后排入out队列（装满输出数据）尾部。并对em队列和out队列长度作减一、加一操作。
* 当系统要从输入缓冲区为用户进程取数时，由提取输入进程从in队列中取出一缓冲区，将其中的数据复制到用户指定的区域。并将该缓冲区排入em队列的尾部。同时，in队列数减一，em队列数加一。
* 当系统要从输出缓冲区输出数时，由提取输出进程从out队列中取出一缓冲区，将其中的数据送给输出设备进行操作。然后将该缓冲区排入em队列的尾部。同时，out队列数减一，em队列数加一。

## 设备分配技术

### 设备分配中的数据结构

设备的分配和管理中，常采用的数据结构主要有四张表，即

* 系统设备表SDT SDT表记录系统中所有I/O设备的信息（接入系统中的每个外设在SDT表中都占有一个表目项）。SDT表在整个系统中只有一张，全面反映了系统中的外设资源的类型、数量、占用情况等。
* 设备控制表DCT 系统中的每台设备都有一张设备控制表DCT。DCT表包含设备的各方面特征，以及与该设备相连的设备控制器的入口位置。
* 控制器控制表COCT 每个控制器都有一张控制器控制表COCT，用于登录某控制器的使用分配情况及与该控制器相连的通道的情况。具体内容有：
  * 控制器号：控制器的内部标识符
  * 控制器状态：控制器忙/闲
  * 通道指针：指向与该控制器相联的通道控制表CHCT。当控制器与若干通道连接时该项内含多个指针
  * 等待队列指针：指向等待该控制器的I/O进程队列
* 通道控制表CHCT CHCT表反映了通道的情况，系统中的每个通道都有一张CHCT表（只在有通道控制方式的系统中存在）。其内容如下：
  * 通道号：通道内部标识符
  * 通道状态：通道忙/闲
  * 等待队列指针：等待该通道的I/O进程队列的指针

### 设备分配的方式

1. 静态分配：用户作业执行之前，由系统一次性分配给该作业所要求的全部设备、控制器和通道。一旦分配之后，这些设备、控制器和通道就一直为该作业所占有，直到该作业撤消。

* 优点：不会出现死锁
* 缺点：设备的使用率低

1. 动态分配：当进程需要设备时，通过系统调用命令向系统提出设备请求，由系统按照事先规定的策略给进程分配所需要的设备、控制器和通道。一旦用完之后，便立即释放。

* 优点：提高了设备的利用率。
* 缺点：分配算法不当，会引起进程死锁。

### 设备的独立性

为便于外设的管理，系统对每台进入系统中的设备都给定一个对应的编号，作为调用时识别和区分设备用。这种编号无任何重复，被称为设备的绝对号（或物理设备名）。

为方便用户，也为提高外设利用率，系统允许用户申请外设时，只需要向系统说明所需用的某类设备（至于真正在实际中使用哪台设备，由系统根据这类设备的使用情况作出分配）。即使用户需要多台同样的设备，系统也允许用户按自己的使用要求提出编号，这种由用户申请设备时所用的编号称为设备的相对号（或逻辑设备名）。

设备独立性：指应用程序独立于具体使用的物理设备，即用户编制程序使用的设备与实际使用的设备无关。

### 设备分配策略

系统中，进程的数量一般都会超出所拥有的外设资源数量，所以有些进程在I/O请求完成后，不能立即分到所要的外设，这些进程被排入该设备的等待队列。对于等待队列中的进程，系统按照一定的策略对设备进行分配。

常见的设备分配方法有两种。

* 先请求先分配 由于进程对设备的申请有先后次序，故排入等待队列的次序也是不相同的。当该设备被释放归还给系统后，就可以重新分配。此时，系统按进程在等待队列中排队的先后次序，将设备分配给最早排入队列的那个进程。
* 优先级高者先分配 在此分配对策中，进程的优先级起了决定作用。分配程序按进程所具有的优先级进行分配：高优先级的进程先分配，同优先级的，先申请先分配。

### 设备分配步骤

在具有通道的I/O系统中，分配算法对各资源的分配顺序为：

1. 分配设备
2. 分配控制器
3. 分配通道

具体分配流程图如下： ![设备管理6](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%866.png) ![设备管理7](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%867.png)

### 虚拟设备的分配和假脱机系统

#### 虚拟设备

虚拟设备不是真正意义上的物理设备，它是指代替独享设备的那部分存储空间及有关的控制结构。

对虚拟设备采用的是虚拟分配，其过程是：当进程请求独享设备时，系统将共享设备的一部分存储空间分配给它。进程与设备交换信息时，系统把要交换的信息存放在这部分存储空间，在适当的时候对信息作相应的处理。

#### 假脱机技术：SPOOLING系统

思想：利用一台高速共享设备（磁盘或磁鼓）将一台独占设备模拟成多台可并行操作的虚拟设备。这样一来，使每个用户都感到得到了系统中的一台独享设备。

SPOOLING系统的组成：

* 硬件部分： 这部分包含了在外存上设立的两区域：输入井和输出井，以及在内存中开辟出的两个缓冲区：输入缓冲区和输出缓冲区。
  * 输入井：用来存放来自于输入设备的信息。
  * 输出井：用来保存即将送到输出设备上的结果。
  * 输入缓冲区：暂时保存外设准备送入输入井的信息。
  * 输出缓冲区：暂时保存从输出井送出的结果。
* 软件部分：
  * 预输入进程：将用户要求的输入到设备上的输入数据，经通道和输入缓冲区送入输入井（输入设备→输入井）
  * 缓输出进程：将用户的输出结果在设备空闲时从输出井中，经输出缓冲区送上输出设备（输出井→输出设备）
  * 输入井管理进程：将输入井中的数读入内存（CPU 输入井→内存）
  * 输出井管理进程：将内存中的结果送输出井中（CPU内存→输出井）

#### 假脱机系统的特点

* 提高了I/O速度。从对低速I/O设备进行的I/O操作变为对输入井或输出井的操作，缓和了CPU与低速I/O设备速度不匹配的矛盾。
* 设备并没有分配给任何进程。在输入井或输出井中，分配给进程的是一存储区和建立一张I/O请求表。
* 实现了虚拟设备功能。多个进程同时使用一独享设备，而对每一进程而言，都认为自己独占这一设备，不过，该设备是逻辑上的设备。

## I/O进程控制

### I/O控制的引入

I/O控制：指从用户进程的I/O请求开始，给用户进程分配设备、启动有关设备进行I/O操作，以及在I/O操作完成之后响应中断，进行善后处理为止的整个系统控制过程。

### I/O控制的功能

![设备管理8](http://ofolh8dcq.bkt.clouddn.com/%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%868.png)

各子模块的功能:

* I/O请求处理模块：把用户进程的I/O请求变换为设备管理程序所能接受的信息（例如将I/O请求中的逻辑设备名转换为对应的物理设备名），并将I/O请求命令插入指向相应DCT 的I/O请求队列
* 设备分配程序：为I/O请求分配相应的设备、控制器和通道
* 缓冲区管理模块：为I/O传送申请必要的缓冲区，以保证I/O传送的顺利完成。

另外，在数据传送结束后，外设发出中断请求，I/O控制过程将根据中断原因调用中断处理程序，并做出中断响应。

### I/O控制的实现方式

* 作为请求I/O操作的进程的一部分实现。
* 作为当前进程的一部分实现 让请求I/O操作的进程调用I/O操作控制部分，而让当前进程负责调用中断处理部分
* I/O控制由专门的系统进程——I/O进程完成。在用户进程发出I/O请求命令之后，或者在外设发出中断请求之后，系统调度I/O进程执行，控制I/O操作或者响应中断。

I/O进程也可分为三种方式实现。即:

* 每类(个)设备设一专门的I/O进程，且该进程只能在系统态下执行。
* 整个系统设一I/O进程，全面负责系统的数据传送工作。
* 每类(个)设备设一个专门的I/O进程，但该进程既可在用户态也可在系统态下执行。

## 设备驱动程序

设备驱动程序是驱动物理设备和DMA控制器或I/O控制器等直接进行I/O操作的子程序的集合。

设备驱动程序负责设置相应设备有关寄存器的值，启动设备进行I/O操作，指定操作的类型和数据流向等。

系统设置有设备开关表DST（Device Switch Table）对驱动程序进行管理

* 设备开关表中给出相应设备的各种操作子程序的入口地址，例如打开 / 关闭、读 / 写设备子程序的入口地址
* 一般设备开关表是二维结构，其中的行和列分别表示设备类型和驱动程序类型。
* 设备开关表也是I/O进程的一个数据结构。I/O控制过程为进程分配设备和缓冲区之后，可以使用设备开关表调用所需的驱动程序进行I/O操作。

***

> 《计算机操作系统教程（第3版）》张尧学 史美林 张高 著
