OS负责管理I/O设备的部分;它们总类多、速度不同、接口不同,且不断发展变化,功能差异很大。
需要为用户建立通用、一致的访问接口,屏蔽各种设备的差异,以方便使用。
第一节 设备管理的基本概念
I/O设备又叫外部设备(Peripheral);也简称设备或者外设。
包括了除CPU和内存以外的所有硬件和装置。
狭义的I/O设备不包含外存储设备。
OS复杂和庞大的最主要原因是它管理的资源庞杂和采用了并发技术。
资源的庞杂主要是I/O设备的庞杂。
一、设备管理任务的
- I/O设备经常成为制约系统性能的瓶颈,CPU速度越快,它们之间的反差越大;设备管理需要解决这一矛盾;主要通过缓冲技术、中断技术和虚拟技术。
- I/O设备千变万化,如何同一管理,方便用户使用,提高简单易用的访问接口。
- 用户对I/O设备的使用必须是安全的;多用户多任务下应避免冲突。
二、输入输出设备的分类
1、按设备的使用特性分类
- 输入设备
- 输出设备
- 交互式设备
- 存储设备(必须具有以下特性)
- 可写入性
- 可读出性
- 可保存性
2、按设备的信息组织方式分类
- 字符设备character
- 键盘、终端、打印机等
- 不寻址
- 块设备block
- 磁盘、磁带等
早期设备以中断方式传输字符,现在因技术发展,许多设备自身有高速缓存,主要以DMA方式与内存交换数据;典型的如SCSI接口卡。
3、按设备使用时的可共享性
- 独占设备
- 程序运行期间只能独占
- 打印机、磁带驱动器
- 广义共享,非并发,顺序使用
- 共享设备
- 同时可让多个程序使用
- 磁盘
- 狭义共享,并发
- 虚拟设备
- 在一类设备上模拟另一类设备;被模拟的设备称为虚拟设备。
- 通常使用共享设备模拟独占设备(磁盘中的固定区域模拟打印机)。
- 使用高速设备模拟低速设备。
- 目的:提高设备利用率。
三、设备管理与文件管理关系
设备管理:对I/O设备,对资源。
文件管理:对设备中的数据与信息。
第二节 设备硬件和设备管理软件的组成
主要讲的是怎样对设备进行编程。
一、设备硬件的组成
设备组成:
- 物理设备
- 电子部件(设备控制器)
- 每个设备都有寄存器,用于与CPU通信;
- 包括:控制寄存器、状态寄存器和数据寄存器;
- 写入控制寄存器:控制设备收发数据级设备的开和关;
- 读状态寄存器:获取设备状态信息;
- 数据寄存器:作为OS发送和接收数据的缓冲区。
为了使CPU能访问设备控制器中的寄存器,必须为每个寄存器分配唯一的地址,称为I/O端口地址或I/O端口号。
I/O端口地址的编址方式:
- 内存映射编址 - 大部分CPU采用这种方式
- 分配给设备的地址空间与内存空间统一编址;
- CPU将设备控制器中的寄存器看作一个存储单元。
- I/O独立编址
- 分配给设备的地址空间与内存空间完全独立;
- 需要CPU使用专门的I/O指令。
OS不直接与设备打交道而是与设备驱动器打交道。
I/O设备对设备的控制方式有:
- 程序直接控制
- 中断控制
- DMA控制
- 通道控制
二、设备管理软件(I/O软件)的组成
基本思想:将设备管理软件组织成一系列层次,较低层次处理与硬件有关的细节,并将硬件的特征与较高的层隔离;而较高的层则向用户提供一个友好、清晰而规整的程序接口。
一般分为四层(相对灵活,并不一定):
- 中断处理层:负责I/O设备与CPU和内存的数据传送。
- 设备驱动层:从代码量上看是主要部分,与硬件结构密切相关,它知道硬件有几个寄存器这样的底层信息。
- 设备独立层:从功能上看是主要部分,承上启下,为用户提供标准的调用接口;将用户使用I/O设备的需求简化。它必须有编写OS的程序员编写,它是OS必不可少的一部分。
- 用户层
三、设备独立性
设备独立性是设计I/O软件最关键的目标。
I/O软件独立于设备可以提高设备管理软件的的设计效率,当I/O设备更新时,没有必要重新编写全部I/O软件。
1、设备命名
借用了与文件命名统一的命名方法;即采用文件系统路径名的方法。
2、设备保护
防止未授权的应用或用户使用;MS-DOS无;UNIX借用文件系统中的"RWX"位进行保护。
3、提供一个与设备无关的逻辑块
设备的空间大小、速度等均不相同,需要向上层屏蔽这样的差异。
4、缓冲
对于块设备,硬件一般一次读写一个块,而用户进程是按任意单位读写数据的;若用户进程只写了半个块,则OS通常将数据保存在内部缓冲区,等进程写完整个块后才从缓冲区写入磁盘;
对于字符设备,当用进程写入速度快于系统输出速度时,必须使用缓冲。
5、存储设备的分块
在创建文件并向其中填入数据时,通常在磁盘中要为该文件分配新存储块;查空闲块的算法与设备无关,因此可以放在设备驱动程序之上,设备独立层的软件中处理。
6、独占设备的分配与释放
比如打印机,某一时刻只能被单一进程使用。这要求OS对设备使用请求进行检查,并根据设备的可用状态决定接受还是拒绝。
7、错误处理
一般来说由设备驱动来完成。
第三节 I/O设备的控制方式
取决于I/O设备硬件与CPU和内存的联结方式,以及其相应的设备驱动程序。
一、程序直接控制方式(Programmed I/O,PIO)
由用户进程直接控制CPU进行内存和外部设备之间的信息传递,也称为"忙-等"方式、轮询方式或循环测试方式。
优点:CPU和外设的操作能通过状态信息得到同步,而且硬件结构相对简单。
缺点:CPU效率低,传输完全在CPU控制下完成,对外部出现的异常事件无实时响应能力。
只适用于CPU执行速度较慢,外部设备较少的系统;如单片机。
二、中断控制方式
发生某异常事件时,调用相应处理程序(中断服务程序);可实现:
1)CPU与外设大部分时间并行工作;
2)具有实时响应能力,外部中断源始终处于主动地位;
3)及时处理异常情况,提高计算机的可靠性。
需要CPU和设备控制器具备中断机构;CPU需要识别、响应中断请求的寄存器;设备控制器需要锁存外设中断请求、屏蔽本级中断请求,中断请求触发器,中断屏蔽触发器。
处理过程:
1.在CPU上运行的进程通过总线发出命令请求,启动外设工作,当前进程阻塞,调度程序调度其他进程;
2.处理数据准备好,置位中断请求触发器;
3.若此时中断屏蔽触发器为非屏蔽状态,则I/O接口向CPU发送中断请求(IR);
4.CPU接受中断请求,且中断为允许中断状态,则中断判优电路工作;
5.中断判优电路对到达的优先级最高的IR给与响应(INTA),CPU中断正在执行其他进程,转而执行中断服务程序。
三、DMA控制方式
与程序直接控制相比,中断控制方式的CPU利用率大大提高,但是交换数据时,每处理一次I/O数据交换都会耗去一定的CPU处理时间;采用DMA控制方式可以解决这一问题。
DMA是一种完全由硬件执行I/O数据交换的工作方式,DMAC(DMA Controller)从CPU完全接管对总线的控制,数据交换直接在内存和外部设备之间进行;以中断控制方式向CPU报告传送结束。
DMA控制下数据的传送过程:
- 传送前预处理:由CPU执行I/O指令,对DMA进行初始化和启动;
- 数据传送:由DMAC控制总线进行数据传递,当外设数据准备好以后,发出DMA请求,当CPU当前机器周期结束时,响应DMA请求;DMAC从CPU接管总线的控制权,完成对内存寻址并传输。
- 传送后处理:传送结束,DMAC向CPU发中断请求,CPU响应转入中断服务程序,完成DMA结束处理工作。
DMA一般用于高速传送成组的数据,操作均由硬件电路实现,传输速度快;CPU仅参与初始化与结束,减少大量的传输时CPU开销;CPU与外设并行工作,效率高。
局限性:初始化与结束时仍需要CPU控制,大型计算机为了进一步减少负担,提高并行性,除了设置DMA期间外,还设置了专门的硬件装置:通道,来解决问题。
四、通道控制方式(Channel)
通道是具有特殊功能的处理器,有自己的指令和程序;可实现对外设的统一管理,以及外设与内存之间的数据传送。
通道类型按信息交换方式划分:
- 选择通道:
- 高速通道,物理上可以连接多个设备。
- 但他们不能同时工作,某段时间通道只选择其中一个工作;
- 用于连接高速外设(磁盘、磁带等)。
- 数组多路通道
- 对选择通道的一种改进;
- 思想:当某个设备进行数据传送时,通道只为其服务;当设备在执行寻址控制性动作时,通道暂时断开其连接,挂起该设备的通道程序,转而为其他设备服务。
- 优点:具有选择通道的优点,且并行能力和通道利用率更高。
- 缺点:控制复杂。
- 字节多路通道
- 是一种简单的共享通道,在分时基础上为多台速率低、中设备服务;
- 特点:设备与通道间的数据传送以字节为单位交替进行,各设备轮流占用一个很短的时间片。
- 通道并行能力与数组多路通道相同。
通道功能:
1.接受CPU指令:按照指令与指定的外设通信;
2.从内存读取属于该通道的指令,并执行通道程序,向设备控制器和设备发送各种命令;
3.组织外设与内存间数据传送,并根据需要提供缓存;以及提供数据存入内存的地址和传送的数据量;
4.从外设得到外设状态信息,形成并保存通道本身的状态信息,根据要求将这些新消息送到内存指定单元供CPU使用;
5.将外部设备的中断请求和通道本身的中断请求按序及时报告CPU。
第四节 设备的分配与回收
由于设备和控制器资源的有限性,不是每一个进程都能随时随地得到这些资源。进程必须先向设备管理程序提出资源申请,然后根据算法分配;若得不到资源,则将进程放入资源等待队列,直到所需资源释放为止。
一、设备分配的相关数据结构和策略
1、数据结构
常用的数据结构主要含四张表:
- 系统设备表(SDT):整个系统一张表,每个接入系统的设备占一个表项。
- 设备控制表(SCT):每台设备一张。
- 控制器控制表(COCT):每个控制器一张。
- 通道控制表(CHCT):每个通道一张。
等待队列由等待分配资源的PCB组成,一般按照FIFO或者优先级顺序服务。
2、分配原则
要充分发挥设备的使用效率,尽可能地让设备忙碌,有要避免再次进程的死锁;分配方式有:
- 静态分配
- 用户作业开始前一次性地分配所有设备;
- 一旦分配完成就一直占用,直到作业被撤销;
- 是安全的,不会出现死锁;使用效率低。
- 动态分配
- 根据执行需要进行分配,需要时通过系统调用申请;
- 一旦用完立即释放;
- 可能死锁;使用效率高。
3、分配策略
在多道程序系统中,进程数多于资源数,这会产生竞争;分配时需要考虑:
- 外设固有属性
- 外设分配算法
- 设备分配安全性
- 设备独立性
与进程调度类似,设备分配策略通常采用FIFO和高优先级优先的策略。
高优先级优先策略:为每个进程提出的I/O请求分配优先级。
二、独占设备的分配
计算机中大量的设备是独占的;他们不能并发,只能交替使用。
1、设备的绝对号和相对号
为了对计算机中配置的各种不同类型的外设进行管理,系统为每个设备确定一个编号,以便区别,这个确定的编号就是设备的"绝对号"。
在多道程序中,用户并不知道哪台设备被占用,哪台空闲;一般情况下,用户不直接使用绝对号,在需要使用设备时,用户向系统申请;至于实际使用哪一台设备有系统决定,若同时需要使用多个设备,用户可以对设备进行编号,用户在程序中定义的设备编号就是设备的"相对号"。
2、设备的指定方式
- 设备的绝对号;指定的设备故障,则进程阻塞。
- 设备的相对号:通常使用这种方式;使用某一类"好的且空闲的"设备,若设备故障,系统使用另一台"好的且空闲的"设备自动替换。
3、独占设备的分配与释放
常见的独占设备有:打印机、扫描仪、磁带机、绘图仪等。
OS用设备分配表管理,他的组成有:
- 设备类表:每类设备占一项。
- 设备表:每台设备占一项,每个设备有一个绝对号。
三、共享设备的分配
可以被多个进程共享的设备;
每个I/O传输的单位时间内由一个进程占有;无明显地设备申请与设备释放活动;不过在每个使用命令之前都隐含一个申请命令,在每个使用命令之后都隐含一个释放命令。
设备空闲时分配,占用时等待。
由于独占设备的利用率低、死锁概率大;因此需要将独占设备改造成共享设备;这样的共享设备的技术称为SPOOLing(Simultaneous Peripheral Operational On Line);即外部设备同时联机操作。也叫虚拟设备技术或假脱机技术。
第五节 磁盘驱动调度
磁盘特点:(与内存比)
- 容量大
- 价格低
- 关闭电源后信息不丢失
一、信息传输时间
执行一次输入输出所花时间:
- 寻道时间
- 磁头在磁臂带动下移动到指定的磁道(柱面)。
- 延迟时间
- 扇区旋转到磁头下的时间。
- 传递时间
- 由磁头进行读写一完成信息传递的时间
寻道时间和延迟时间与目标的物理位置有关;传递时间在硬件设计时就固定下来了。
为了减少移动磁臂时间每个文件信息不是按照磁道顺序存满一个盘面再存放到下一个盘面的,而是按磁道(柱面)存放;统一柱面上各磁道被放满后会放入下一个柱面。
例如:单张磁盘,有上下2个盘面,对应2个磁头。
访问寻址的过程:寻道 —> 寻扇区 —> 选择磁头。
二、移臂调度及调度算法
根据访问者指定的柱面位置来决定执行次序的调度称为"移臂调度";目的是尽可能减少操作中的寻道时间。
0号磁道在最外沿,号越大越靠近盘片中心;磁盘在关机时,磁头停放在最内圈柱面之内的停放区。
1、先来先服务调度算法FIFO
按访问者提出的访问请求的先后顺序服务。
2、最短寻道时间优先调度算法
总是从等待访问者中挑选寻道时间最短的那个请求先执行。
3、电梯调度算法
从磁臂当前位置开始沿磁臂移动方向去选择离当前磁臂在最近的那个磁道(柱面)访问者;若沿磁臂运动方向没有请求访问,则改变磁臂的移动方向后再选择。
4、单向扫描调度算法
基本思想:总是从0号(最外沿)磁道开始向里扫描,按各自所要访问的磁道位置次序来选择访问者;在磁臂到达最后一个磁道后,立即快速返回0号磁道,返回期间不提供服务;如此循环往复。
5、调度算法比较
算法名称 | 优点 | 缺点 |
先来先服务 | 公平、简单、易实现 | 平均寻道时间较长 |
最短寻道时间优先 | 改善了平均寻道时间 | 可能出现"饥饿"问题 |
电梯调度 | 寻道性能好,无"饥饿"问题 | "歧视"边缘磁道 |
单向扫描 | 消除了不公平现象 | 回程不读写 |
三、旋转调度优化
对于同一磁道(柱面)中多个访问者的读写请求,需要有调度算法,用来确定为这些访问者服务的顺序。
根据延迟时间来决定执行次序的调度称为"旋转调度";需要考虑以下情况:
- 同一磁道(柱面)不同扇区
- 不同磁道(柱面)不同扇区
- 不同磁道(柱面)相同扇区
前两种先到达磁头下的扇区先服务;扇区相同时随机选择。
四、磁盘信息的优化分布
记录在磁道上的排列方式会影响I/O时间。
第六节 缓冲技术
1、缓冲的引入
中断、DMA核通道控制技术使得系统中各I/O设备之间、I/O设备与CPU之间可以并行工作;但是I/O设备与CPU的速度不匹配;者限制了和CPU连接的I/O设备的台数,而且中断方式下容易造成数据丢失。
输出时利用缓冲区计算机进程先将数据输出到缓冲区,然后再继续其他后续工作,可以解决速度不匹配的问题;
缓冲区也可以减少中断次数从而降低一中断造成数据丢失的概率。
因为I/O控制方式不同,实现缓冲的方法一般有两种:
- 采用专用硬件(常在外设的I/O控制器中)
- 内存中划分一定容量的专用数据缓冲区,也称"软件缓冲"
2、缓冲的种类
按个数划分:
- 单缓冲
- 双缓冲
- 一读一写
- 多缓冲
- 一部分输入,一部分输出
- 缓冲池
- 每个缓冲区即可输入亦可输出
3、缓冲池管理
每个缓冲区由两部分组成:
- 一部分用来标识和管理该缓冲区的缓冲头部
- 另一部分用于存储数据
两者一一对应;管理是通过缓冲首部进行操作实现的。
缓冲首部包含:
- 设备号
- 设备上的数据块号(使用块设备号)
- 互斥标识位
- 缓冲队列连接指针
- 缓冲区号
缓冲区队列:
- 空闲缓冲区队列
- 已满输入缓冲区队列
- 已满输出缓冲区队列
第七节 虚拟设备技术
虚拟设备技术是多道程序设计系统中处理独占外设的一种方法。
可以进程在所需的外设不存在或者被占用的情况下使用该设备。
一、虚拟设备实现原理
SPOOLing系统主要包括:
- 输入程序模块
- 输出程序模块
- 作业调度程序
原理:利用输入程序模块在作业执行前就利用慢速设备将作业预先输入道后援存储器(磁盘、磁鼓等),称为输入井;这个行为叫预输入。
作业进入内存运行后,使用数据时,直接从输入井中读取。
作业运行时不必直接启动外设输入数据,只需要将这些数据写入输出井。
待做作业全部运行完毕,再由外设输全部数据和信息。
二、SPOOLing系统的组成与实现
1、SPOOLing系统的组成
2、SPOOLing系统的实现 — 打印机的值班进程
打印机是典型的独占设备;
用户的打印请求被传递给SPOOLing系统,而不是真正把打印机分配给用户。
SPOOLing系统的输出管理模块在磁盘上申请一个空闲区,把需要打印的数据传入其中,再将用户的打印请求挂到打印队列上。
若打印机空闲,后台打印程序就会从打印队列中取出一个请求,再从磁盘上的对应输出井取出数据,执行打印。
由于磁盘是共享的,SPOOLing可以随时响应打印请求并把数据缓存起来,这样就将独占设备改造成了共享设备。
注意:一些需要实时响应的独占设备时无法使用SPOOLing方法改造的。(比如摄像机。)
附录A:SPOOLing技术
SPOOLing(Simultaneous Peripheral Operations On-Line)是一种在操作系统设备管理中广泛使用的技术,用于解决共享设备(如打印机)瓶颈和效率问题。它通过将数据暂时存储在磁盘或内存中,然后在设备空闲时逐步处理这些数据。
SPOOLing 技术的实现原理
- 数据缓冲:
- 当多个进程请求使用共享设备(例如打印机)时,操作系统将这些请求的数据缓冲到一个临时存储区域(通常是磁盘文件或内存缓冲区),称为 SPOOL 队列。
- 队列管理:
- 操作系统维护一个队列来管理这些缓冲数据。每当有新的请求进来时,数据被追加到队列末尾。
- 设备调度:
- 一个专用的后台进程(通常称为 SPOOLer)负责监控这个队列。当设备空闲时,SPOOLer 从队列中提取下一个数据块并将其发送到设备。
- 并行处理:
- SPOOLing 允许 CPU 和 I/O 设备并行工作。CPU 可以继续处理其他任务,而 SPOOLer 处理 I/O 操作,从而提高了系统整体效率。
SPOOLing 的实例
打印 SPOOLing
- 数据缓冲:
- 当用户请求打印文档时,文档数据被写入到一个临时文件或内存缓冲区,而不是直接发送到打印机。
- 队列管理:
- 操作系统将每个打印作业排队,维护一个打印队列。用户可以查看队列中作业的状态,例如通过 Windows 的“打印队列”窗口。
- 设备调度:
- 打印 SPOOLer 进程(例如 Windows 中的“Print Spooler”服务)监控打印队列。当打印机空闲时,SPOOLer 从队列中提取下一个文档并将其发送到打印机进行打印。
- 并行处理:
- 用户可以继续处理其他任务或提交更多的打印作业,而不必等待当前打印作业完成。
输入设备 SPOOLing
- 数据缓冲:
- 输入设备(如键盘或鼠标)的数据可以缓存在内存中,特别是在数据传输速率较低的情况下。
- 队列管理:
- 操作系统维护一个输入缓冲区队列,每当有输入数据时,它们被添加到队列中。
- 设备调度:
- 操作系统中的 SPOOLer 进程从输入缓冲区队列中读取数据并将其交给应用程序处理。
- 并行处理:
- 这样可以确保用户输入不会丢失,同时操作系统和应用程序可以并行处理其他任务。
SPOOLing 的优点
- 提高设备利用率:
- 通过缓冲和排队机制,设备可以在空闲时高效工作,而不是在等待时浪费时间。
- 增强并行性:
- CPU 和 I/O 设备可以同时工作,提高了系统的整体性能。
- 简化用户操作:
- 用户不必等待设备完成当前操作,可以继续处理其他任务,提高了用户体验。
- 数据管理:
- SPOOLing 系统可以处理数据格式转换、错误检测和恢复,提高数据传输的可靠性。
例子:Unix 系统中的 SPOOLing
在 Unix 系统中,打印 SPOOLing 实现如下:
- 用户通过
lpr
命令提交一个打印作业,作业被写入/var/spool
目录中的一个文件。 lp
或lpd
服务(打印 SPOOLer 守护进程)监视/var/spool
目录。- 当打印机空闲时,
lpd
服务从/var/spool
目录中读取下一个作业,并将其发送到打印机。 - 用户可以使用
lpq
命令查看打印队列的状态,使用lprm
命令取消作业。