输入/输出管理 I(概述)


一、I/O 设备

1. I/O 设备的基本概念和分类

【总结】:

1)I/O 设备的基本概念

“I/O” 就是 “输入/输出”(Input/Output)。I/O 设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。

UNIX 系统将外部设备抽象为一种特殊的文件,用户可以使用与文件操作相同的方式对外部设备进行操作。

2)I/O 设备的分类

(a)按使用特性分类

(b)按传输速率分类

(c)按信息交换的单位分类

  • 块设备。信息交换以数据块为单位。它属于有结构设备,如磁盘等。磁盘设备的基本特征是传输速率较高、可寻址,即对它可随机地读/写任意一块。

  • 字符设备。信息交换以字符为单位。它属于无结构类型,如交互式终端机、打印机等。它们的基本特征是传输速率低、不可寻址,并且时常采用中断 I/O 方式。

(d)按设备的共享属性分类

  • 独占设备。同一时刻只能由一个进程占用的设备。一旦将这类设备分配给某进程,便由该进程独占,直至用完释放。低速设备一般是独占设备,如打印机。

  • 共享设备。同一时间段内允许多个进程同时访问的设备。对于共享设备,可同时分配给多个程,通过分时的方式共享使用。典型的共享设备是磁盘。

  • 虚拟设备。通过 SPOOLing 技术将独占设备改造为共享设备,将一个物理设备变为多个逻辑设备,从而可将设备同时分配给多个进程。

2. I/O 控制器

I/O 设备由机械部件和电子部件组成。

  • I/O 设备的机械部件主要用来执行具体 I/O 操作。
    如我们看得见摸得着的鼠标 / 键盘的按钮;显示器的 LED 屏;移动硬盘的磁臂、磁盘盘面。

  • I/O 设备的电子部件(I/O 控制器)通常是一块插入主板扩充槽的印刷电路板。

CPU 无法直接控制 I/O 设备的机械部件,因此 I/O 设备还要有一个电子部件作为 CPU 和 I/O 设备机械部件之间的 “中介” ,用于实现 CPU 对设备的控制。这个电子部件就是 I/O 控制器,又称设备控制器、I/O 接口。CPU 可控制 I/O 控制器,又由 I/O 控制器来控制设备的机械部件。

1)I/O 控制器的功能

2)I/O 控制器的组成

I/O 控制器位于 CPU 与设备之间,它既要与 CPU 通信,又要与设备通信,还要具有按 CPU 发来的命令去控制设备工作的功能,主要由三部分组成,如下图所示。

  • I/O 控制器与 CPU 的接口。该接口有三类信号线:数据线、地址线和控制线。数据线通常与两类寄存器相连:数据寄存器(存放从设备送来的输入数据或从 CPU 送来的输出数据)和控制/状态寄存器(存放从 CPU 送来的控制信息或设备的状态信息)。

  • I/O 控制器与设备的接口。一个设备控制器可以连接一个或多个设备,因此控制器中有一个或多个设备接口。每个接口中都存在数据、控制和状态三种类型的信号。

  • I/O 逻辑。用于实现对设备的控制。它通过一组控制线与 CPU 交互,对从 CPU 收到的 I/O 命令进行译码。CPU 启动设备时,将启动命令发送给控制器,同时通过地址线把地址发送给控制器,由控制器的 I/O 逻辑对地址进行译码,并相应地对所选设备进行控制。

值得注意的小细节:

① 一个 I/O 控制器可能会对应多个设备;

② 数据寄存器、控制寄存器、状态寄存器可能有多个(如:每个控制/状态寄存器对应一个具体的设备),且这些寄存器都要有相应的地址,才能方便 CPU 操作。有的计算机会让这些寄存器占用内存地址的一部分,称为内存映像 I/O ;另一些计算机则采用 I/O 专用地址,即寄存器独立编址。

3. I/O 端口

I/O 端口是指设备控制器中可被 CPU 直接访问的寄存器,主要有以下三类寄存器:

  • 数据寄存器:实现 CPU 和外设之间的数据缓冲。
  • 状态寄存器:获取执行结果和设备的状态信息,以让 CPU 知道是否准备好。
  • 控制寄存器:由 CPU 写入,以便启动命令或更改设备模式。

为了实现 CPU 与 I/O 端口进行通信,有两种方法,如下图所示。

1)独立编址

为每个端口分配一个 I/O 端口号,所有 I/O 端口形成 I/O 端口空间,普通用户程序不能对其进行访问,只有操作系统使用特殊的 I/O 指令才能访问端口。

优点:I/O 端口数比主存单元少得多,只需少量地址线,使得 I/O 端口译码简单,寻址速度更快。使用专用 I/O 指令,可使程序更加清晰,便于理解和检查。

缺点:I/O 指令少,只提供简单的传输操作,所以程序设计的灵活性较差。此外,CPU 需要提供两组独立的存储器和设备的读 / 写控制信号,增加了控制的复杂性。

2)统一编址

又称内存映射 I/O ,每个端口被分配唯一的内存地址,且不会有内存被分配这一地址,通常分配给端口的地址靠近地址空间的顶端。

优点:不需要专门的 I/O 指令,使得 CPU 访问 I/O 的操作更加灵活和方便,还使得端口有较大的编址空间。I/O 访问的保护机制可由虚拟存储管理系统来实现,无须专门设置。

缺点:端口地址占用了部分主存地址空间,使主存的可用容量变小。此外,由于在识别 I/O 端口时全部地址线都需参加译码,使得译码电路更复杂,降低了寻址速度。

二、I/O 控制方式

设备管理的主要任务之一是控制设备和内存或 CPU 之间的数据传送。外围设备和内存之间的输入/输出控制方式有 4 种,下面分别加以介绍。

1. 程序直接控制方式

计算机从外部设备读取的每个字, CPU 需要对外设状态进行循环检查,直到确定该字已经在 I/O 控制器的数据寄存器中。在程序直接控制方式中,由于 CPU 的高速性和 I/O 设备的低速性,致使 CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,造成了 CPU 资源的极大浪费。在该方式中,CPU 之所以要不断地测试 I/O 设备的状态,就是因为在 CPU 中未采用中断机构,使 I/O 设备无法向 CPU 报告它已完成了一个字符的输入操作。

下图是程序直接控制方式的工作过程:

2. 中断驱动方式

引入中断机制。由于 I/O 设备速度很慢,因此在 CPU 发出读 / 写命令后,可将等待 I/O 的进程阻塞,先切换到别的进程执行。当 I/O 完成后,控制器会向 CPU 发出一个中断信号,CPU 检测到中断信号后,会保存当前进程的运行环境信息,转去执行中断处理程序处理该中断。处理中断的过程中,CPU 从 I/O 控制器读一个字的数据传送到 CPU 寄存器,再写入主存。接着,CPU 恢复等待 I/O 的进程(或其他进程)的运行环境,然后继续执行。

下图是中断驱动方式的工作过程:

从 I/O 控制器的角度来看,I/O 控制器从 CPU 接收一个读命令,然后从外部设备读数据。一旦数据读入 I/O 控制器的数据寄存器,便通过控制线给 CPU 发出中断信号,表示数据已准备好,然后等待 CPU 请求该数据。I/O 控制器收到 CPU 发出的取数据请求后,将数据放到数据总线上,传到 CPU 的寄存器中。至此,本次 I/O 操作完成,I/O 控制器又可开始下一次 I/O 操作。

从 CPU 的角度来看,CPU 发出读命令,然后保存当前运行程序的上下文(包括程序计数器及处理机寄存器),转去执行其他程序。在每个指令周期的末尾,CPU 检查中断。当有来自 I/O 控制器的中断时,CPU 保存当前正在运行程序的上下文,转去执行中断处理程序以处理该中断。这时, CPU 从 I/O 控制器读一个字的数据传送到寄存器,并存入主存。接着,CPU 恢复发出 I/O 命令的程序(或其他程序)的上下文,然后继续运行。

注意:

① CPU会在每个指令周期的末尾检查中断;

② 中断处理过程中需要保存、恢复进程的运行环境,这个过程是需要一定时间开销的。可见,如果中断发生的频率太高,也会降低系统性能。

3. DMA 方式

中断驱动方式比程序直接控制方式有效,但由于数据中的每个字在存储器与 I/O 控制器之间的传输都必须经过 CPU ,这就导致了中断驱动方式仍然会消耗较多的 CPU 时间。而 DMA(直接存储器存取)方式的基本思想是在 I/O 设备和内存之间开辟直接的数据交换通路,彻底 “解放” CPU 。

下图是 DMA 控制器的组成:

与 “中断驱动方式” 相比,DMA 方式(Direct Memory Access,直接存储器存取,主要用于块设备的 I/O 控制)有这样几个改进:

① 数据的传送单位是 “块” ,不再是一个字、一个字的传送;

② 数据的流向是从设备直接放入内存,或者从内存直接到设备。

③ 仅在传送一个或多个数据块的开始和结束时,才需要 CPU 干预,整块数据的传送是在 DMA 控制器的控制下完成的。

下图是 DMA 方式的工作过程:

DMA 方式的工作过程是:CPU 接收到 I/O 设备的 DMA 请求时,它给 DMA 控制器发出一条命令,同时设置 MAR 和 DC 初值,启动 DMA 控制器,然后继续其他工作。之后 CPU 就把控制操作委托给 DMA 控制器,由该控制器负责处理。DMA 控制器直接与存储器交互,传送整个数据块,每次传送一个字,这个过程不需要 CPU 参与。传送完成后, DMA 控制器发送一个中断信号给处理器。因此只有在传送开始和结束时才需要 CPU 的参与。

DMA 方式与中断方式的主要区别是:中断方式在每个数据需要传输时中断 CPU ,而 DMA 方式则是在所要求传送的一批数据全部传送结束时才中断 CPU ;此外,中断方式的数据传送是在中断处理时由 CPU 控制完成的,而 DMA 方式则是在 DMA 控制器的控制下完成的。

4. 通道控制方式

I/O 通道是指专门负责输入/输出的处理机。I/O 通道方式是 DMA 方式的发展,它可以进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,减少为对一组数据块的读(或写)及有关控制和管理为单位的干预。同时,又可以实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。

通道 = 弱鸡版 CPU 通道程序 = 任务清单

当 CPU 要完成一组相关的读(或写)操作及有关控制时,只需向 I/O 通道发送一条 I/O 指令,以给出其所要执行的通道程序的首地址和要访问的 I/O 设备,通道接到该指令后,执行通道程序便可完成 CPU 指定的 I/O 任务,数据传送结束时向 CPU 发中断请求。

下图是通道控制方式的工作过程:

  • I/O 通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与 CPU 共享内存。

  • I/O 通道与 DMA 方式的区别是: DMA 方式需要 CPU 来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个 DMA 控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。

5. 总结

完成一次读/写的过程CPU干预频率每次I/O的数据传输单位数据流向
程序直接控制方式CPU发出I/O命令后需要不断轮询极高设备→CPU→内存;内存→CPU→设备
中断驱动方式CPU发出I/O命令后可以做其他事,本次I/O完成后设备控制器发出中断信号设备→CPU→内存;内存→CPU→设备
DMA方式CPU发出I/O命令后可以做其他事,本次I/O完成后DMA控制器发出中断信号设备→内存;内存→设备
通道控制方式CPU发出I/O命令后可以做其他事。通道会执行通道程序以完成I/O,完成后通道向CPU发出中断信号一组块设备→内存;内存→设备

优缺点:每一个阶段的优点都是解决了上一阶段的最大缺点。总体来说,整个发展过程就是要尽量减少 CPU 对 I/O 过程的干预,把 CPU 从繁杂的 I/O 控制事务中解脱出来,以便更多地去完成数据处理任务。

三、I/O 软件层次结构

I/O 软件涉及的面很宽,往下与硬件有着密切关系,往上又与虚拟存储器系统、文件系统和用户直接交互,它们都需要 I/O 软件来实现 I/O 操作。

为使复杂的 I/O 软件能具有清晰的结构、良好的可移植性和易适应性,目前已普遍采用层次式结构的 I/O 软件。将系统中的设备管理模块分为若干个层次,每层都是利用其下层提供的服务,完成输入/输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。在层次式结构的 I/O 软件中,只要层次间的接口不变,对某一层次中的软件的修改都不会引起其下层或高层代码的变更,仅最低层才涉及硬件的具体特性。

一个比较合理的层次划分如下图所示。整个 I/O 软件可以视为具有 4 个层次的系统结构,各层次及其功能如下:

1. 用户层 I/O 软件

实现与用户交互的接口,用户可直接调用在用户层提供的、与 I/O 操作有关的库函数,对设备进行操作。一般而言,大部分的 I/O 软件都在操作系统内部,但仍有一小部分在用户层,包括与用户程序链接在一起的库函数。用户层软件必须通过一组系统调用来获取操作系统服务。

2. 设备独立性软件

与设备的硬件特性无关的功能几乎都在这一层实现。

用于实现用户程序与设备驱动器的统一接口、设备命令、设备的保护及设备的分配与释放等,同时为设备管理和数据传送提供必要的存储空间。

设备独立性也称设备无关性,使得应用程序独立于具体使用的物理设备。为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名使用。

使用逻辑设备名的好处是:

  • 增加设备分配的灵活性。

  • 易于实现 I/O 重定向,所谓 I/O 重定向,是指用于 I/O 操作的设备可以更换(即重定向),而不必改变应用程序。

为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。总体而言,设备独立性软件的主要功能可分为以下两个方面:

  • 执行所有设备的公有操作,包括:
    ① 对设备的分配与回收;
    ② 建立逻辑设备名到物理设备名的映射关系,根据设备类型选择调用相应的驱动程序;
    ③ 对设备进行保护,禁止用户直接访问设备;
    (原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样)
    ④ 缓冲管理;
    (可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异)
    ⑤ 差错控制;
    (设备独立性软件需要对一些设备的错误进行处理)
    ⑥ 提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的差异。

  • 向用户层(或文件层)提供统一接口。无论何种设备,它们向用户所提供的接口应是相同的。例如,对各种设备的读/写操作,在应用程序中都统一使用 read/write 命令等。

3. 设备驱动程序

与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动 I/O 设备工作的驱动程序。通常,每类设备配置一个设备驱动程序,它是 I/O 进程与设备控制器之间的通信程序,通常以进程的形式存在。设备驱动程序向上层用户程序提供一组标准接口,设备具体的差别被设备驱动程序所封装,用于接收上层软件发来的抽象 I/O 要求,如 read 和 write 命令,转换为具体要求后,发送给设备控制器,控制 I/O 设备工作:它也将由设备控制器发来的信号传送给上层软件,从而为 I/O 内核子系统隐藏设备控制器之间的差异。

4. 中断处理程序

用于保存被中断进程的 CPU 环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的现场后,返回到被中断进程。

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

5. 总结

→ 用户通过调用用户层软件提供的库函数发出的 I/O 请求:
→ 用户层软件通过 “系统调用” 请求设备独立性软件层的服务
→ 设备独立性软件层根据 LUT 调用设备对应的驱动程序
→ 驱动程序向 I/O 控制器发出具体命令
→ 等待 I/O 完成的进程应该被阻塞,因此需要进程切换,而进程切换必然需要中断处理

举个例子:

  • 当用户要读取某设备的内容时,通过操作系统提供的 read 命令接口,这就经过了用户层。

  • 操作系统提供给用户使用的接口,一般是统一的通用接口,也就是几乎每个设备都可以响应的统一命令,如 read 命令,用户发出的 read 命令,首先经过设备独立层进行解析,然后交往下层。

  • 接下来,不同类型的设备对 read 命令的行为会有所不同,如磁盘接收 read 命令后的行为与打印机接收 read 命令后的行为是不同的。因此,需要针对不同的设备,把 read 命令解析成不同的指令,这就经过了设备驱动层。

  • 命令解析完毕后,需要中断正在运行的进程,转而执行 read 命令,这就需要中断处理程序。

  • 最后,命令真正抵达硬件设备,硬件设备的控制器按照上层传达的命令操控硬件设备,完成相应的功能。

四、应用程序 I/O 接口

1. I/O 接口的分类

在 I/O 系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干接口。

1)字符设备接口

字符设备是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。基本特征是传输速率较低、不可寻址,并且在输入/输出时通常采用中断驱动方式。

get 和 put 操作。由于字符设备不可寻址,只能采取顺序存取方式,通常为字符设备建立一个字符缓冲区,用户程序通过 get 操作从缓冲区获取字符,通过 put 操作将字符输出到缓冲区。

in-control 指令。字符设备类型繁多,差异甚大,因此在接口中提供一种通用的 in-control 指令来处理它们(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。

字符设备都属于独占设备,为此接口中还需要提供打开和关闭操作,以实现互斥共享。

2)块设备接口

块设备是指数据的存取和传输是以数据块为单位的设备,典型的块设备是磁盘。基本特征是传输速率较高、可寻址。磁盘设备的 I/O 常采用 DMA 方式。

隐藏了磁盘的二维结构。在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示。块设备接口将磁盘的所有扇区从 0 到 n-1 依次编号,这样,就将二维结构变为一种线性序列。

将抽象命令映射为低层操作。块设备接口支持上层发来的对文件或设备的打开、读、写和关闭等抽象命令,该接口将上述命令映射为设备能识别的较低层的具体操作。

内存映射接口通过内存的字节数组来访问磁盘,而不提供读/写磁盘操作。映射文件到内存的系统调用返回包含文件副本的一个虚拟内存地址。只在需要访问内存映像时,才由虚拟存储器实际调页。内存映射文件的访问如同内存读写一样简单,极大地方便了程序员。

3)网络设备接口

现代操作系统都提供面向网络的功能,因此还需要提供相应的网络软件和网络通信接口,使计算机能够通过网络与网络上的其他计算机进行通信或上网浏览。

许多操作系统提供的网络 I/O 接口为网络套接字接口,套接字接口的系统调用使应用程序创建的本地套接字连接到远程应用程序创建的套接字,通过此连接发送和接收数据。

2. 阻塞 I/O 和非阻塞 I/O

操作系统的 I/O 接口还涉及两种模式:阻塞和非阻塞。

1)阻塞 I/O

阻塞 I/O 是指当用户进程调用 I/O 操作时,进程就被阻塞,并移到阻塞队列,I/O 操作完成后,进程才被唤醒,移到就绪队列。当进程恢复执行时,它收到系统调用的返回值,并继续处理数据。大多数操作系统提供的 I/O 接口都是采用阻塞 I/O 。

eg. 字符设备接口——从键盘读一个字符 get 。

优点:操作简单,实现难度低,适合并发量小的应用开发。

缺点:I/O 执行阶段进程会一直阻塞下去。

2)非阻塞 I/O

非阻塞 I/O 是指当用户进程调用 I/O 操作时,不阻塞该进程,但进程需要不断询问 I/O 操作是否完成,在 I/O 执行阶段,进程还可以做其他事情。当问到 I/O 操作完成后,系统将数据从内核复制到用户空间,进程继续处理数据。大多数操作系统提供的 I/O 接口都是采用阻塞 I/O 。

eg. 块设备接口——往磁盘写数据 write 。

优点:进程在等待 I/O 期间不会阻塞,可以做其他事情,适合并发量大的应用开发。

缺点:轮询方式询问 I/O 结果,会占用 CPU 的时间。

五、小结

1、I/O 管理要完成哪些功能?

I/O 管理需要完成以下 4 部分内容:

  • 状态跟踪。要能实时掌握外部设备的状态。
  • 设备存取。要实现对设备的存取操作。
  • 设备分配。在多用户环境下,负责设备的分配与回收。
  • 设备控制。包括设备的驱动、完成和故障的中断处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kusunoki_D

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值