一. I/O 设备
I/O 设备:“输入/输出”(Input/Output)设备,即将数据输入到计算机,或可以接收计算机输出数据的外部设备,属于计算机硬件部分。
- 典型的输入设备:键盘,鼠标。
- 输出设备:显示器。
- 既可以输入又可以作为输出的设备:移动硬盘。
设备的分类
- 按信息交换单位分类
- 块设备(信息交换以数据块为单位)
- 磁盘,磁带等。
- 传输速率较高,可寻址(即对它进行随机读/写任一块)
- 字符设备(信息交换以字符为单位)
- 交互式终端机,打印机
- 传输速率低,不可寻址,时常采用 I/O 中断方式。
- 按设备的传输速率分类
- 低速设备。传输速率仅为每秒几字节到数百字节
- 如键盘、鼠标等。
- 中速设备。传输速率为每秒数千字节至数万字节
- 如激光打印机等。
- 高速设备。传输速率在数百千字节至千兆字节
- 如磁盘机、光盘机等。
- 按设备的使用特性分类
- 存储设备。用于存储信息的外部设备
- 如磁盘、磁带、光盘等。
- 输入/输出设备。又可分为输入设备、输出设备和交互式设备。
- 输入设备用于向计算机输 入外部信息,如键盘、鼠标、扫描仪等;
- 输出设备用于计算机向外输出数据信息,如打 印机等;
- 交互式设备则集成了上述两类设备的功能,如触控显示器等。
- 按设备的共享属性分类
- 独占设备。同一时刻只能由一个进程占用的设备。一旦将这类设备分配给某进程,便由 该进程独占,直至用完释放。
- 低速设备一般是独占设备,如打印机。
- 共享设备。同一时间段内允许多个进程同时访问的设备。对于共享设备,可同时分配给 多个进程,通过分时的方式共享使用。
- 典型的共享设备是磁盘。
- 虚拟设备。通过SPOOLing技术将独占设备改造为共享设备,将一个物理设备变为多个 逻辑设备,从而可将设备同时分配给多个进程。
I/O 接口
I/O接口(又称设备控制器)是CPU与设备之间的接口,以实现设备和计算机之间的数据交换。它接收发自CPU的命令,控制设备工作,使CPU能从繁杂的设备控制事务中解脱出来。设 备控制器主要由三部分组成,如图5.1所示。
- 设备控制器与CPU的接口。用于实现CPU与设备控制器之间的通信。该接口有三类信号线:数据线、地址线和控制线。数据线传送的是读/写数据、控制信息和状态信息;地址线传送的是要访问I/O接口中的寄存器编号;控制线传送的是读/写等控制信号。
- 设备控制器与设备的接口。一个设备控制器可以连接一个或多个设备,因此控制器中有一个或多个设备接口。每个接口都可传输数据、控制和状态三种类型的信号。
- I/O逻辑。用于实现对设备的控制。它通过一组控制线与CPU交互,对从CPU收到的1/O命令进行译码。CPU 启动设备时,将启动命令发送给控制器,同时通过地址线将地址发送给控制器,由控制器的I/O逻辑对地址进行译码,并对所选设备进行控制。
设备控制器的主要功能有
①接收和识别命令,如磁盘控制器能接收CPU 发来的读、写、查找等命令;
②数据交换,包括CPU和控制器之间的数据传输,以及控制器和设备之间的数据传输;
③标识和报告设备的状态,以供CPU处理;
④地址识别
⑤数据缓冲;
⑥差错控制。
I/O 接口类型
从不同的角度看,I/O 接口可以分为不同的类型。
- 按数据传送方式(外设和接口一侧),可分为
- 并行接口(一个字节或者一个字的所有位同时传送)
- 串行接口(一位一位地有序传送),接口要完成数据格式的转换。
- 按主机访问 I/O设备的控制方式,可分为
- 程序查询接口
- 中断接口
- DMA接口等。
- 按功能选择的灵活性,可分为
- 可编程接口(通过编程改变接口功能)
- 不可编程接口。
I/O 端口
I/O端口是指设备控制器中可被CPU直接访问的寄存器,主要有以下三类寄存器。
- 数据寄存器:用于缓存从设备送来的输入数据,或从CPU送来的输出数据。
- 状态寄存器:保存设备的执行结果或状态信息,以供CPU读取。
- 控制寄存器:由CPU写入,以便启动命令或更改设备模式。
I/O 端口要想能够被CPU访问,就要对各个端口进行编址,每个端口对应一个端口地址。而对 I/O端口的编址方式有与存储器独立编址和统一编址两种,如图5.2所示。
- (1)独立编址
独立编址是指为每个端口分配一个I/O端口号。I/O端口的地址空间与主存地址空间是两个 独立的地址空间,它们的范围可以重叠,相同地址可能属于不同的地址空间。普通用户程序不能 对端口进行访问,只有操作系统使用特殊的I/O指令才能访问端口。
- 优点:I/O端口数比主存单元少得多,只需少量地址线,使得I/O端口译码简单,寻址速度更 快。使用专用I/O指令,可使程序更加清晰,便于理解和检查。
- 缺点:I/O指令少,只提供简单的传输操作,所以程序设计的灵活性较差。此外,CPU需要 提供两组独立的存储器和设备的读/写控制信号,增加了控制的复杂性。
- (2)统一编址
统一编址又称内存映射I/O,是指将主存地址空间分出一部分给I/O端口进行编址,I/O端口 和主存单元在同一地址空间的不同分段中,根据地址范围就能区分访问的是I/O端口还是主存单 元,因此无须设置专门的I/O指令,用统一的访存指令就可访问I/O端口。
- 优点:不需要专门的I/O指令,使得CPU访问I/O的操作更加灵活和方便,还使得端口有较 大的编址空间。I/O访问的保护机制可由虚拟存储管理系统来实现,无须专门设置。
- 缺点:端口地址占用了部分主存地址空间,使主存的可用容量变小。此外,由于在识别I/O 端口时全部地址线都需参加译码,使得译码电路更复杂,降低了寻址速度。
二. I/O 控制方式
I/O控制是指控制设备和主机之间的数据传送。I/O控制方式共有4种,下面分别加以介绍。
程序直接控制方式
CPU对I/O设备的控制采取轮询的I/O方式,又称程序轮询方式。如图(a)所示,CPU向 设备控制器发出一条I/O指令,启动从I/O设备读取一个字(节),然后不断地循环测试设备状态 (称为轮询),直到确定该字(节)已在设备控制器的数据寄存器中。于是CPU将数据寄存器中的 数据取出,送入内存的指定单元,这样便完成了一个字(节)的I/O操作。
这种方式简单且易于实现,但缺点也很明显。CPU的绝大部分时间都处于等待I/O设备状态 的循环测试中,CPU和I/O设备只能串行工作,由于CPU和I/O设备的速度差异很大,导致CPU 的利用率相当低。而CPU之所以要不断地测试I/O设备的状态,就是因为在CPU中未采用中断机构,使I/O设备无法向CPU报告它已完成了一个字(节)的输入操作。
中断驱动方式
中断驱动方式的思想是:允许I/O设备主动打断CPU的运行并请求服务,从而“解放”CPU, 使得CPU向设备控制器发出一条I/O指令后可以继续做其他有用的工作。如图(b)所示,我们 从设备控制器和CPU两个角度分别来看中断驱动方式的工作过程。
从设备控制器的角度来看:设备控制器从CPU接收一个读命令,然后从设备读数据。一旦 数据读入设备控制器的数据寄存器,便通过控制线给CPU发出中断信号,表示数据已准备好,然 后等待CPU请求该数据。设备控制器收到CPU发出的取数据请求后,将数据放到数据总线上, 传到CPU的寄存器中。至此,本次I/O操作完成,设备控制器又可开始下一次I/O操作。
DMA 方式
DMA(直接存储器存取)方式的基本思想是,在I/O设备和内存之间开辟直接的数据交换通路,彻底“解放”CPU。DMA方式的特点如下:
1)基本传送单位是数据块,而不再是字(节)。
2)所传送的数据,是从设备直接送入内存的,或者相反,而不再经过CPU。
3)仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。
下图列出了DMA控制器的组成。
为了实现主机和控制器之间直接交换成块的数据,须在DMA控制器中设置如下4类寄存器:
- 命令/状态寄存器(CR)。接收从CPU发来的I/O命令、有关控制信息,或设备的状态。
- 内存地址寄存器(MAR)。在输入时,它存放将数据从设备传送到内存的起始目标地址; 在输出时,它存放由内存到设备的内存源地址。
- 数据寄存器(DR)。暂存从设备到内存或从内存到设备的数据。
- 数据计数器(DC)。存放本次要传送的字(节)数。
DMA 方式工作流程
如图©所示,DMA方式的工作过程是:CPU接收到设备的DMA请求时,它向DMA控 制器发出一条命令,同时设置MAR和DC初值,启动DMA控制器,然后继续其他工作。之后 CPU就将I/O控制权交给DMA控制器,由DMA控制器负责数据传送。DMA控制器直接与内存 交互,每次传送一个字,这个过程不需要CPU参与。整个数据传送结束后,DMA控制器向CPU 发送一个中断信号。因此只有在传送开始和结束时才需要CPU的参与。
DMA方式的优点:数据传输以“块”为单位,CPU介入的频率进一步降低;数据传送不再 经过CPU的寄存器,CPU和设备的并行操作程度得到了进一步提升。
*通道控制方式
I/O通道是一种特殊的处理机,它可执行一系列通道指令。设置通道后,CPU只需问通道发 送一条I/O指令,指明通道程序在内存中的位置和要访问的I/O设备,通道收到该指令后,执行 通道程序,完成规定的I/O任务后,向CPU发出中断请求。通道方式可以实现CPU、通道和I/O 设备三者的并行工作,从而更有效地提高整个系统的资源利用率。
通道与一般处理机的区别是:通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存。
通道与DMA方式的区别是:DMA方式需要CPU来控制传输的数据块大小、传输的内存位 置,而通道方式中这些信息是由通道控制的。另外,每个DMA控制器对应一台设备与内存传递 数据,而一个通道可以控制多台设备与内存的数据交换。
三. I/O 软件层次结构
为使复杂的I/O软件能具有清晰的结构、良好的可移植性和易适应性,目前普遍采用层次式 结构的I/O软件。将系统中的设备管理模块分为若干层次,每层都是利用其下层提供的服务,完成输入/输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。在层次式结构的I/O软件中,只要层次间的接口不变,对某一层次中的软件的修改都不会引起其下层或高层代码的变更,仅最低层才涉及硬件的具体特性。一个比较合理的层次划分如图5.5所示。整个I/O 软件可以视为具有4个层次的系统结构,各层次及其功能如下:
用户层软件
实现与用户交互的接口,用户可直接调用在用户层提供的、与I/O操作有关的库函数,对设备进行操作。通常大部分的I/O软件都在操作系统内核,但仍有一小部分在用户层,包括与用户 程序链接在一起的库函数。用户层I/O软件必须通过一组系统调用来获取操作系统服务。
设备独立性软件
用于实现用户程序与设备驱动器的统一接口、设备命名、设备保护以及设备的分配与释放等, 同时为设备管理和数据传送提供必要的存储空间。
设备独立性也称设备无关性,其含义是指应用程序所用的设备不局限于某个具体的物理设备。为实现设备独立性而引入了逻辑设备和物理设备这两个概念。在应用程序中,使用逻辑设备 名来请求使用某类设备;而在系统实际执行时,必须将逻辑设备名映射成物理设备名。
使用逻辑设备名的好处是
- ①增加设备分配的灵活性
- ②易于实现I/O重定向,所谓I/O重定向,是指用于I/O操作的设备可以更换(重定向),而不必改变应用程序。
为了实现设备独立性,必须再在驱动程序之上设置一层设备独立性软件。
总体而言,设备独 立性软件的主要功能可分为以下两个方面。
- ①执行所有设备的公有操作,包括
- 对设备的分配与 回收
- 将逻辑设备名映射为物理设备名
- 对设备进行保护,禁止用户直接访问设备
- 缓冲管理
- 差错控制
- 提供独立于设备的大小统一的逻辑块,屏蔽设备之间信息交换单位大小和传输速率的 差异。
- ②向用户层(或文件层)提供统一接口。无论何种设备,它们向用户所提供的接口应是相 同的。
- 例如,对各种设备的读/写操作,在应用程序中都统一使用read/write命令等。
设备驱动程序
与硬件直接相关,负责具体实现系统对设备发出的操作指令,驱动I/O设备工作的驱动程序。
通常,每类设备配置一个设备驱动程序,它是I/O进程与设备控制器之间的通信程序,通常以进 程的形式存在。设备驱动程序向上层用户程序提供一组标准接口,设备具体的差别被设备驱动程 序所封装,用于接收上层软件发来的抽象I/O要求,如read和write命令,转换为具体要求后, 发送给设备控制器,控制I/O设备工作;它也将由设备控制器发来的信号传送给上层软件,从而 为I/O内核子系统隐藏设备控制器之间的差异。
中断处理程序
用于保存被中断进程的CPU环境,转入相应的中断处理程序进行处理,处理完毕再恢复被中断进程的现场后,返回到被中断进程。
中断处理层的主要任务有
- 进行进程上下文的切换
- 对处理中断信号源进行测试
- 读取设备状态和修改进程状态等。
由于中断处理与硬件紧密相关,对用户而言,应尽量加以屏蔽,因此应 放在操作系统的底层,系统的其余部分尽可能少地与之发生联系。
四. 应用程序 I/O 接口
I/O接口的分类
在I/O系统与高层之间的接口中,根据设备类型的不同,又进一步分为若干类。
(1)字符设备接口
字符设备是指数据的存取和传输是以字符为单位的设备,如键盘、打印机等。基本特征是传 输速率较低、不可寻址,并且在输入/输出时通常采用中断驱动方式。 get和put操作。由于字符设备不可寻址,只能采取顺序存取方式,通常为字符设备建立一个 字符缓冲区,用户程序通过get操作从缓冲区获取字符,通过put操作将字符输出到缓冲区。 in-control指令。字符设备类型繁多,差异甚大,因此在接口中提供一种通用的in-control指 令来处理它们(包含了许多参数,每个参数表示一个与具体设备相关的特定功能)。 字符设备都属于独占设备,为此接口中还需要提供打开和关闭操作,以实现互斥共享。
(2)块设备接口
块设备是指数据的存取和传输是以数据块为单位的设备,典型的块设备是磁盘。基本特征是 传输速率较高、可寻址。磁盘设备的I/O常采用DMA方式。 隐藏了磁盘的二维结构。在二维结构中,每个扇区的地址需要用磁道号和扇区号来表示。块 设备接口将磁盘的所有扇区从0到n-1依次编号,这样,就将二维结构变为一种线性序列。 将抽象命令映射为低层操作。块设备接口支持上层发来的对文件或设备的打开、读、写和关 闭等抽象命令,该接口将上述命令映射为设备能识别的较低层的具体操作。 内存映射接口通过内存的字节数组来访问磁盘,而不提供读/写磁盘操作。映射文件到内存的 系统调用返回包含文件副本的一个虚拟内存地址。只在需要访问内存映像时,才由虚拟存储器实 际调页。内存映射文件的访问如同内存读/写一样简单,极大地方便了程序员。
(3)网络设备接口
现代操作系统都提供面向网络的功能,因此还需要提供相应的网络软件和网络通信接口,使 计算机能够通过网络与网络上的其他计算机进行通信或上网浏览。 许多操作系统提供的网络I/O接口为网络套接字接口,套接字接口的系统调用使应用程序创 建的本地套接字连接到远程应用程序创建的套接字,通过此连接发送和接收数据。
阻塞I/O和非阻塞I/O
操作系统的I/O接口还涉及两种模式:阻塞和非阻塞。
- 阻塞I/O是指当用户进程调用I/O操作时,进程就被阻塞,并移到阻塞队列,I/O操作完成后, 进程才被唤醒,移到就绪队列。当进程恢复执行时,它收到系统调用的返回值,并继续处理数据。 大多数操作系统提供的I/O接口都是采用阻塞I/O。例如,你和女友去奶茶店买奶茶,点完单后, 因为不知道奶茶什么时候做好,所以只能一直等待,其他什么事也不能干。
- 优点:操作简单,实现难度低,适合并发量小的应用开发。
- 缺点:I/O执行阶段进程会一直阻塞下去。
- 非阻塞I/O是指当用户进程调用I/O操作时,不阻塞该进程,但进程需要不断询问I/O操作 是否完成,在I/O执行阶段,进程还可以做其他事情。当问到I/O操作完成后,系统将数据从内 核复制到用户空间,进程继续处理数据。
例如,你和女友去奶茶店买奶茶,汲取了上次的教训, 点完单后顺便逛逛商场,由于担心错过取餐,所以每隔一段时间就过来询问服务员。
- 优点:进程在等待I/O期间不会阻塞,可以做其他事情,适合并发量大的应用开发。
- 缺点:轮询方式询问I/O结果,会占用CPU的时间。