OS-IO

IO设备
IO设备是多种多样的,它们传输数据速率的数量级差距能够达到12个数量级。因此我们需要给IO设备进行分类。按照类为设备设计抽象,进行设计管理。
IO管理
设备控制器(IO接口)
IO接口又称设备控制器,主要由3部分组成:
- 与CPU的接口
用于实现CPU与控制器的通信。该类接口有三种信号线:数据线(传送读写数据)、地址线(要访问IO接口中的寄存器编号)、控制线(传送读写等控制信号)
- 与设备的接口
一个设备控制器通常能够与多个设备相联,因此通常有多个与设备的接口。设备接口可传输数据、控制和状态三种信号
- IO逻辑
用于实现CPU对于IO设备的控制,通过一组控制线与CPU进行交互,对从CPU收到的指令进行译码
设备控制器有以下几个主要功能:接收和识别CPU命令、进行数据交换(包括CPU与控制器、控制器与设备之间)、设备状态的了解和报告、设备地址识别、数据缓冲
IO端口
IO端口指设备控制器中可以被CPU直接访问的寄存器,主要有:
- 数据寄存器:缓存从设备发送来的输入数据或CPU发送来的输出数据
- 状态寄存器:保存设备的执行结果或状态,供CPU读取
- 控制寄存器:由CPU写入,用于启动命令或更改设备模式
IO请求的处理过程
IO控制方式
IO控制指控制设备和主机之间的数据传送。IO控制的宗旨是尽量减少CPU对于IO控制的直接干预。
IO控制方式主要有以下4种:
- 程序直接控制
又称轮询或查询方式IO,由CPU代表进程向I/O模块发出指令,然后进入忙等状态,直到操作完成之后进程才能够继续执行。
在这种方式中,CPU绝大部分时间处于轮询状态,且CPU和IO设备只能串行工作,使得CPU利用率低。这里之所以需要CPU不断的循环询问IO设备状态,是因为IO设备无法向CPU报告输入操作的完成。要想实现“向CPU报告”,就需要引入中断
- 中断驱动
中断允许IO设备主动打断CPU的运行并请求服务,达到了“向CPU报告”的目的,使得CPU能够在向IO控制器发出IO指令后执行其他工作。
从CPU的角度看分析整个IO过程,我们能够清晰的理解为什么中断能够提高CPU的利用率:当前进程需要进行IO操作,那么CPU向IO控制器发出IO命令,然后阻塞该进程,保存该进程上下文,转而去执行其他进程。当IO操作完成,数据被读入到IO控制器的数据寄存器,IO控制器向CPU发出中断信号。CPU接受到中断信号,阻塞当前进程,保存上下文,转而去处理中断请求:将设备控制器中的数据读入到寄存器中,并存储到主存。处理完成后,恢复IO进程的状态为可执行状态,恢复上下文,然后继续执行该进程。
但中断方式依然有两个问题:1. 设备与内存之间的数据交换必须经过CPU中的寄存器;2. 每传输一个字节就需要中断一次CPU,多次中断导致CPU时间浪费,因此只适用于数据传输速率较低的设备
- DMA方式
DMA,直接存储器读取方式,在IO设备和和内存之间开辟直接的数据交换通路,彻底解放CPU。
DMA方式有以下特点:
- 不同于中断驱动方式的按字节传输,DMA方式的基本传送单位是块
- 仅在传送多个数据块的开始和结束阶段才需要CPU干预,传送过程中不需要
这些特点使得CPU干预频率进一步降低,CPU和设备的并行程度进一步提高
DMA的工作流程为:CPU接受到设备的DMA请求后,向DMA控制器发出一条命令,启动DMA控制器,并将IO控制权交给DMA控制器,然后进行其他工作。当所有数据传输完成后,DMA控制器向CPU发送中断信号。
- 通道
DMA方式下,数据的传送方向、存放数据的内存起始地址和数据块长度都由CPU控制;通道是一个特殊的处理器,有自己的指令和程序,通过执行通道程序实现对数据传输的控制,所以通道具有更强的独立处理I/O的功能。
另外,每个DMA控制器只能对应一台设备,而一个通道可以控制多台设备与内存进行数据交换
IO软件层次结构
- 用户进程:使用IO系统调用
- 设备无关软件层
设备无关性,指应用程序所用的设备不局限于某一具体物理设备。我们使用逻辑设备名来实现设备无关性,在实际使用时将逻辑设备名映射成物理设备名。
为了实现设备无关性,必须在驱动程序层上设置一层设备无关软件层,其主要功能可分为两类:1. 执行所有设备的公共操作,如命名、保护、阻塞、缓冲、分配设备 2. 向用户层提供统一接口
- 设备驱动程序
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动IO设备工作。
- 中断处理程序
用来进行保存进程上下文,转入相应中断处理程序,处理完毕后恢复现场等与中断处理息息相关的工作
我们可以通过一个用户进行IO操作的例子来理解IO软件的层次结构
假设用户在文本编辑软件中完成了编辑,现在点击了“保存”按钮,希望将内容保存到硬盘中。
- 用户层操作:用户在文档编辑软件中点击“保存”。文档编辑软件内部会调用操作系统提供的文件保存或写入相关的系统调用接口(例如在编程中常见的
write()
或save()
函数)- 设备无关层操作:操作系统接收到文档编辑软件发来的文件保存请求。当操作系统接收到保存请求时,它以一种通用的方式处理这个请求。它可能会检查用户是否有写入权限,将文件名转换为文件系统内部的标识,确定数据应该逻辑上写入硬盘的哪个位置。它也可能使用缓冲区(Buffer)来临时存放数据,以便更高效地写入硬盘。
- 设备驱动程序:设备独立层将写入请求(包含数据和目标位置信息)发送给具体的硬盘驱动程序。驱动程序了解其对应硬件的特定命令、寄存器和工作方式。它负责将设备独立层发送来的通用请求翻译成硬件能够理解和执行的命令。
- 中断处理程序:硬盘完成数据写入后,向CPU发出一个中断信号。
缓冲技术
引入缓冲技术的主要目的有:缓和CPU与外设间速度不匹配的矛盾、提高CPU与外设的并行性。
常见的几种缓冲方式:
- 单缓冲
当用户进程发出一个IO请求,操作系统便在内存中建立一块缓冲区。设备将数据输入到缓冲区中,CPU从缓冲区中读取数据。
缓冲区是共享资源,因此使用时必须互斥使用。我们规定IO设备将数据输入到缓冲区所需的时间为
可以看出,单缓冲区使得
- 双缓冲
顾名思义,我们现在有两个缓冲区。IO设备先将数据送入缓冲区1,装满后转向缓冲区2,同时,可以将缓冲区1中的数据送入CPU进行处理,当CPU处理完缓冲区1中的数据后,如果缓冲区2已满,便可将缓冲区2中的数据送入CPU处理,如此循环。
从上面的描述可以看出,
- 循环缓冲
将所有缓冲区以循环链表的形式连接在一起,设置in
和out
两个指针,in
指向第一个可以输入数据的空缓冲区,out
指向第一个可以输出给CPU数据的满缓冲区。
设备管理数据结构
- 设备控制表 DCT
系统为每一个设备分配一个DCT,它描述设备特性和状态。反映设备的特性、设备和控制器的连接情况。
- 控制器控制表 COCT
系统为每一个控制器分配一个COCT,它描述I/O控制器的配置和状态。如DMA控制器所占用的中断号、DMA数据通道的分配。
- 通道控制表 CHCT
系统为每个通道分配一张,描述通道的工作状态
- 系统内设备表
系统内一张,反映系统中设备资源的状态,记录所有设备的状态及其设备控制表的入口,每个物理设备对应一个表目
假脱机技术 SPOOLing
SPOOLing是一种通过假脱机技术提高系统资源利用率和作业吞吐量的方法,主要用于解决早期计算机系统中低速外围设备与高速CPU之间的速度不匹配问题。其核心思想是将独占设备虚拟化为共享设备。
假脱机系统由以下部分组成:
- 输入井(Input Spool)和输出井(Output Spool)
在磁盘上开辟的专用存储区域,分别用于暂存待处理的输入作业和输出结果。 - 输入缓冲区和输出缓冲区
内存中的缓冲区,用于临时存放从输入设备读取或向输出设备写入的数据。 - 输入管理进程和输出管理进程
输入进程:负责将用户作业从输入设备预读到输入井中。
输出进程:负责将输出井中的结果逐步传输到输出设备(如打印机)。
以打印操作为例,当用户进程需要进行打印操作时,不会将打印数据直接提交至打印机,而是提交到输出缓冲区,相当于将打印任务提交给了一个逻辑打印机。打印操作也并非即时进行,而是等到物理打印机空闲而打印任务处于等待队列的队首,才执行该打印任务。但这一切对于用户进程是不可见的。如此一来,每个用户进程都觉得自己在独占一台打印机(逻辑打印机),从而实现对于打印机的共享。
SPOOLing技术最大的贡献在于缩短了CPU的等待时间。假如没有SPOOLing,当CPU需要打印数据时,打印机的速度显著慢于CPU的速度,那么CPU只能“原地”等待打印机完成打印操作后,CPU才能进行下一步工作。而SPOOLing使得CPU在将打印数据提交至虚拟打印机后,便认为“打印已经完成”,即可转而去执行其他任务,这样便节省了时间。
设备驱动程序
设备独立层将写入请求(包含数据和目标位置信息)发送给具体的硬盘驱动程序。驱动程序了解其对应硬件的特定命令、寄存器和工作方式。它负责将设备独立层发送来的通用请求翻译成硬件能够理解和执行的命令。
设备驱动程序的功能决定了它与硬件的强相关性,对于不同的物理设备,设备驱动程序也不同,并且许多设备驱动程序已经固化在ROM中。
- Title: OS-IO
- Author: OWPETER
- Created at : 2025-05-06 22:33:19
- Updated at : 2025-05-22 20:12:44
- Link: https://owpeter.github.io/2025/05/06/OS-IO/
- License: This work is licensed under CC BY-NC-SA 4.0.