﻿---
title: I/O System
date: 2024-05-14
excerpt: I/O部分：I/O控制器、通道、I/O控制方式（查询I/O方式、中断I/O控制方式、DMA方式）、设备驱动程序。 数据结构：设备控制表、控制器表、通道表、系统设备表。 设备分配及分配算法：硬盘硬件结构、硬盘分配算法（FIFO、SSTF、SCAN、CSCAN）。 缓冲技术：设备分配的独立性和分配时的安全性。
tags: [OS]
cover: https://assets.vluv.space/cover/OS/Ch5-IOSystem.webp
---

## 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 软件组织成四个层次

1. **用户层 I/O 软件**，实现与用户交互的接口，用户可直接调用该层所提供的、与 I/O 操作有关的库函数对设备进行操作。
2. **设备独立性软件**，用于实现用户程序与设备驱动器的统一接口、设备命名、设备的保护以及设备的分配与释放等，同时为设备管理和数据传送提供必要的存储空间。
3. **设备驱动程序**，与硬件直接相关，用于具体实现系统对设备发出的操作指令，驱动 I/O 设备工作的驱动程序。
4. **中断处理程序**，用于保存被中断进程的 CPU 环境，转入相应的中断处理程序进行处理，处理完毕再恢复被中断进程的现场后，返回到被中断的进程。

### I/O 系统

#### 基本功能

1. 设备分配
2. 设备映射
3. 设备驱动
4. 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 操作的机械部分，或者直接用于 I/O 和存储信息的设备。
**设备控制器**，是处于 CPU 与 I/O 设备之间的接口，接收 CPU 发来的命令，并控制 I /O 设备工作。设备控制器主要职责是控制一个或多个 I/O 设备，以实现 I/O 设备和计算机之间的数据交换。
通常，设备并不是直接与 CPU 进行通信，而是与设备控制器通信，因此，设备间接通过设备控制器与 CPU 进行通信，
在设备与设备控制器之间有一接口，通过专用的电缆线连接，传递三类信号。

1. 数据信号线，双向（输入输出），在设备与控制器之间传送数据信号。
2. 控制信号线，控制器发给设备，要求设备完成相关操作。如：读，写控制等。
3. 状态信号线，设备发给控制器，传送指示设备当前状态的信号。有：正在读（写），或准备好新的数据传送。

设备控制器是一个可编址设备，当它控制一台设备时，它只有一个唯一的设备地址；若设备控制器可连接多台设备时，则应含有多个设备地址，并使每一个设备地址对应一个设备。

##### 设备控制器

大多数控制器都是由以下三部分组成：

1. 设备控制器与处理机的接口：该接口用于实现 CPU 与设备控制器之间的通信。
   接口包括：数据线、地址线、控制线、数据寄存器（存放从设备或 CPU 送来的数据）、控制/状态寄存器（存放从 CPU 送来的控制信息或设备的状态信息）。
2. 设备控制器与设备的接口:在一个设备控制器上，可以连接一个或多个设备。相应地，在控制器中便有一个或多个设备接口，一个接口连接一台设备。
3. I/O 逻辑: I/O 逻辑用于实现对设备的控制。I/O 逻辑对收到的地址进行译码，再根据所译出的命令对所选设备进行控制。

![设备控制器](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-18-20-18-35.webp)

##### I/O 通道

在 CPU 和 I/O 设备之间增加了设备控制器减轻了 CPU 对数据输入输出的控制、使得 CPU 的效率得到显著的提高。
而通道的出现则进一步提高了 CPU 的效率。这是因为通道是一个特殊功能的处理器，它有自己的指令和程序专门负责数据输入输出的传输控制。
而 CPU 将“传输控制”的功能下放给通道后只负责“数据处理”功能。这样，通道与 CPU 分时使用内存，实现了 CPU 内部运算与 I/O 设备的并行工作。

通道是一种特殊的执行 I/O 指令的处理机，指令类型单一，没有自己的内存，与 CPU 共享内存。

采用通道有以下特点：

1. DMA（直接存储器存取）方式显著地减少了 CPU 的干预。
2. 引入通道后，通道能够建立独立的 I/O 操作，解脱 CPU 对 I/O 的组织、管理。CPU 只需发送 I/O 命令给通道，通道通过调用内存中的相应通道程序，即可完成一组相关的读（或写）操作及有关控制。
3. 可实现 CPU、通道和 I/O 设备三者的并行操作，从而更有效地提高整个系统的资源利用率。

通道是一种特殊的执行 I/O 指令的处理机。主机可以连接若干个通道，一个通道可以连接若干个设备控制器，一个设备控制器又可以连接一台或多台外部设备。
![通道](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-18-20-32-58.webp)

> [!example] 隋唐小测
>
> 1. 虚拟设备是指被多个用户或进程交替使用的设备，宏观上好象多个用户同时在使用。（ ）
>    错；是指采用某种 I/O 技术，将某个独占设备改进为多用户共享的设备，以提高资源的利用率。
> 2. 通道技术根本上是从软件上解决操作系统对输入输出操作的控制问题。（ ）
>    错；通道技术根本上是从硬件上解决操作系统的输入输出操作的控制问题。
> 3. 逻辑设备是物理设备属性的表示，用来指定某一具体设备。（ ）
>    错；它并不特指某个具体设备，而是对应一类设备。
> 4. 从设备的资源属性分类，可把设备分为独占设备、共享设备和虚拟设备。（ ）
>    对
> 5. 用户在使用 I/O 设备时，通常采用物理设备名，指明具体的设备。（ ）
>    错；用户在使用 I/O 设备时，通常采用逻辑设备名，指明设备类型。

## 中断处理程序和设备驱动程序

### 中断简介

中断在操作系统中有特殊而重要的地位，没有它就不可能实现多道程序，进程之间的切换就是通过中断来完成的。
中断是 I/O 系统最低的一层，也是设备管理的基础。

**中断源**：引起中断发生的事件
**中断请求**：中断源向 CPU 发出的请求中断处理信号
**中断响应**：CPU 收到中断请求后转到相应的事件处理程序的过程
**关中断/开中断**：CPU 内部的 PSW 的中断允许位被清除/被设置，不允许/允许 CPU 响应中断。用于保证某段程序执行的原子性
**中断屏蔽**：在中断请求产生后，系统有选择地封锁一部分中断而允许另一部分仍能得到响应。有些具有最高优先级的中断不允许被屏蔽。

根据信号的来源不同，中断分为外中断和内中断。
**外中断**，一般简称中断，是指 CPU 对 I/O 设备发来的中断信号的一种响应。CPU 保护暂停当前进程，转而去处理引发中断的进程。执行完后，再返回到原进程，继续执行。
I/O 设备可以是字符设备（键盘），块设备（磁盘）或通信设备（网络）等。由于中断是外部造成的，所以又叫外中断。
**内中断**，有些教材又称作为陷阱，陷入是由 CPU 进程内部事件引发的中断，因此叫陷入或内中断。其产生的原因往往是由于进程本身出现运行时异常。如运算中发生了溢出，或者程序出错，如非法指令。

由硬件产生的中断标识码被称为**中断类型号**（当然，中断类型号还有其他的产生方法，如指令中直接给出、CPU 自动形成等）
**中断向量表**，就是中断类型号与相应中断源的中断处理程序入口地址之间的连接表。
80x86 系统是把所有的中断向量集中起来，按中断类型号从小到大的顺序存放到存储器的某一区域内，这个存放中断向量的存储区叫做中断向量表，即中断服务程序入口地址表。

对于多中断源的处理方式，比如，当处理机正在处理键盘引起的终端，此时又收到了高优先级的磁盘中断，应该如何处理？
一种方式是屏蔽中断，或者叫禁止中断。对于新的中断。中断处理来的中断，在当前中断未完成之前，对于其他中断不予理睬，直到当前处理完。采用先来先服务的方式。
第二种方式是嵌套中断，就是中断程序也是进程，当更高优先级的中断处理程序到来时，可以剥夺当前中断处理进程的处理机，即中断的中断。

### 中断处理程序

由于中断处理与硬件紧密相关，对用户及用户程序而言，应该尽量加以屏蔽，故应该放在操作系统的底层进行中断处理，系统的其余部分尽可能少地与之发生联系。
当一个进程请求 I/O 操作时，该进程将被挂起，直到 I/O 设备完成 I/O 操作后，设备控制器便向 CPU 发送一中断请求，
CPU 响应后便转向中断处理程序，中断处理程序执行相应的处理，处理完后解除相应进程的阻塞状态。
因此，中断处理层的主要工作就是这三个方面：

- 进行进程上下文的切换，
- 对处理中断信号源进行测试，
- 读取设备状态和修改进程状态等。

对于为每一类设备设置一个 I/O 进程的设备处理方式，其中断处理程序的处理过程分成以下几个步骤

1. 测定是否有未响应的中断信号
   - 程序完成当前指令后测试是否有未响应的中断信号。
     如果没有，继续执行下一条指令。
     如果有，则停止原有进程的执行，准备转去执行中断处理程序，为把处理机的控制权转交给中断处理程序做准备。
   - 通常由硬件自动将处理机状态字 PSW 和程序计数器(PC)中的内容，保存在中断保留区(栈)中
   - 然后把被中断进程的 CPU 现场信息(即包括所有的 CPU 寄存器，如通用寄存器、段寄存器等内容)都压入中断栈中
2. 转入相应的设备处理程序
   - 由处理机对各个中断源进行测试，以确定引起本次中断的 I/O 设备，并发送一应答信号给发出中断请求的进程，使之消除该中断请求信号
   - 然后将相应的设备中断处理程序的入口地址装入到程序计数器中，使处理机转向中断处理程序。
3. 中断处理
   - 该程序首先从设备控制器中读出设备状态，以判别本次中断是正常完成中断，还是异常结束中断。
   - 若是前者，中断程序便进行结束处理；若还有命令，可再向控制器发送新的命令，进行新一轮的数据传送。
   - 若是异常结束中断，则根据发生异常的原因做相应的处理。
4. 恢复被中断进程的现场
   - 当中断处理完成以后，便可将保存在中断栈中的被中断进程的现场信息取出，并装入到相应的寄存器中，其中包括该程序下一次要执行的指令的地址 N+1、处理机状态字 PSW，以及各通用寄存器和段寄存器的内容。
   - 这样，当处理机再执行本程序时，便从 N+1 处开始，最终返回到被中断的程序。

### 设备驱动程序

前面已经对设备驱动程序的功能、特点进行了讲解。
对设备的处理方式，一般分为三类：

1. 第一种是为每一类设备设置一个进程，专门用于这类设备的 IO 操作。
2. 第二种是在整个系统中设置一个 IO 进程，专门用于执行系统中所有各类设备的 IO 操作。
3. 第三种是不设置专门的设备处理进程，而只为各类设备设置相应的设备驱动程序，供用户或者系统进程以调用的方式访问，第三种是目前最常见的设备处理方式。

随着计算机技术的发展，I/O 控制方式也在不断地发展。

1. 在早期的计算机系统中，是采用程序 I/O 方式；
2. 当在系统中引入中断机制后，I/O 方式便发展为中断驱动方式；
3. 此后，随着 DMA 控制器的出现，又使 I/O 方式在传输单位上发生了变化，即从以字节为单位的传输扩大到以数据块为单位进行转输，从而大大地改善了块设备的 I/O 性能；
4. 而通道的引入，又使对 I/O 操作的组织和数据的传送都能独立地进行而无需 CPU 干预。

在 I/O 控制方式的整个发展过程中，始终贯穿着这样一条宗旨，即尽量减少主机对 I/O 控制的干预，把主机从繁杂的 I/O 控制事务中解脱出来，以便更多地去完成数据处理任务。

#### 对 IO 设备的控制方式

![IO控制方式](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-18-21-35-34.webp)

##### 使用轮询的可编程 I/O 方式

早期的计算机系统中，由于无中断机构，处理机对 I/O 设备的控制采取程序 I/O(Programmed I/O)方式，或称为忙等待方式，

处理机向控制器发出一条 I/O 指令启动输入设备输入数据时，同时把 busy 置为 1，再不断循环测试 busy。
Busy=0，完成输入，处理机读取数据，送入指定单元，完成一次 I/O。
对状态寄存器中的忙/闲标志 busy 的检查实现控制

在程序 I/O 方式中，由于 CPU 的高速性和 I/O 设备的低速性，致使 CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中，
造成对 CPU 的极大浪费。在该方式中，CPU 之所以要不断地测试 I/O 设备的状态，就是因为在 CPU 中无中断机构，
使 I/O 设备无法向 CPU 报告它已完成了一个字符的输入操作。

##### 使用中断的可编程 I/O 方式

现代计算机系统中，都毫无例外地引入了中断机构，致使对 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 和 I/O 设备都处于忙碌状态，从而提高了整个系统的资源利用率及吞吐量。

##### 直接存储器访问方式

虽然中断驱动 I/O 比程序 I/O 方式更有效，但须注意，它仍是以字(节)为单位进行 I/O 的，每当完成一个字(节)的 I/O 时，控制器便要向 CPU 请求一次中断。
换言之，采用中断驱动 I/O 方式时的 CPU 是以字(节)为单位进行干预的。如果将这种方式用于块设备的 I/O，显然是极其低效的。
例如，为了从磁盘中读出 1 KB 的数据块，需要中断 CPU 1K 次。为了进一步减少 CPU 对 I/O 的干预而引入了直接存储器访问方式。
如果 I/O 设备能直接与主存交换数据而不占用 CPU，CPU 的利用率还可提高，这就出现了直接存储器访问（DMA）方式。
DMA 控制方式的特点：

- 数据传输的基本单位是数据块，即在 CPU 与 I/O 设备之间，每次传送至少一个数据块；
- 所传送的数据是从设备直接送入内存的，或者相反；
- 仅在传送一个或多个数据块的开始和结束时，才需 CPU 干预，整块数据的传送是在控制器的控制下完成的。

优点： CPU 利用率进一步提高（并行度有所提高）
缺点： 数据传送方向、字节数、内存地址等需由 CPU 控制，且每一设备需一台 DMA 控制器，设备增多时，不经济。

DMA 方式较之中断驱动方式，又是成百倍地减少了 CPU 对 I/O 的干预，进一步提高了 CPU 与 I/O 设备的并行操作程度。

1. 需要数据的进程向 CPU 发出指令,向 DMA 控制器写入数据存放的内存始址、传送的字节数,并置中断位和启动位,启动 I/O 设备输入数据并允许中断。
2. 该进程放弃处理机等待输入完成，处理机被其它进程占用。
3. DMA 控制器挪用 CPU 周期，将一批数据写入内存中。
4. DMA 控制器传送完数据后，向 CPU 发中断请求，CPU 响应后转向中断服务程序，唤醒进程，并返回被中断进程。
5. 以后某时刻，该进程再次被调度，从内存单元取出数据进行处理。

> [!tip] DMA 控制器的组成
>
> - 内存地址寄存器 MAR：在输入时，它存放把数据从设备传送到内存的起始目标地址；在输出时，它存放由内存到设备的内存源地址。
> - 数据寄存器 DR：用于暂存从设备到内存，或从内存到设备的数据。
> - 命令/状态寄存器 CR：用于接收从 CPU 发来的 I/O 命令或有关控制信息，或设备的状态。
> - 数据计数器 DC：存放本次 CPU 要读或写的字（节）数。
>
> ![DMA 控制器](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-18-21-34-19.webp)

##### I/O 通道控制方式

为了获得 CPU 和外围设备间更高的并行工作能力，也为了让种类繁多，物理特性不同的外围设备能以标准的接口连接到系统中，计算机系统引入了自成独立体系的通道结构。

I/O 通道方式是 DMA 方式的发展，它可进一步减少 CPU 的干预，即把对一个数据块的读（或写）为单位的干预，
减少为对一组数据块的读（或写）及有关的控制和管理为单位的干预。

由通道管理和控制 I/O 操作，减少了外围设备和 CPU 的逻辑联系，把 CPU 从琐碎的 I/O 操作中解放出来。
可实现 CPU、通道和 I/O 设备三者的并行操作，从而更有效地提高整个系统的资源利用率。

> [!example] 隋唐小练
>
> 1. 什么是中断？系统内部中断与外部中断有什么区别？
>    答：中断就是处理器停止当前的工作，保存现场所有数据和状态参数，转而处理更紧急的事物，处理完后恢复原来的数据和参数，继续原来的工作。系统内部中断是由于操作系统内部运行所造成的中断，外部中断是用户应用程序运行所造成的中断。
> 2. 缺页中断与一般中断的主要区别是什么？
>    答：缺页中断是一种特殊的中断。它在指令执行期间产生和处理中断信号；一条指令执行期间，可能产生多次缺页中断。
> 3. I/O 控制方式中的中断控制方式和 DMA 方式有什么不同？
>    答：I/O 中断控制方式是指 CPU 与 I/O 设备并行操作，数据 I/O 操作完成，设备控制器通过控制线向 CPU 发送一中断信号，CPU 花极短的时间去进行中断处理。CPU 利用率显著提高。但它以字（节）为单位进行 I/O，对块设备低效。直接内存存取（DMA）方式，数据传输以数据块为基本单位，在控制器的控制下完成，数据直接送入内存，在一个或多个数据块传输开始和结束时，才需 CPU 干预。

## 与设备无关的 I/O 软件

### 设备独立性 Device Independence

**设备独立性**是指操作系统把所有外部设备统一当作成文件来看待，只要安装它们的驱动程序，任何用户都可以象使用文件一样，操纵、使用这些设备，而不必知道它们的具体存在形式。其基本含义是: 应用程序独立于具体使用的物理设备。

实现设备独立性后，可带来两方面的好处。

1. 提高设备分配时的灵活性，提高系统的可适应性和可扩展性
   进程能以逻辑设备名称来请求某类设备时，系统可立即将该类设备中的任一台分配给进程，仅当所有此类设备已全部分配完毕时，进程才会阻塞。
2. 易于实现 I/O 重定向
   所谓 I/O 重定向，是指用于 I/O 操作的设备可以更换(即重定向)，而不必改变应用程序。

**如何实现设备独立性**
为了实现设备的独立性，应引入逻辑设备和物理设备两个概念。在应用程序中，使用逻辑设备名称来请求使用某类设备；而系统执行时，是使用物理设备名称。鉴于驱动程序是一个与硬件（或设备）紧密相关的软件，必须在驱动程序上设置一层软件，称为设备独立性软件，以执行所有设备的公有操作、完成逻辑设备名到物理设备名的转换（为此应设置一张逻辑设备表）并向用户层（或文件层）软件提供统一接口，从而实现设备的独立性

**设备独立性软件**

前面我们已经学习过，I/O 系统是层次化管理的。操作系统设备管理的总体结构，目前最常见的是划分为设备硬件无关层和设备硬件相关层，两个层次。
无关层与相关层划分的思想依据主要在于可移植性和可扩充性。

驱动程序是一个与硬件(或设备)紧密相关的软件。为了实现设备独立性，必须再在驱动程序之上设置一层软件，称为设备独立性软件。
至于设备独立性软件和设备驱动程序之间的界限，根据不同的操作系统和设备有所差异，主要取决于操作系统、设备独立性和设备驱动程序的运行效率等多方面因素的权衡，
因为对于一些本应由设备独立性软件实现的功能，可能由于效率等诸多因素，实际上设计在设备驱动程序中。

设备独立性软件的主要功能可分为以下两个方面：

1. 执行所有设备的公有操作。包括:
   - 对独立设备的分配与回收；
   - 将逻辑设备名映射为物理设备名，进一步可以找到相应物理设备的驱动程序；
   - 对设备进行保护，禁止用户直接访问设备；
   - 缓冲管理
   - 差错控制
   - 提供独立于设备的逻辑块
2. 向用户层(或文件层)软件提供统一接口
   - 无论何种设备，它们向用户所提供的接口应该是相同的。
   - 例如，对各种设备的读操作，在应用程序中都使用 read；而对各种设备的写操作，也都使用 write。

### 虚拟设备和 SOPPLing 技术

#### 常用设备分配技术

**根据设备的使用性质**

- 独占设备：不能共享的设备，即：在一段时间内，该设备只允许一个进程独占。如打印机。
- 共享设备：可由若干个进程同时共享的设备。如磁盘机。
- 虚拟设备：是利用某种技术把独占设备改造成可由多个进程共享的设备。

**针对三种设备采用三种分配技术**

- 独占分配技术:是把独占设备固定地分配给一个进程，直至该进程完成 I/O 操作并释放它为止。
- 共享分配技术:通常适用于高速、大容量的直接存取存储设备。由多个进程共享一台设备，每个进程只用其中的一部分。
- 虚拟分配技术:利用共享设备去模拟独占设备，从而使独占设备成为可共享的、快速 I/O 的设备。实现虚拟分配的最有名的技术是 SPOOLing 技术，也称作假脱机操作。

## 缓冲技术

### 缓冲区的概念

缓冲区是一个存储区域，可以由专门的硬件寄存器组成，也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高，容量也较小，一般仅用在对速度要求非常高的场合（如存储器管理中所用的联想寄存器，由于对页表的访问频率极高，因此使用速度很快的联想寄存器来存放页表项的副本）
一般情况下，更多的是利用内存作为缓冲区，“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区

### 引入缓冲区的目的

- 缓和 CPU 与外设间速度不匹配的矛盾
- 提高 CPU 与外设之间的并行性
- 减少对 CPU 的中断次数
- 缓和 CPU 和外设之间数据粒度不匹配的矛盾

### 单缓冲 Single Buffer

![单缓冲](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-19-15-41-14.webp)

### 双缓冲 Double Buffer

![双缓冲](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-19-15-41-41.webp)

## 磁盘系统及磁盘调度

磁盘存储器是计算机系统中的最重要的存储设备，在其中存放了大量的文件。现代计算机系统中，都配置了磁盘存储器，并以它为主来存放文件。

对文件的读、写操作都将涉及到对磁盘的访问。磁盘 IO 速度的高低和磁盘系统的可靠性，将直接影响到系统的性能。
设法改善磁盘系统的性能，已成为现代操作系统的重要任务之一 。

高磁盘 I/O 速度的主要途径：

- 选择性能好的磁盘
- 采用好的磁盘调度算法
- 设置磁盘高速缓存（Disk Cache）
- 采用高度可靠、快速的容量磁盘系统--磁盘冗余阵列
- 其它方法

硬盘有机械硬盘(HDD)和固态硬盘(SSD)之分。这里只讲解机械硬盘。
机械硬盘即是传统普通硬盘，主要由：盘片，磁头，盘片转轴及控制电机，磁头控制器，数据转换器，接口，缓存等几个部分组成。

### 磁盘数据的组织和格式

- 存储面(surface)
- 磁道(track)
- 柱面
- 扇区(sectors)

磁盘设备可包括一或多个物理盘片，每个磁盘片分一个或两个存储面(surface)，每个磁盘面被组织成若干个同心环，这种环称为磁道(track)，各磁道之间留有必要的间隙。
每条磁道又被逻辑上划分成若干个扇区(sectors)，软盘大约为 8 ～ 32 个扇区，硬盘则可多达数百个。一个扇区称为一个盘块(或数据块)，常常叫做磁盘扇区。各扇区之间保留一定的间隙。
磁道从外缘，以“0”开始编号，往里面递增。具有相同编号的磁道形成一个圆柱，称之为磁盘的柱面。

![磁盘数据的组织和格式](https://assets.vluv.space/UESTC/OS/Ch5-IOSystem/Ch5-IOSystem-2024-06-19-11-41-34.webp)

**磁盘访问时间**分成以下三部分：

1. 寻道时间 $T_s$
   这是指把磁臂（磁头）移动到指定磁道上所经历的时间。
   $T_s = m \times n + s$
   s：启动磁臂的时间
   n：磁头移动 n 条磁道
   m：移动每一条磁道所花费的时间
2. 旋转延迟时间 $T_\tau$
   这是指定扇区移动到磁头下面所经历的时间。平均旋转延迟时间是指磁头等待所需数据扇区旋转到磁头下方的平均时间。这个时间通常取为硬盘旋转半圈的时间,即$\frac{1}{2r}$
   例如：
   软盘旋转速度为 300 r/min 或 600 r/min，这样，平均 $T_\tau$ 为 50 ~ 100 ms。(旋转速度为 5r/s-10r/s，装半圈的时间为 $\frac{0.5r}{10r/s} - \frac{0.5r}{5r/s} = 0.05s - 0.1s$)
   硬盘旋转速度为 15 000 r/min，每转需时 4 ms，平均旋转延迟时间 $T_\tau$ 为 2 ms；
3. 传输时间$T_t$
   这是指把数据从磁盘读出或向磁盘写入数据所经历的时间。
   $T_t$ 的大小与每次所读/写的字节数 b 和旋转速度有关:
   $T_t=\frac{b}{rN}$
   r 为磁盘每秒钟的转数；N 为一条磁道上的字节数

这样， 访问时间 $T_a$ 表示为： $T_a = T_s + \frac{1}{2r}+\frac{b}{rN}$

在访问时间中,寻道时间和旋转延迟时间基本上都与所读/写数据的多少无关,而且它通常占据了访问时间中的大头。
例如，我们假定寻道时间和旋转延迟时间平均为 20ms，而磁盘的传输速率为 10MB/s,如果要传输 10KB，此时总的访问时间为 21ms，可见传输时间所占比例是非常小的。
当传输 100KB 数据时，其访问时间也只是 30ms，即当传输的数据量增大 10 倍时，访问时间只增加约 50%。
目前磁盘的传输速率已达 80MB/s 以上,数据传输时间所占的比例更低。 可见,适当地集中数据(不要太零散)传输，将有利于提高传输效率。

### 磁盘调度

磁盘是可供多个进程共享的设备，当有多个进程都要求访问磁盘时，应采用一种最佳调度算法，**以使各进程对磁盘的平均访问时间最小**。目前常用的磁盘调度算法有：

1. 先来先服务 FCFS
2. 最短寻道时间优先 SSTF
3. 扫描（SCAN）算法
4. 循环扫描（CSCAN）算法

#### 先来先服务 FCFS

根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单，且每个进程的请求都能依次地得到处理，不会出现某一进程的请求长期得不到满足的情况。

#### 最短寻道时间优先 SSTF

算法选择这样的进程，其要求访问的磁道，与当前磁头所在的磁道距离最近，以使每次的寻道时间最短，SSTF 调度本质上是一种最短作业优先（SJF）调度,同样并不能保证平均寻道时间最短。
SSTF 算法虽然能获得较好的寻道性能，但却可能导致某个进程发生“饥饿 Starvation”现象。

#### SCAN 算法

SSTF 算法虽然能获得较好的寻道性能，但却可能导致某个进程发生“饥饿”(Starvation)现象。因为只要不断有新进程的请求到达，且其所要访问的磁道与磁头当前所在磁道的距离较近，这种新进程的 I/O 请求必然优先满足。对 SSTF 算法略加修改后所形成的 SCAN 算法，即可防止老进程出现“饥饿”现象。

SCAN 算法不仅考虑到欲访问的磁道与当前磁道间的距离，更优先考虑的是磁头当前的移动方向。例如，当磁头正在自里向外移动时，SCAN 算法所考虑的下一个访问对象，应是其欲访问的磁道既在当前磁道之外，又是距离最近的。这样自里向外地访问，直至再无更外的磁道需要访问时，才将磁臂换向为自外向里移动。这时，同样也是每次选择这样的进程来调度，即要访问的磁道在当前位置内距离最近者，这样，磁头又逐步地从外向里移动，直至再无更里面的磁道要访问，从而避免了出现“饥饿”现象。由于在这种算法中磁头移动的规律颇似电梯的运行,先处理完一个方向的请求，然后再处理相反方向的请求，因而又常称之为电梯调度算法。

#### CSCAN 算法

CSCAN 算法规定磁头单向移动，例如，只是自里向外移动，当磁头移到最外的磁道并访问后，磁头立即返回到最里的欲访问磁道，亦即将最小磁道号紧接着最大磁道号构成循环，进行循环扫描。

SCAN 算法既能获得较好的寻道性能,又能防止“饥饿”现象,故被广泛使用。
但 SCAN 算法存在这样的问题： 当磁头刚从里向外移动而越过了某一磁道时，恰好又有一进程请求访问此磁道，这时，该进程必须等待，待磁头继续从里向外，然后再从外向里扫描完处于外面的所有要访问的磁道后，才处理该进程的请求，致使该进程的请求被大大地推迟。
为了减少这种延迟，CSCAN 算法规定磁头单向移动。

例如，只是自里向外移动，当磁头移到最外的磁道并访问后，磁头立即返回到最里的欲访问磁道，亦即将最小磁道号紧接着最大磁道号构成循环，进行循环扫描。
采用循环扫描方式后，上述请求进程的请求延迟将从原来的 2T 减为 T+Smax。
其中 T 为由里向外或由外向里单向扫描完要访问的磁道所需的寻道时间，而 Smax 是将磁头从最外面被访问的磁道直接移到最里面欲访问的磁道的寻道时间。

#### LOOK 调度

SCAN 和 C-SCAN 在磁盘的整个宽度内移动磁臂。实际上，这两种算法通常都不是按这种方式实施的。更常见的是，磁臂只需移到一个方向的最远请求为止。

遵循这种模式的 SCAN 算法和 C-SCAN 算法分别称为 LOOK 和 C-LOOK 调度，因为它们在向特定方向移动时查看是否会有请求
