5.1 I/O 管理基础与 I/O 软件层次
I/O 设备的分类,I/O 接口(设备控制器)与 I/O 端口;程序直接控制、中断驱动、DMA、通道四种 I/O 控制方式;I/O 软件的层次结构(用户层软件、设备独立性软件、设备驱动程序、中断处理程序);字符、块、网络设备接口与阻塞/非阻塞 I/O。
I/O 设备
I/O 设备是将数据输入计算机或者接收计算机输出数据的外部设备。常见的分类方法有:
| 分类依据 | 类别 |
|---|---|
| 使用特性 | 人机交互类外部设备(键盘、鼠标、显示器、打印机,速度较慢);存储设备(磁盘、光盘,速度快);网络通信设备(网卡、调制解调器) |
| 传输速率 | 低速设备(键盘、鼠标);中速设备(打印机);高速设备(磁盘、光盘) |
| 信息交换的单位 | 块设备、字符设备 |
- 块设备:数据的存取和传输都以数据块为单位,属于有结构设备,如磁盘。传输速率较高,可寻址,即可以随机地读写任意一块。通常采用 DMA 方式。
- 字符设备:数据的存取和传输以字符为单位,属于无结构设备,如交互式终端、打印机。传输速率较低,不可寻址,常采用中断方式。
设备控制器与 I/O 端口
CPU 不直接控制 I/O 设备,而是通过设备控制器(I/O 接口)来控制。设备控制器的主要功能是:接收和识别 CPU 发来的命令、与 CPU 和设备交换数据、标识和报告设备的状态、地址识别、数据缓冲和差错控制。它由三部分组成:
- 设备控制器与 CPU 的接口:包括数据线、地址线和控制线,数据线连接数据寄存器和控制/状态寄存器;
- 设备控制器与设备的接口:一个控制器可以连接一台或多台设备;
- I/O 逻辑:接收 CPU 发来的命令,对地址进行译码,控制设备的操作。
设备控制器中可以被 CPU 直接访问的寄存器称为 I/O 端口(数据寄存器、状态寄存器、控制寄存器)。端口的编址有独立编址(使用专门的 I/O 指令)和统一编址(与主存统一编址,用访存指令访问)两种,详见计算机组成原理中的 I/O 接口一节。
I/O 控制方式
| 方式 | 过程 | CPU 的干预 | 数据传送单位 |
|---|---|---|---|
| 程序直接控制(轮询) | CPU 向控制器发出读命令后,不断读状态寄存器,直到设备就绪才从数据寄存器取走数据 | CPU 一直在测试状态(忙等),与设备串行工作 | 字 |
| 中断驱动 | CPU 发出命令后转去做其他事;设备准备好一个数据后发出中断,CPU 在中断处理中读取数据 | 每传送一个字都要中断一次 | 字 |
| DMA | CPU 只需设置好内存地址、字节数等参数;数据块的传送由 DMA 控制器直接在设备与内存之间完成,传完后发一次中断 | 仅在一个数据块传送的开始和结束时干预 | 数据块 |
| 通道 | CPU 发出 I/O 指令,指出要执行的通道程序和设备;通道执行通道程序完成一组数据块的传送,全部完成后才中断 CPU | 一组数据块的传送只需一次干预 | 一组数据块 |
通道是专门负责输入/输出的处理机,有自己的指令系统(通道指令),但指令类型单一,而且没有自己的内存,通道程序存放在主机的内存中,与 CPU 共享内存。与 DMA 相比:DMA 方式下由 CPU 控制传送的数据块大小、内存位置,而通道方式中这些信息由通道控制;一个 DMA 控制器只能控制一台(或少数几台同类)设备,一个通道可以控制多台设备。
各种方式的硬件细节和 CPU 开销计算见计算机组成原理第 7 章。
I/O 软件的层次结构
I/O 软件通常组织成四个层次,每层利用下层提供的服务完成本层的功能,并屏蔽实现细节,向上层提供服务:
| 层次 | 主要功能 |
|---|---|
| 用户层 I/O 软件 | 实现与用户交互的接口。用户调用库函数(如 printf、fread)对设备进行操作,库函数再执行相应的系统调用。假脱机系统(SPOOLing)也在这一层实现 |
| 设备独立性软件 | 也称与设备无关的软件,是系统调用的处理程序。向用户层提供统一的调用接口(如 read/write);设备命名——把逻辑设备名映射为物理设备名(逻辑设备表 LUT);设备保护;差错处理;设备分配与回收;缓冲区管理;建立逻辑块与设备块之间的大小映射 |
| 设备驱动程序 | 与硬件直接相关,负责具体实现系统对设备发出的操作指令。把上层抽象的 I/O 请求转换为具体的命令,写入设备控制器的寄存器,检查设备状态。每类设备配置一个驱动程序,通常以进程的形式存在 |
| 中断处理程序 | 保护被中断进程的 CPU 环境,分析中断原因,转去执行相应的中断处理,处理完后唤醒被阻塞的驱动程序进程,恢复现场 |
设备独立性(设备无关性)是指应用程序使用逻辑设备名来请求设备,而不直接使用物理设备名,系统通过逻辑设备表把逻辑设备映射到物理设备。这样,更换或增加物理设备时不必修改应用程序,I/O 重定向也很方便。
应用程序 I/O 接口
设备独立性软件把设备按特性分为几类,为每一类提供统一的接口:
- 字符设备接口:用
get、put操作逐个字符地读写。字符设备不可寻址,通常属于独占设备,需要互斥使用(open/close用于申请和释放设备)。 - 块设备接口:用
read、write(以及seek)以块为单位读写,可寻址。块设备接口还可以把磁盘上的文件映射到进程的地址空间(内存映射接口),之后像访问内存一样访问文件。 - 网络设备接口:现代操作系统提供面向网络的套接字(socket)接口,应用程序通过创建、连接、发送和接收套接字来通信。
按照调用 I/O 后进程是否等待,又分为:
- 阻塞 I/O:用户进程调用 I/O 操作时,进程被阻塞,直到 I/O 操作完成才被唤醒继续执行;
- 非阻塞 I/O:用户进程调用 I/O 操作时不会被阻塞,调用立即返回(如果数据没准备好则返回一个错误码),进程需要不断地询问 I/O 是否完成。
即时练习
- 1用户程序发出磁盘 I/O 请求后,系统的正确处理流程是( )。
- 2操作系统的 I/O 子系统通常由 4 个层次组成,每层明确定义了与邻近层次的接口,其合理的层次组织排列顺序是( )。
- 3系统将数据从磁盘读到内存的过程包括以下操作:① DMA 控制器发出中断请求 ② 初始化 DMA 控制器并启动磁盘 ③ 从磁盘传输一块数据到内存缓冲区 ④ 执行「DMA 结束」中断服务程序。正确的执行顺序是( )。
- 4对于具备设备独立性的系统,下列叙述中,错误的是( )。
- 5本地用户通过键盘登录系统时,首先获得键盘输入信息的程序是( )。
- 6下列关于通道的叙述中,错误的是( )。
标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。