王道操作系统 5.1 I/O管理概述
5.1 I/O管理概述
设备的读写本质是在设备控制器(IO接口)和主机之间传送数据

5.1.1 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控制器的数据寄存器中。
工作流程:


这种方式不会让进程阻塞
实际上,程序直接控制方式(也称为忙等待或轮询)在某些情况下确实会让进程阻塞,但这里的“阻塞”与传统意义上的操作系统中的阻塞(如等待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的进程(或其他进程)的运行环境,然后继续执行。

- 工作流程:
DMA方式
DMA(直接存储器存取)方式的基本思想是在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU。

DMA控制器组成:


预处理程序和后处理程序都运行在内核态,负责预处理的进程是请求I/O的进程,请求IO的进程通过系统调用进去内核态,负责后处理的进程是中断服务例程(不是一个单独的进程)。
预处理由请求IO的进程在内核态执行相关操作,之后阻塞自身,直到系统调用返回,因此在后处理阶段请求IO的进程仍处在阻塞态。(也就是说预处理是运行态,预处理结束就进入阻塞态直到系统调用返回)
通道控制方式
通道:I/O通道是指专门负责输入输出的处理机
通道控制设备控制器,设备控制器控制设备


5.1.4 I/O软件层次结构

设备驱动程序和中断处理程序会直接和硬件打交道,而设备独立性软件不会
为了更好地设计 I/O 软件,采用 层次式结构 的 I/O 软件;

一个比较合理的层次划分如上图所示。整个I/O软件可以视为具有4个层次的系统结构,各层次功能如下:
用户层软件(产生I/O请求,格式化I/O,SPOOLing)

设备独立性软件(映射;保护;分块;缓冲;分配)




逻辑设备为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。
使用逻辑设备名好处:
①增加设备分配的灵活性
②易于实现I/O重定向,指用于I/O操作的设备可以更换(即重定向),而不必改变应用程序。
设备独立性软件需要通过“逻辑设备表(LUT,Logical Unit Table)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。
I/O设备被当做一种特殊的文件;不同类型的I/O设备需要有不同的驱动程序处理


设备驱动程序(设置设备寄存器,检查设备状态)


与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
设备独立性软件并不直接控制硬件,而是通过驱动程序进行控制
为I/O内核子系统隐藏设备控制器之间的差异。


1.设备驱动程序会负责处理与设备相关的中断处理过程
2.磁盘调度是由驱动程序负责的
3.不同的IO控制方式需要不同的驱动程序来实现数据的传输和控制
4.进程在执行驱动程序的时候可能会陷入阻塞态。


设备驱动程序的处理过程: 1.将抽象要求转化为具体要求
2.对服务请求进行校验
3.检查设备的状态
4.传送必要的参数
5.启动IO设备
系统调用的地址如何转换为磁盘的柱面号,盘面号,扇区号
上图清晰地展示了转换过程中的核心分工:文件系统负责逻辑块映射,设备驱动负责硬件地址翻译。下面我们详细解析这两个关键步骤。
文件系统:从文件偏移到逻辑块号当应用程序请求读取文件某个偏移量(如3000字节)处的数据时,文件系统首先接手工作:
- 计算逻辑块号:文件系统将文件内的字节偏移量转换为逻辑块号。逻辑块是文件系统管理的基本单位,通常为4KB。计算方法是:
逻辑块号 = 文件偏移量 / 块大小。例如,偏移量3000字节在4KB块中,属于第0个逻辑块。 - 查询映射表:文件系统通过文件的inode(索引节点)数据结构,查找到该逻辑块号对应的物理块号。inode中保存了文件数据在磁盘上的实际位置索引。
设备驱动程序:从物理块号到硬件地址文件系统将包含目标物理块号的I/O请求传递给设备驱动程序后,驱动程序开始执行它的核心任务:
- 地址转换:驱动程序将操作系统抽象的物理块号转换为磁盘硬件能够识别的三维地址,即柱面号、磁头号、扇区号。这个过程依赖于驱动程序对特定磁盘几何结构的了解。
- 构造指令:驱动程序根据转换后的硬件地址,构造出具体的、符合该设备控制寄存器规范的命令(如寻道、读扇区),并将这些命令发送给磁盘控制器。
简单来说,文件系统告诉驱动程序“读哪个块”,而驱动程序则解决“这个块在硬件的哪个具体位置”以及“如何命令硬件去读它”的问题。
4.中断处理程序
- 计算逻辑块号:文件系统将文件内的字节偏移量转换为逻辑块号。逻辑块是文件系统管理的基本单位,通常为4KB。计算方法是:
当I/O任务完成时,I/O控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。
中断处理程序的处理流程如下:

中断处理层的任务:
- 进行进程上下文的切换,
- 对处理中断信号源进行测试,
- 读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,因此应放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。

5.硬件
其实就是计组里面的IO接口,执行IO操作,机械部件、电子部件组成
总结
说明用户对设备的一次命令过程如下所示:
- ①当用户要读取某设备的内容时,通过操作系统提供的read命令接口,这就经过了用户层。
- ②操作系统提供给用户使用的接口,一般是统一的通用接口,也就是几乎每个设备都可以响应的统一命令,如read命令,用户发出的read命令,首先经过设备独立层进行解析,然后交往下层。
- ③接下来,不同类型的设备对read命令的行为会有所不同,如磁盘接收read命令后的行为与打印机接收read命令后的行为是不同的。因此,需要针对不同的设备,把read命令解析成不同的指令,这就经过了设备驱动层。
- ④命令解析完毕后,需要中断正在运行的进程,转而执行read命令,这就需要中断处理程序。
- ⑤最后,命令真正抵达硬件设备,硬件设备的控制器按照上层传达的命令操控硬件设备,完成相应的功能。
理解:
直接涉及到硬件其体细节、且与中断无关的操作肯定是在设备驱动程序层完成的;
没有涉及硬件的、对各种设备都需要进行的管理工作都是在设备独立性软件层完成的。
5.1.4 输入输出应用程序接口和驱动程序接口
1.输入输出应用程序接口
在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(进程调用write,就把write写到进程的内核区去了,等磁盘不忙的时候在写回去)

2.驱动程序接口
要求每个设备驱动程序与操作系统之间都有着相同或相近的接口。这样会使得添加一个新设备驱动程序变得很容易,同时也便于开发人员编制设备驱动程序。
对于每种设备类型,例如磁盘,操作系统都要定义一组驱动程序必须支持的函数。
与设备无关的软件还要负责将符号化的设备名映射到适当的驱动程序上。
在UNIX和Windows中,设备是作为命名对象出现在文件系统中的,因此针对文件的常规保护规则也适用于I/O设备。系统管理员可以为每个设备设置适当的访问权限。



5.1.5 本节小结
I/O管理要完成哪些功能?
I/O管理需要完成以下4部分内容:
- 状态跟踪。要能实时掌握外部设备的状态。
- 设备存取。要实现对设备的存取操作。
- 设备分配。在多用户环境下,负责设备的分配与回收。
- 设备控制。包括设备的驱动、完成和故障的中断处理。
错题总结或者需要注意的点
1.共享设备必须是可寻址和可随机访问的设备
2.共享设备是指在一段时间内允许多个进程同时访问的设备,而不是同一时刻
3.虚拟设备是指,把一个物理设备变换成多个对应的逻辑设备
4.设备控制器通常需要提供:控制寄存器,状态寄存器和控制命令
5.在OS中,通道技术是一种硬件机制
6.通道控制设备控制器,设备控制器控制设备工作
7.向设备寄存器的写命令是在I/O软件中的设备驱动程序完成的
8.中断驱动方式:
处理中断请求:一旦确定了中断源,中断处理程序就会执行与该中断源相关联的特定代码。这可能包括读取设备的状态寄存器、从设备读取数据或向设备写入数据、更新系统的状态或执行其他必要的操作。












