11.1 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设备的分类:
- 按数据组织分:
- 块设备:以数据块为单位存储、传输信息,传输速率较高,可寻址(随机读写);
- 字符设备:以字符为单位存储、传输信息,传输速率低,不可寻址。
- 按功能分类:
- 存储设备(磁盘、磁带);
- 传输设备(网卡、Modem(调制解调器));
- 人机交互设备(显示器、键盘、鼠标)。
- 按资源分配的角度分类:
- 独占设备:在一段时间内只能有一个进程使用的设备,一般为低速I/O设备(打印机、磁带等);
- 共享设备:在一段时间内可有多个进程共同使用的设备,多个进程以交叉的方式来使用设备,其资源利用率高(如硬盘);
- 虚设备:在一类设备上模拟另一类设备,常用共享设备模拟独占设备,用高速设备模拟低速设备,被模拟的设备成为虚设备。虚设备的存在目的是为了将慢速的独占设备改造成多个用户可共享的设备,提高设备的利用率。典型的例子有:SPOOLING技术,利用虚设备技术——用硬盘模拟输入输出设备。
I/O管理的目标和任务:
- 按照用户的请求,控制设备的各种操作,完成I/O设备与内存之间的数据交换,最终完成用户的I/O请求。
- 设备分配与回收:记录设备的状态,根据用户的请求和设备的类型,查看设备的状态,采用一定的分配算法,选择一条数据通路;
- 执行设备驱动程序,实现真正的I/O操作;
- 设备中断处理:处理外部设备的中断;
- 缓冲区管理:管理I/O缓冲区,用以处理传输速度的不匹配。
- 建立方便、统一的独立于设备的接口。由于I/O设备种类繁多,结构各异,为了避免错误,通常采用统一的方式处理所有设备,体现其通用性。
- 方便性:向用户提供使用外部设备的方便接口,使用户编程时不考虑设备的复杂物理特性;
- 统一性:对不同给的设备采取统一的操作方式,即在用户程序中使用的是逻辑设备,然后再由系统转换成对用的物理设备,主要是为了屏蔽硬件细节(设备的物理特性、错误处理、不同I/O过程的差异性)。
- 由于CPU与I/O的速度差别过大,因此需要充分利用各种技术(通道、中断、缓冲、异步I/O等)提高CPU与设备、设备与设备之间的并行工作能力,充分利用资源,提高资源利用率。
- 并行性;
- 均衡性(使设备充分忙碌)。
- 保护,即设备传送或管理的数据应该是安全的、不被破坏的、保密的。
11.2 I/O设备硬件组成
I/O设备一般由机械和电子两部分组成:
- 机械部分是设备本身(物理装置);
- 电子部分又称设备控制器(或适配器)。其主要工作有:
- (端口)地址译码;
- 按照主机与设备之间约定的格式和过程接受计算机发来的数据和控制信号或向主机发送数据和状态信号;
- 将计算机的数字信号转换成机械部分能识别的模拟信号,或反之;
- 实现设备内部硬件缓冲、数据加工等提高性能或增强功能。
设备接口——控制器的作用:
- 操作系统将命令写入控制器的接口寄存器(或接口缓冲区)中,以实现输入/输出,并从接口寄存器读取状态信息或结果信息。
- 当控制器接受一条命令后,可独立于CPU完成指定操作,CPU可以另外执行其他计算;命令完成时,控制器产生一个中断,CPU响应中断,控制转给操作系统;通过读控制器寄存器中的信息,获得操作结果和设备状态。
- 控制器与设备之间的接口常常是一个低级接口;
- 控制器的任务:把串行的位流转换为字节块,并进行必要的错误修正:首先,控制器按位进行组装,然后存入控制器内部的缓冲区形成以字节为单位的块;在对块验证检查和并证明无错误时,再将它复制到内存中。
I/O端口地址:接口电路中每个寄存器具有的、唯一的地址,是个整数。所有I/O端口地址形成I/O端口空间(受保护)。
I/O指令形式与I/O地址是相互关联的,主要有两种形式:
- 内存映像编址 (内存映像I/O模式)
- I/O独立编制(I/O专用指令)
I/O独立编址:即分配给系统中所有端口的地址空间完全独立,与内存地址空间无关。并使用专门的I/O指令对端口进行操作。
- 其优点是:
- 外设不占用内存的地址空间;
- 编程时,易于区分是对内存操作还是对I/O端口操作。
- 其缺点是:I/O端口操作的指令类型少,操作不灵活。
- 例子:8086/8088,分配给I/O端口的地址空间64K,0000H~0FFFFH,只能用in和out指令进行读写操作。
内存映像编址:分配给系统中所有端口的地址空间与内存的地址空间统一编址。即把I/O端口看做一个存储单元,对I/O端口的操作等同于对内存操作。
- 其优点是:
- 凡是可以对内存操作的指令都可对I/O端口操作;
- 不需要专门的I/O指令;
- I/O端口客栈有较大的地址空间。
- 其缺点是:占用一部分内存空间。
内存映射I/O的优点:
- 不需要特殊的保护机制来阻止用户进程执行I/O操作。操作系统必须要做的事情:避免把包含控制寄存器的那部分地址空间放入任何用户的虚拟地址空间之中;
- 可以引用内存的每一条指令亦可以引用控制寄存器。例如:如果指令TEST可以测试一个内存字是否为0,那么它也可以用来测试一个控制寄存器是否为0。
内存映射I/O的缺点:
- 对一个设备控制寄存器不能进行高速缓存;
11.3 I/O控制方式:
I/O控制方式有:
- 可编程I/O(轮询/查询):由CPU代表进程给I/O模块发I/O指令,进程进入忙等待,直到操作完成才继续执行。在整个过程中,设备驱动程序不断询问设备状态,带来很大的开销。
- 中断驱动I/O:为了减少设备驱动程序不断的询问控制器状态寄存器的开销,引入中断驱动I/O。I/O操作结束后,由设备控制器主动通知设备驱动程序;
- DMA:直接的内存存取,是由一个专门的控制器来完成数据从内存到设备或从设备到内存的传输工作。
I/O控制方式的不断进化是为了通过分离I/O与CPU的操作达到提高性能的目的。
11.4 I/O软件的组成
I/O软件的设计实际上是一个分层的设计思想:
- 把I/O软件组织成多个层次;
- 每一层都执行操作系统所需要的功能给的一个相关子集,它依赖于更低一层所执行的更原始的功能,从而可以隐藏这些功能的西街;同时,它又给高一层提供服务;
- 较底层考虑硬件的特性,并向较高层软件提供接口;
- 较高层不依赖于硬件,并向用户提供一个友好的、清晰的、简单的、功能更强的接口。
I/O软件通常分为四层:
- 用户级I/O软件——用户进程层执行输入输出系统调用,对I/O数据进行格式化,为假脱机输入/输出做准备;
- 与设备无关的OS软件——独立于设备的软件实现设备的命名、设备的保护、成块处理、缓冲技术和设备分配;可分为:
- 驱动程序的统一接口;
- 缓冲;
- 错误报告;
- 分配与释放设备;
- 提供与设备无关的块大小。
- 设备驱动程序——设置设备寄存器、检查设备的执行状态;
- 中断处理程序——负责I/O完成时,唤醒设备驱动程序进程,进行中断处理;
- 硬件——硬件层实现物理I/O的操作。
设备独立性(设备无关性):用户编写的程序可以访问任意I/O设备,无需实现指定设备。
- 从用户角度来看,用户在编制程序时,使用逻辑设备名,由系统实现从逻辑设备到物理设备(实际设备)的转换,并实施I/O操作;
- 从系统角度来看,设计并实现I/O软件时,除了直接与设备打交道的低层软件之外,其他部分的软件不依赖于硬件。
设备独立性的优点在于:设备分配时的灵活性,易于实现I/O重定向。
11.5 I/O相关技术——主要介绍缓冲技术
操作系统中最早引入的技术——缓冲技术的引入:
- 解决CPU与I/O设备之间速度的不匹配问题,凡是数据到达和离去速度不匹配的地方均可采用缓冲技术;
- 提高CPU与I/O设备之间的并行性;
- 减少I/O设备对CPU的中断次数,放宽CPU对中断响应时间的要求。
缓冲技术的实现:
- 缓冲区分类:
- 硬缓冲:由硬件寄存器实现(例如:设备中设置的缓冲区);
- 软缓冲:在内存中开辟一个空间,用作缓冲区。
- 缓冲区管理:
- 单缓冲;
- 双缓冲;
- 缓冲池(多缓冲、循环缓冲):统一管理多个缓冲区,采用有界缓冲区的生产者/消费者模型对缓冲池中的缓冲区进行循环使用。
举例:在终端输入软件中包含一个键盘驱动程序(考虑缓冲问题),其任务之一是收集字符,使用两种常见的字符缓冲方法:
- 公共缓冲池(驱动程序中);
- 终端数据结构缓冲。
Unix syetem V中的缓冲技术的作用:
- 采用缓冲池技术,可平滑和加快信息在内存和磁盘之间的传输;
- 缓冲区结合提前读和延迟写技术对具有重复性及阵发性I/O进程、提高I/O速度很有帮助;
- 可以充分利用之前从磁盘读入、虽已传入用户区但仍在缓冲区的数据(尽可能减少磁盘I/O的次数,来提高系统运行的速度)。
实现:
- 缓冲池:200个缓冲区(512字节或1024字节);
- 每个缓冲区由两部分组成:缓冲控制块或缓冲首部+缓冲数据区;
- 空闲缓冲区队列(av链);队列头部为bfreelist;
- 设备缓冲队列(b链):连接所有分配给各类设备使用的缓冲区,按照散列方式来组织。
每个缓冲区可以同时在av链和b链之中。
11.6 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请求形成一个请求包,排到设备请求队列,如果请求队列孔,则直接启动设备;
- 中断处理函数——对I/O完成做善后处理,一般是唤醒等待刚完成I/O请求的阻塞进程,使其能进一步做后续工作,如果存在I/O请求队列,则启动下一个I/O请求。
11.7 I/O性能问题
从两个方面入手:
- 使CPU利用率尽可能不被I/O降低;
- 使CPU尽可能摆脱I/O。
采用缓冲技术减少或缓解速度差距,采用异步I/O使CPU不等待I/O,采用DMA、通道使CPU摆脱I/O操作。
异步传输
Windows提供两种模式的I/O操作:
- 异步模式——用于优化应用程序的性能;
- 通过异步I/O,应用程序可以启动一个I/O操作,然后在I/O请求执行的同时继续处理;
- 基本思想:填充I/O操作间等待的CPU时间。
- 同步I/O——应用程序被阻塞直到/O操作完成。