5.1 I/O管理概述
5.1.1 I/O设备
注:块设备可以寻址,但是字符设备是不可寻址的
I/O设备是将数据输入到计算机中,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件;
- 设备的分类
- 按使用特性分类:
- 人机交互类外部设备:鼠标、键盘、打印机等,用于人机交互。数据传输速度慢。
- 存储设备:移动硬盘、光盘等,用于数据存储。数据传输速度快。
- 网络通信设备:调制解调器等,用于网络通信。数据传输速度介于上述二者之间。
- 按信息交换的单位分类:
- 块设备。信息交换以数据块为单位。它属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高、可寻址,即对它可随机地读/写任意一块。
- 字符设备。信息交换以字符为单位。它属于无结构类型,如交互式终端机、打印机等。
- 按传输速率分类:
- 低速设备。传输速率仅为每秒几字节到数百字节的一类设备,如键盘、鼠标等。
- 中速设备。传输速率为每秒数千字节至数万字节的一类设备,如激光打印机等。
- 高速设备。传输速率在数百千字节至千兆字节的一类设备,如磁盘机、光盘机等。
- 按使用特性分类:
- I/O接口
I/O接口
(又称为设备控制器
)位于CPU与设备之间,它既要与CPU通信,又要与设备通信,还要具有按CPU发来的命令去控制设备工作的功能,主要由三部分组成,如下图所示。
-
组成部分:
-
设备控制器与CPU的接口:实现控制器与CPU之间的通信
该接口有三类信号线:数据线、地址线和控制线。
数据线与两类寄存器相连:数据寄存器(存放从设备送来的输入数据或从CPU送来的输出数据)和控制/状态寄存器(存放从CPU送来的控制信息或设备的状态信息)。
-
设备控制器与设备的接口:实现控制器与设备之间的通信
一个设备控制器可以连接一个或多个设备,因此控制器中有一个或多个设备接口。
每个接口中都存在数据、控制和状态三种类型的信号。
-
I/O逻辑:负责识别CPU发出的命令,并向设备发出命令
用于实现对设备的控制。它通过一组控制线与CPU交互,对从CPU收到的I/O命令进行译码。
CPU启动设备时,将启动命令发送给控制器,同时通过地址线把地址发送给控制器,由控制器的I/O逻辑对地址进行译码,并相应地对所选设备进行控制。
-
-
主要功能:
- 接受和识别CPU发出的指令(控制寄存器)
- 向CPU报告设备的状态(状态寄存器)
- 数据交换(数据寄存器暂存数据)
- 地址识别(由I/O逻辑实现)
- 数据缓冲
- 差错控制
3.I/O端口
I/O端口是指设备控制器中可被CPU直接访问的寄存器,主要有以下三类寄存器。
-
寄存器类型:
- 数据寄存器:实现CPU和外设之间的数据缓冲。
- 状态寄存器:获取执行结果和设备的状态信息,以让CPU知道是否准备好。
- 控制寄存器:由CPU写入,以便启动命令或更改设备模式。
-
实现I/O端口通信,有两种编址方法:
- 独立编址。为每个端口分配一个I/O端口号,所有I/O端口形成I/O端口空间,普通用户程序不能对其进行访问,只有操作系统使用特殊的I/O指令才能访问端口。
- 统一编址。又称内存映射I/O,每个端口被分配唯一的内存地址,且不会有内存被分配这地址,通常分配给端口的地址靠近地址空间的顶端。
5.1.2 I/O控制方式
设备管理的主要任务之一是控制设备和内存或CPU之间的数据传送。外围设备与内存之间的输入/输出控制方式有以下4种。
-
程序直接控制方式
如下图所示,计算机从外部设备读取的每个字,CPU需要对外设状态进行循环检查,直到确定该字已经在I/O控制器的数据寄存器中。
-
工作流程:
-
CPU干预的频率:很频繁,I/O操作开始之前、完成之后需要CPU介入,并且在等待I/O完成的过程中CPU需要不断地轮询检查。
-
数据传送的单位:每次读/写一个字
-
数据的流向:
- 读操作(数据输入):I/O设备→CPU→内存
- 写操作(数据输出):内存→CPU→I/O设备
- 每个字的读/写都需要CPU的帮助
-
优点:实现简单。在读/写指令之后,加上实现循环检查的一系列指令即可
-
缺点:CPU和I/O设备只能串行工作,CPU需要一直轮询检查,长期处于“忙等”状态,CPU利用率低。
这种方式不会让进程阻塞
/*实际上,程序直接控制方式(也称为忙等待或轮询)在某些情况下确实会让进程阻塞,但这里的“阻塞”与传统意义上的操作系统中的阻塞(如等待I/O操作完成而挂起进程)有所不同。在程序直接控制方式中,进程不会因等待I/O操作完成而被操作系统挂起或切换到其他进程,但它会停留在当前的循环中,不断检查I/O操作的完成情况,这同样会导致进程无法执行其他任务,从而形成一种“阻塞”的效果,尽管这种阻塞是在用户态内发生的,并未涉及操作系统层面的进程调度。 详细解释如下: 忙等待(Busy Waiting):在程序直接控制方式中,当进程需要执行I/O操作时,它不会通过系统调用来请求操作系统完成I/O,而是会直接在用户态中循环检查I/O设备的状态。如果I/O操作尚未完成,进程会继续循环检查,而不是被操作系统挂起或切换到其他进程。这种持续的检查操作占用了CPU资源,但进程并没有进行实质性的工作(如处理数据、计算等),因此被视为一种“忙等待”或“轮询”。 CPU资源浪费:由于进程在忙等待期间持续占用CPU资源,而并没有进行有效的计算或处理,这会导致CPU资源的浪费。特别是当I/O操作需要较长时间才能完成时,这种浪费尤为明显。 响应性差:由于进程被“阻塞”在忙等待循环中,它无法及时响应其他事件或请求,如用户输入、定时器中断等。这会导致程序的响应性变差,用户体验下降。 并非真正的阻塞:然而,需要注意的是,程序直接控制方式中的“阻塞”与传统意义上的阻塞(如等待I/O操作完成而挂起进程)是不同的。在程序直接控制方式中,进程并没有被操作系统挂起或切换到其他进程,它仍然在运行中,只是由于持续进行无效的忙等待而无法执行其他任务。 综上所述,程序直接控制方式虽然不会让进程在操作系统层面被挂起或阻塞,但它通过忙等待的方式同样会导致进程无法执行其他任务,从而形成一种在用户态内的“阻塞”效果。因此,在实际应用中,我们通常会采用更高效的I/O控制方式(如中断驱动方式、DMA方式等)来避免这种不必要的资源浪费和性能下降。*/
-
-
中断驱动方式
中断驱动方式的思想是,允许I/O设备主动打断CPU的运行并请求服务,从而"解放” CPU,使得其向I/O控制器发送读命令后可以继续做其他有用的工作。
- 工作流程:
- 引入中断机制。由于I/O设备速度很慢,因此在CPU发出读/写命令后,可将等待I/O的进程阻塞,先切换到别的进程执行。
- 当I/O完成后,控制器会向CPU发出一个中断信号,CPU检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。
- 处理中断的过程中,CPU从I/O控制器读一个字的数据传送到CPU寄存器,再写入主存。接着,CPU恢复等待I/O的进程(或其他进程)的运行环境,然后继续执行。
①CPU会在每个指令周期的末尾检查中断:
②中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销的。可见,如果中断发生的须率太高,也会降低系统性能。- CPU干预的频率:每次I/O操作开始之前、完成之后需要CPU介入。等待I/O完成的过程中CPU可以切换到别的进程执行。
- 数据传送单位:每次读/写一个字
- 数据流向:
- 读操作(数据输入):I/O设备→CPU→内存
- 写操作(数据输出):内存→CPU→I/O设备
- 优点:与“程序直接控制方式”相比,在“中断驱动方式”中,I/O控制器会通过中断信号主动报告I/O已完成,CPU不再需要不停地轮询。CPU和I/O设备可并行工作,CPU利用率得到明显提升。
- 缺点:每个字在I/O设备与内存之间的传输,都需要经过CPU。而频繁的中断处理会消耗较多的CPU时间。
这种方式会让进程阻塞
- 工作流程:
-
DMA方式
DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU。下图为DMA工作流程。
-
与“中断驱动方式”相比,DMA方式有这样几个改进:
- ①数据的传送单位是“块”。不再是一个字、一个字的传送:
- ②数据的流向是从设备直接放入内存,或者从内存直接到设备。不再需要CPU作为“快递小哥”。
- ③仅在传送一个或多个数据块的开始和结束时,才需要CPU干预,数据传送通过DMA控制器完成。
-
DMA控制器组成:
下图为DMA控制器的组成。
DMA控制器中设置如下4类寄存器:
- 数据寄存器(DR)。暂存从设备到内存或从内存到设备的数据。
- 内存地址寄存器(MAR)。在输入时,它存放把数据从设备传送到内存的起始目标地址;在输出时,它存放由内存到设备的内存源地址。
- 数据计数器(DC)。存放本次要传送的字(节)数,剩余要读/写的字节数。
- 命令/状态寄存器(CR)。接收从CPU发来的I/O命令、有关控制信息,或设备的状态。
-
CPU干预的频率:仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。
-
数据传送单位:每次读/写一个或多个块(注意:每次读写的只能是连续的多个块,且这些块读入内存后在内存中也必须是连续的)
-
数据流向:
- 读操作(数据输入):I/O设备→内存
- 写操作(数据输出):内存→I/O设备
-
优点:数据传输以“块”为单位,CPU介入频率进一步降低。数据的传输不再需要先经过CPU再写入内存,数据传输效率进一步增加。CPU和I/O设备的并行性得到提升。
-
缺点:CPU每发出一条I/O指令,只能读/写一个或多个连续的数据块。如果要读/写多个离散存储的数据块,或者要将数据分别写到不同的内存区域时,CPU要发出多条I/O指令,进行多次中断处理才能完成。
-
-
通道控制方式
通道:I/O通道是指专门负责输入输出的处理机。是一种硬件,可以理解为是“弱鸡版的CPU”。通道可以识别并执行一系列通道指令。
与CPU相比,通道可以执行的指令很单一,并且通道程序是放在主机内存中的,也就是说通道与CPU共享内存
-
完成一次读写流程:
-
CPU干预的频率:极低,通道会根据CPU的指示执行相应的通道程序,只有完成一组数据块的读/写后才需要发出中断信号,请求CPU干预。
-
数据传送的单位:每次读/写一组数据块
-
数据的流向(在通道的控制下进行)
- 读操作(数据输入):I/O设备→内存
- 写操作(数据输出):内存→I/O设备
-
缺点:实现复杂,需要专门的通道硬件支持
-
优点:CPU、通道、I/O设备可并行工作,资源利用率很高。
-
5.1.4 I/O软件层次结构
为了更好地设计 I/O 软件,采用 层次式结构 的 I/O 软件;
一个比较合理的层次划分如上图所示。整个I/O软件可以视为具有4个层次的系统结构,各层次功能如下:
-
用户层软件(产生I/O请求,格式化I/O,SPOOLing)
实现了与用户交互的接口,用户可直接使用该层提供的、与I/O操作相关的库函数对设备进行操作。
用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务
-
设备独立性软件(映射;保护;分块;缓冲;分配)
设备独立性软件,又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。
-
功能:
- ① 向上层提供统一的调用接口(如read/write系统调用)
- ② 设备的保护
- ③ 差错处理
- ④ 设备的分配与可收
-
-
⑤ 数据缓冲区管理
- ⑥ 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序
-
逻辑设备
为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。
使用逻辑设备名好处:
-
①增加设备分配的灵活性
- ②易于实现I/O重定向,指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
设备独立性软件需要通过“逻辑设备表(LUT,Logical Unit Table)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。
I/O设备被当做一种特殊的文件;不同类型的I/O设备需要有不同的驱动程序处理
操作系统系统可以采用两种方式管理逻辑设备表(LUT):
- 第一种方式,整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统。
-
第二种方式,为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中。
-
设备驱动程序(设置设备寄存器,检查设备状态)
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。 将上层发出的一系列命令(如read/write)转化成特定设备“能听得懂”的一系列操作。
不同设备的内部硬件特性也不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。
为I/O内核子系统隐藏设备控制器之间的差异。
4.中断处理程序
当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。
-
中断处理程序的处理流程如下:
-
中断处理层的任务:
- 进行进程上下文的切换,
- 对处理中断信号源进行测试,
- 读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,因此应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
5.硬件
执行IO操作,机械部件、电子部件组成
总结
说明用户对设备的一次命令过程如下所示:
- ①当用户要读取某设备的内容时,通过操作系统提供的read命令接口,这就经过了用户层。
- ②操作系统提供给用户使用的接口,一般是统一的通用接口,也就是几乎每个设备都可以响应的统一命令,如read命令,用户发出的read命令,首先经过设备独立层进行解析,然后交往下层。
- ③接下来,不同类型的设备对read命令的行为会有所不同,如磁盘接收read命令后的行为与打印机接收read命令后的行为是不同的。因此,需要针对不同的设备,把read命令解析成不同的指令,这就经过了设备驱动层。
- ④命令解析完毕后,需要中断正在运行的进程,转而执行read命令,这就需要中断处理程序。
- ⑤最后,命令真正抵达硬件设备,硬件设备的控制器按照上层传达的命令操控硬件设备,完成相应的功能。
理解:
直接涉及到硬件其体细节、且与中断无关的操作肯定是在设备驱动程序层完成的;
没有涉及硬件的、对各种设备都需要进行的管理工作都是在设备独立性软件层完成的。
5.1.4 应用程序I/O接口
在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干接口。
-
字符设备接口
字符设备是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。基本特征是传输速率较低、不可寻址,并且在输入输出时通常采用中断驱动方式。
-
字符设备的操作
- get和put操作。由于字符设备不可寻址,只能采取顺序存取方式,通常为字符设备建立一个字符缓冲区,用户程序通过get操作从缓冲区获取字符,通过put操作将字符输出到缓冲区。
- in-control指令。字符设备类型繁多,差异甚大,因此在接口中提供一种通用的in-control指令来处理它们(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。
字符设备都属于独占设备,为此接口中还需要提供打开和关闭操作,以实现互斥共享。
-
-
块设备接口
块设备是指数据的存取和传输是以数据块为单位的设备,典型的块设备是磁盘。基本特征是传输速率较高、可寻址。磁盘设备的I/O常采用DMA方式。
- 隐藏了磁盘的二维结构:在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示。块设备接口将磁盘的所有扇区从0到n-1依次编号,这样,就将二维结构变为一种线性序列。
- 将抽象命令映射为低层操作:块设备接口支持上层发来的对文件或设备的打开、读、写和关闭等抽象命令,该接口将上述命令映射为设备能识别的较低层的具体操作。
- 内存映射接口:内存映射接口通过内存的字节数组来访问磁盘,而不提供读/写磁盘操作。映射文件到内存的系统调用返回包含文件副本的一个虚拟内存地址。只在需要访问内存映像时,才由虚拟存储器实际调页。内存映射文件的访问如同内存读写一样简单,极大地方便了程序员。
-
网络设备接口
许多操作系统提供的网络I/O接口为网络套接字接口,套接字接口的系统调用使应用程序创建的本地套接字连接到远程应用程序创建的套接字,通过此连接发送和接收数据。
-
阻塞/非阻塞I/O
-
**阻塞I/O:**当用户进程调用I/O操作时,进程就被阻塞,需要等待I/O操作完成,进程才被唤醒继续执行。
eg:字符设备接口一一从键盘读一个字符get
-
非阻塞I/O:用户进程调用I/O操作时,不阻塞该进程,该I/O调用返回一个错误返回值,通常,进程需要通过轮询的方式来查询I/O操作是否完成。
eg:块设备接口一一往磁盘写数据write
-
5.1.5 本节小结
I/O管理要完成哪些功能?
I/O管理需要完成以下4部分内容:
- 状态跟踪。要能实时掌握外部设备的状态。
- 设备存取。要实现对设备的存取操作。
- 设备分配。在多用户环境下,负责设备的分配与回收。
- 设备控制。包括设备的驱动、完成和故障的中断处理。
错题总结或者需要注意的点
1.共享设备必须是可寻址和可随机访问的设备
2.共享设备是指在一段时间内允许多个进程同时访问的设备,而不是同一时刻
3.虚拟设备是指,把一个物理设备变换成多个对应的逻辑设备
4.设备控制器通常需要提供:控制寄存器,状态寄存器和控制命令
5.在OS中,通道技术是一种硬件机制
6.通道控制设备控制器,设备控制器控制设备工作
7.向设备寄存器的写命令是在I/O软件中的设备驱动程序完成的
8.中断驱动方式:
处理中断请求:一旦确定了中断源,中断处理程序就会执行与该中断源相关联的特定代码。这可能包括读取设备的状态寄存器、从设备读取数据或向设备写入数据、更新系统的状态或执行其他必要的操作。