6.1 I/O 系统的功能,模型和接口
I/O 系统管理的主要对象 I/O 设备和相应的设备控制器。其最主要的任务是,完成用户提出的I/O请求,提高I/O速率,以及提高设备的利用率,并能为更高层的进程方便地使用这些设备提供手段。
6.1.1 I/O 的基本功能
- 隐藏物理设备的细节
- 与设备的无关性
- 提高处理机和 I/O 设备的利用率
- 对 I/O 设备进行控制
对 I/O 设备进行控制是驱动程序的功能。目前对I/O设备有四种控制方式
- 采用轮询的可编程的I/O方式
- 采用中断的可编程的I/O方式
- 直接存储器访问方式
- I/O通道方式
- 确保对设备的正确共享
- 独占设备
- 共享设备
- 错误处理
6.1.2 I/O系统的层次结构和模型
目前已普遍采用层次式结构的I/O系统,这是系统中的设备管理模块分为若干个层次,每一层都是利用其下层提供的服务,完成输入输出功能中的某些子功能,并屏蔽这些功能实现的细节,向高层提供服务。
- I/O 软件的层次结构
分为四个结构:
- 用户层 I/O 软件
- 设备独立性软件
- 设备驱动程序
- 中断处理程序
- I/O 系统中各种模块之间的层次视图
- I/O 系统的上,下接口
- 软件 / 硬件接口
- I/O 系统的分层
系统本身也可以分为如下三个层次:
- 中断处理程序:它处于 I/O 系统的底层,直接与硬件进行交互
- 设备驱动程序:它处于 I/O 系统的次底层,是进程和设备控制器之间的通信程序,其主要功能是,将上层发来的抽象I/O请求转换为对I/O设备的具体命令和参数,并把它们装入到设备控制器中的命令和参数的寄存器中。
- 设备独立性软件
6.1.3 I/O 系统接口
- 块设备接口:块设备接口是块设备管理程序与高层之间的接口。该接口反映了大部分磁盘存储器和光盘存储器的本质特征,用于控制该类设备的输入或输出。
- 块设备:所谓块设备,是指数据的存取和传输都是以数据块为单位的设备。
- 隐藏了磁盘的二维结构
- 将抽象命令映射为低层操作
- 流设备接口:流设备接口是流设备管理程序与高层之间的接口。该接口又称为字符设备接口,它反应了大部分字符设备的本质特征,用于控制字符设备的输入或输出。
- 字符设备:所谓字符设备,是指数据的存取和传输是以字符为单位的设备。如键盘,打印机等。
- get 和 put 操作
- in-control 指令
- 网络通信接口
6.2 I/O 设备和设备控制
I/O 设备一般由执行I/O操作的机械部分和执行控制I/O的电子部分组成。通常将这两部分分开,执行I/O操作的机械部分就是一般的I/O设备,而执行控制I/O的电子部件则称为设备控制器或适配器。
6.2.1 I/O设备
-
I/O设备种类繁多,除了能将它们分为块设备和字符设备,独占设备和共享设备外,还可从设备使用特征上分为存储设备和I/O设备。
-
按使用特性来分类
-
按传输速度来分类
-
设备与控制器之间的接口
通常,设备并不是直接与CPU进行通信,而是与设备控制器进行通信。 -
数据信号线:这类信号数据线用于在设备和设备控制器之间传送数据信号。
-
控制信号线:这是作为由设备控制器向I/O设备发送控制信号的通路。
-
状态信号线:该信号线用于传送指示设备当前状态的信号。
6.2.2 设备控制器
设备控制器的主要功能是,控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换。
设备控制器的基本功能:
- 接受和识别命令
- 数据交换
- 标识和报告设备的状态
- 地址识别
- 数据缓冲区
- 差错控制
设备控制器的组成
- 设备控制器与处理机的接口
- 设备控制器与设备的接口
- I/O 逻辑
6.2.3 内存映象 I/O
驱动程序将抽象 I/O 命令转换出的一系列具体命令,参数等数据装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对I/O设备的控制。这一工作可用如下两种方法完成:
- 利用特定的 I/O 指令
- 内存映象I/O
6.2.4 I/O 通道
- I/O 通道设备的引入
虽然在CPU与I/O设备之间增加了设备控制器后,已能大大减少CPU对I/O的干预,但当主机所配置的外设很多时,CPU的负担仍然很重。为此,在CPU和设备控制器之间又增设了I/O通道。其主要目的是为了建设独立的I/O操作,不仅使数据的传送能独立于CPU,而且也希望有关对I/O操作的组织,管理及其结束处理尽量独立,以保证CPU有更多的时间去进行数据的处理。实际上,I/O通道是一种特殊的处理机。它具有执行I/O指令的能力,并通过执行通道(I/O)程序来控制I/O操作。但I/O通道又与一般的处理机不同,主要表现在以下两个方面:
- 其指令类型单一。
- 通道没有自己的内存,通道所执行的通道程序是放在主机的内存中的,换言之,是通道与CPU共享内存
- 通道类型
- 字节多路通道
- 数组选择通道
- 数组多路通道
- 瓶颈问题
解决瓶颈问题的最有效的方法,便是增加设备到主机间的通路而不增加通道。
6.3 中断机构和中断处理程序
中断处理程序是I/O系统中最低的一层,它是整个I/O系统的基础
6.3.1 中段简介
-
中断和陷入
- 中断
- 陷入
-
中断向量表和中断优先级
-
对多中断源的处理方式
- 屏蔽(禁止)中断,当处理机正在处理一个中断时,将屏蔽掉所有的中断,即处理机对任何新到的中断请求,都暂时不予理睬,而让它们继续等待。
- 嵌套中断
- 当同时有多个不同优先级的中断请求时,CPU优先响应最高优先级的中断请求。
- 高优先级的中断请求可以抢占正在运行的低优先级中断的处理机。
6.2.3 中断处理程序
6.4 设备驱动程序
设备处理程序通常又被称为设备驱动程序,它是I/O系统的高层与设备控制器之间的通信程序,其主要任务是接收上层软件发来的抽象I/O要求,如read或write命令,再把它转化为具体要求后,发送给设备控制器,启动设备去执行,反之,它也将由设备控制器发来的信号传送给上层软件。由于驱动程序与硬件密切相关,故通常应为每一类设备配置一种驱动程序。比如,打印机和显示器需要不同的驱动程序。
6.4.1 设备驱动程序概述
- 设备驱动程序的功能
为了实现I/O系统的高层与设备控制器之间的通信,设备驱动程序应具有以下功能:
- 接收由与设备无关的软件发来的命令和参数,并将命令中的抽象要求转换为与设备相关的低层操作序列。
- 检查用户 I/O 请求的合法性
- 发出 I/O 命令
- 及时响应由设备控制器发来的中断请求
- 设备驱动程序的特点
- 是实现在与设备无关的软件和设备控制器之间通信和转换的程序
- 与设备控制器以及I/O设备的硬件特性紧密相关
- 与I/O设备所采用的I/O控制方式紧密相关
- 由于驱动程序与硬件相关,因而其中的一部分必须会用汇编语言书写
- 驱动程序应允许可重入
- 设备处理方式
在不同的操作系统中,所采用的设备处理方式并不完全相同。根据在设备处理时是设置进程,以及设置什么样的进程,而把设备处理方式成以下三类:
- 为每一类设备设置一个进程,专门用于执行这类设备的I/O操作
- 在整个系统中设置一个I/O进程,专门用于执行系统中所有各类设备的I/O操作
- 不设置专门的设备处理进程。而只为各类设备设置相应的设备处驱动程序,供用户或系统进程调用
6.4.2 设备驱动程序的处理过程
6.4.3 对I/O设备的控制方式
- 使用轮询的可编程I/O方式
- 使用中断的可编程I/O方式
- 直接存储器访问方式
- I/O通道控制方式
6.5 与设备无关的I/O软件
6.5.1 与设备无关软件的基本概念
- 以物理设备名使用设备
- 引入逻辑设备名
- 逻辑设备名称到物理设备名称的转换
6.5.2 与设备无关的软件
- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 对独立设备的分配与回收
- 独立于设备的逻辑数据块
6.5.3 设备分配
系统为实现对独占设备的分配,必须在系统中设置相对应的数据结构。
- 设备方式中的数据结构
设备控制表(DCT):系统为每一个设备都配置了一张设备控制表,用来记录设备的情况(指示设备类型的字段type,设备标识字段deviceid,设备队列队首指针,忙/闲标志,与设备连接的控制器表指针,重复执行次数)
控制器控制表,通道控制表,系统设备表
- 控制器控制表(COCT):系统为每一个控制器都设置了用于记录控制器情况的控制器控制表。
- 通道控制表(CHCT):每个通道都有一张通道控制表
- 系统设备表(SDT):这是系统范围的数据结构,记录了系统中全部设备的情况,每一个设备这样一个表目。
- 设备分配时应考虑的因素
系统在分配设备时,应考虑如下几个因素:
- 设备的固有属性,可分为三种,对它们应采取不同的分配策略:
- 独占设备的分配策略。
- 共享设备的分配策略。
- 虚拟设备的分配策略。
- 设备分配算法,通常采用两种:
- 先来先服务
- 优先级高者优先
- 设备分配中的安全性,两种方式:
- 安全分配方式
- 不安全分配方式
- 独占设备的分配程序
6.5.4 逻辑设备名到物理设备名的映射
- 逻辑设备表
- 逻辑设备表的设置问题
6.6 用户层的 I/O 软件
一般而言,大部分的I/O都放在操作系统内部,但仍有一小部分在用户层,其中包括与用户程序链接在一起的库函数,以及完全运行于内核之外的假脱机系统。
6.6.1 系统调用与库函数
- 系统调用
- 库函数
6.6.2 假脱机系统
通过假脱机技术,则可将一台物理I/O设备虚拟为多台逻辑I/O设备,这样也就允许多个用户共享一台物理I/O设备
- 假脱机技术
该技术是利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,这样当处理机需要输入数据时,便可以直接从磁盘中读取数据,极大地提高了输入速度。我们把这种在联机情况下实现的同时外围操作的技术称SPOOLing技术,或称假脱机技术。
- 假脱机的组成,由以下四部分组成:
- 输入井和输出井,这是在磁盘上开辟出来的两个存储区域。
- 输出缓冲区和输入缓冲区
- 输入进程(预输入进程)和输出进程(缓输出进程)
- 井管理程序
- 假脱机系统的特点
- 提高了I/O的速度
- 将独占设备改造为共享设备
- 实现了虚拟设备的功能
- 假脱机打印系统,主要由以下三个部分:
- 磁盘缓冲区
- 打印缓冲区
- 假脱机管理进程和假脱机打印进程
利用假脱机系统向用户提供共享打印机的概念是:对每个用户而言,系统并非及时执行其程序输出数据的真实打印操作,而只是即时将数据输出到缓冲区,这时的数据并未真正打印,只是让用户感觉系统已为他打印。真正的打印操作是在打印机空闲且该打印任务在等待队列中已排到队首时进行的,而且,打印操作本身也是利用CPU的一个时间片,没有使用专门的外围机。以上的过程是对用户屏蔽用户的,用户是不可见的。
- 守护进程
守护进程是允许使用该独占设备的唯一进程,所有其它进程都不能直接使用该设备,只能将对该设备的使用要求写入一份文件中,放在假脱机目录中。
6.7 缓冲区管理
在一般情况下,更多的是利用内存作为缓冲区。缓冲区管理的主要功能是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
6.7.1 缓冲的引入
引入缓冲区的原因有许多:
- 缓和CPU与I/O设备间速度不匹配的矛盾
- 减少对CPU的中断频率,放宽对CPU中断响应时间的限制
- 解决数据粒度不匹配的问题
- 提高CPU与I/O设备之间的并行性
6.7.2 单缓冲区和双缓冲区
在单缓冲区情况下,每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区。假定从磁盘把一块数据输入到缓冲区的时间为T,OS将该缓冲区中的数据传送到用户区的时间为M,CPU对这块数据处理的时间为C,则系统对每一块数据的处理时间表现为 MAX(C, T) + M。
双缓冲区为了加快输入和输出速度,提高设备利用率,引入了双缓冲区机制,也称为缓冲区对换。系统处理一块数据的时间可粗略地认为是 MAX(C, T)。
6.7.3 环形缓冲区
环形缓冲区的组成:1.多个缓冲区,2.多个指针。
6.7.4 缓冲池
缓冲池是包含了一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区。
- 缓冲池的组成,缓冲池管理着多个缓冲区,每个缓冲区,由用于标识和管理的缓冲首部以及用于存放数据的缓冲体两部分组成。
- 缓冲区的工作方式。
- 收容输入
- 提取输入
- 收容输出
- 提取输出
6.8 磁盘存储器的性能和调度
磁盘存储器是计算机系统中的最重要的存储设备,在其中存放了大量的文件。对文件的读,写操作都涉及对磁盘的访问。磁盘I/O速度的高低和磁盘系统的可靠性,将直接影响到系统的性能。可以通过多种途径来改善磁盘系统的性能。
- 可通过选择好的磁盘调度算法,以减少磁盘的寻道时间
- 提高磁盘I/O速度,以提高对文件的访问速度
- 采取冗余技术,提高磁盘系统的可靠性,建立高度可靠的文件系统
6.8.2 早期的磁盘调度算法
由于在访问磁盘的时间主要是寻道时间,因此,磁盘调度的目标是使磁盘的平均寻道时间最少。目前常用的磁道调度算法有:
- 先来先服务
- 最短寻道时间(SSTF),会发生"饥饿现象"
- 扫描算法(SCAN)
- 循环扫描算法(CSCAN)