目录
I/O系统管理
1)主要对象:
I/O设备和对应的设备控制器
2)主要任务:
完成用户提出的I/O请求
提高I/O速率
改善I/O设备的利用率
3)基本功能:
能够隐藏物理设备的细节
能够保证OS与设备无关
能够提高处理机和I/O设备的利用率
能够对I/O设备进行控制
能够确保对设备的正常共享
能够处理错误
I/O软件的层次结构
I/O系统接口:
1)块设备接口
块设备:数据的存取和传输都是以数据块为单位的设备,如磁盘、光盘,通常采用DMA I/O方式
隐藏了磁盘的二维结构
将抽象命令映射为低层操作 (如收到读磁盘命令时,先将抽象命令中的逻辑块号转换为磁盘的盘面、磁道和扇区等)
2)流设备(字符设备)接口
字符设备:数据的存取和传输都是以字符为单位的设备,如键盘、打印机。 不可寻址。
通常采用中断驱动I/O方式。
get和put操作:字符设备采用顺序存取方式。
get操作用于从字符缓冲区取得一个字符(到内存),并将它返回给调用者。
put操作用于将一个新字符(从内存)输出到字符缓冲区网络。
in-control指令:包含许多参数,每个参数均表示一个与具体设备相关的特定功能。
3)网络通信接口
OS提供相应的网络软件和网络通信接口,以使计算机能通过网络同网络上的其他计算机进行通信,或上网浏览信息。
I/O设备的类型
按使用特性分类:存储设备、I/O设备
按输出速率分类:
低速设备:键盘、鼠标器、语音的输入和输出等
中速设备:行式打印机、激光打印机等
高速设备:磁带机、磁盘机、光盘机等
按信息交换单位分类:块设备、字符设备
按设备的共享属性分类:独占设备、共享设备
设备控制器
主要功能:控制一个或多个I/O设备,以实现I/O设备和计算机之间的数据交换
设备控制器是CPU与I/O设备之间的接口,接收从CPU发来的命令,并去控制I/O设备工作
设备控制器是一个可编址的设备。
当仅控制一个设备时,它只有一个惟一的设备地址
若控制器可连接多个设备时,则应含有多个设备地址,并使每一个设备地址对应一个设备
基本功能:
接收和识别命令;数据交换;标识和报告设备的状态;地址识别;数据缓冲区;差错控制
组成:
1)设备控制器与处理机的接口:实现CPU与设备控制器之间的通信,包括数据线、地址线和控制线
2)设备控制器与设备的接口:一个设备控制器可以连接一个或多个设备
3)I/O逻辑:实现对设备的控制
内存映像I/O
驱动程序将抽象I/O命令转换成具体的命令和参数等装入设备控制器的相应寄存器,由控制器执行这些命令,具体实施对I/O设备的控制。
具体方法:
> 采用特定I/O指令:访问内存和设备需要两种不同的指令
> 采用内存映像I/O形式
在编址上不在区分内存单元地址和设备控制器中的寄存器地址,统一编址 k 。 k在0~n-1范围时,为内存地址;若k>=n时,为某控制器的寄存器地址
统一了访问方法,简化了I/O编程
I/O通道
目的:使一些原来由CPU处理的I/O任务转由通道来承担,从而把CPU从繁杂的I/O任务中解脱出来
通道与普通处理机
????????通道是特殊处理机
????????不同点: 指令类型单一;没有自己的内存(与CPU共享内存)
类型:
字节多路通道:按字节交叉方式工作的通道
数组选择通道:可以连接多台高速设备,但在一段时间内只允许一台设备传输数据,传输率高
数组多路通道:结合前两者优点,含有多个非分配型子通道
I/O设备的控制方式
1.使用轮询的可编程I/O方式(基本不用)
① 由CPU定时发出询问,询问设备是否忙,进程进入忙等
②不忙即进行I/O,否则转① 实现容易,但效率偏低,CPU会长期处于忙等待
2.使用中断的可编程I/O方式(广泛采用)
当某进程要启动某个I/O设备工作时,便由CPU向相应的设备控制器发出一条I/O命令,然后立即返回继续执行原来的任务。设备控制器于是按照该命令的要求去控制指定的I/O设备。此时,CPU与I/O设备并行操作。
3. 直接存储器访问(DMA)方式
> DMA的引入:进一步减少CPU对I/O设备的干预
数据传输的基本单位是数据块
所传送的数据是从I/O设备直接送入内存的,或者相反
仅在传送一个或多个数据块的开始和结束时,才须CPU干预
4.I/O通道控制方式
引入:是DMA方式的发展,可进一步减少CPU的干预。
是对一组数据块以读/写及有关的控制和管理为单位干预; 可实现CPU、通道和I/O设备三者的并行操作。
通道程序:由一系列通道指令所构成的。
通道指令不同于CPU指令。 指令包含:操作码、内存地址、计数、通道程序结束位P、记录结束位R。
瓶颈问题
通道不足,造成“瓶颈”问题(通道价格昂贵)
解决方法:
1)增加设备到CPU间的通路而不增加通道
2)多通路方式不仅解决了“瓶颈”问题,而且提高了系统的可靠性
中断(Interrupt)是指CPU对I/O设备发来的中断信号的一种响应
陷入(Trap)是指CPU内部事件所引起的中断
中断向量表:中断向量表存放每个设备的中断处理程序的入口地址,并为每个设备的中断请求作为一个中断号,对应于中断向量表中的一个表项
中断优先级:系统为每个中断源规定不同的优先级
中断源:引起中断的事件
当处理机正在处理一个中断时,又来了一个新的中断请求,
????????有两种处理方式: 屏蔽(禁止)中断 嵌套中断
中断处理程序
1)测定是否有未响应的中断信号
2)保护被中断进程的CPU现场
3)转入相应的设备处理程序
4)处理中断
5)恢复CPU现场并退出中断
Linux系统中断处理:
> 采用了上半部和下半部机制:
上半部:中断处理程序。 简单快速,执行时禁止一些或全部中断。
下半部:一些虽然与中断有关但是可以延后执行的任务。 稍后执行,执行时可以响应所有的中断。
> 中断处理程序的设计: 注册中断 处理中断 注销中断
功能:接收上层软件发来的抽象I/O请求,再把它们转换为具体要求后,发送给设备控制器,启动设备去执行
特点:
实现与设备无关的软件和设备控制器直接通信和转换的程序
与设备控制器以及I/O设备特性紧密相关
与I/O设备所采用的I/O控制方式紧密相关
基本部分固化在ROM中
允许可重入
设备处理方式:
为每类设备设置一个进程,专门用于执行这类设备的I/O操作
在整个系统中设置一个I/O进程,专门用于执行系统中各类设备的I/O操作
不设置专门的设备处理进程,而只为各类设备设置相应的设备驱动程序
处理过程:
1)将抽象要求转换为具体要求;
2)对服务请求进行校验;
3)检查设备的状态;
4)传送必要的参数;
5)启动I/O设备;
设备驱动程序与外界的接口:
设备驱动程序与操作系统内核的接口
设备驱动程序与系统引导的接口
设备驱动程序与设备的接口
设备驱动程序的组成:
设备驱动程序的注册与注销
设备的打开与释放
设备的读/写操作
设备的控制操作
设备的中断与轮询
目的:实现设备独立性
逻辑设备名:抽象的设备名;可实现I/O重定向(指用于I/O操作的设备可以更换,而不必改变应用程序)
逻辑设备名到物理设备名的转换:
必须具备将逻辑设备名转换为物理设备名的功能
系统配备逻辑设备表
设备分配
1)数据结构:
设备控制表DCT– 记录设备的情况
控制器控制表COCT、通道控制表CHCT和系统设备表SDT
2)设备分配时应考虑的因素:
独占设备、共享设备、虚拟设备的分配策略
分配算法:先来先服务、优先级高者优先
安全性考虑:安全分配、不安全分配
3)独占设备的分配程序:
基本分配程序:分配设备、分配控制器、分配通道
分配程序改进
设备控制表DCT
逻辑设备名映射物理设备名
在应用程序中请求使用I/O设备时,应使用逻辑设备名;而系统只识别物理设备名
逻辑设备表LUT:用于将逻辑设备名映射为物理设备名
包含:逻辑设备名、物理设备名和设备驱动程序入口地址
设置方式:整个系统已张LUT;每个用户一张LUT
I/O调度
调度一组I/O请求:就是按照确定好的顺序来执行I/O操作; 提高计算机效率。
通过I/O调度可以
改善系统整体性能; 在进程间公平共享设备访问; 减少完成I/O调度所需的平均等待时间。
实现:为每个设备维护一个请求等待队列。
大部分I/O软件都放在OS内部,仍有一小部分在用户层
系统调用:应用程序通过系统调用间接调用OS中的I/O过程,对I/O设备进行操作
库函数:Win32 API C 语言或UNIX系统中,系统调用与库函数,几乎一一对应
假脱机系统
假脱机技术:外围操作与CPU对数据的处理同时进行,这种在联机情况下实现的同时外围操作称为SPOOLing (Simultaneous Peripheral Operations On-Line),或假脱机技术
为了缓和CPU的高速性与I/O设备的低速性间的矛盾而引入了脱机输入、脱机输出技术。
SPOOLing系统?的组成
1)输入井和输出井
在磁盘上开辟的两个大存储空间
输入井:模拟脱机输入时的磁盘设备,用于暂存输入设备输入的数据
输出井:模拟脱机输出时的磁盘,用于暂存用户程序的输出数据
2)输入缓冲区和输出缓冲区
缓和CPU和磁盘之间速度不匹配的矛盾
输入缓冲区:用于暂存由输入设备送来的数据,以后再传送到输入井。
输出缓冲区:用于暂存从输出井送来的数据,以后再传送给输出设备
输入进程SPi:Spi模拟脱机输入时的外围控制机,将用户要求的数据从输入设备通过输入缓冲区再送入输入井,当CPU需要输入数据时,直接从输入井读入内存
输出进程Sp0:Sp0模拟脱机输出时的外围控制机,把用户要求输出的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据经过输出缓冲区送到输出设备上
井管理程序:用于控制作业与磁盘井之间信息的交换
SPOOLing系统特点:
提高了I/O的速度;将独占设备改造为共享设备;实现了虚拟设备功能
假脱机打印机系统
打印机属于独占设备。利用SPOOLing技术,可将之改造为一台可供多个用户共享的设备,从而提高设备的利用率,也方便了用户。
共享打印机技术已被广泛用于多用户系统和局域网络(添加方法)中
>?磁盘缓冲区:磁盘空间,暂存用户程序的输出数据
>?打印缓冲区:设在内存,暂存从磁盘缓冲区送来的数据
>?假脱机管理进程和假脱机打印进程
假脱机管理进程为每个要求打印的用户数据建立一个假脱机文件,并放入文件队列中
假脱机打印进程依次对队列中的文件进行打印
共享打印机
1)假脱机管理进程:
在磁盘缓冲区中为之申请一个空闲盘块,并将要打印的数据送入其中暂存
为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入表中,再将该表挂到假脱机文件队列上
2)假脱机打印进程
当打印机空闲时,进程从请求打印队列的队首取出一张请求打印表,根据表中的要求将要打印的数据,从输出井传送到内存缓冲区,再由打印机进行打印
打印完,进程再次察看请求打印队列,若非空,重复上述工作,直到队列为空。此后进程才将自己阻塞起来。仅当下次再有打印请求时,进程才被唤醒
方案修改:取消假脱机管理进程,为打印机建立一个守护进程,由它执行一部分原来的假脱机管理进程的功能。 守护进程是允许使用打印机的唯一进程。
缓冲区管理:
缓冲区是一个存储区域,可以由专门的硬件组成;更多的是利用内存
缓冲管理的主要功能是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
引入原因:缓和CPU与I/O设备间速度不匹配的矛盾;减少对CPU的中断频率,放宽对CPU中断响应时间的限制;解决数据粒度不匹配的问题;提高CPU与I/O设备之间的并行性
单缓冲
每当用户进程发出一I/O请求时,操作系统便在主存中为之分配一缓冲区
在块设备输入时,
T:从磁盘把一块数据输入到缓冲区的时间
M:操作系统将该缓冲区中的数据传送到工作区的时间
C:CPU对这块数据处理的时间。
当T>C时,系统对每一块数据的处理时间为M+T(C忽略)
反之,则为M+C
系统对每一块数据的处理时间为:Max(C,T)+M
双缓冲
双缓冲机制(缓冲对换)
在设备输入时,先将数据送入第一缓冲区,装满后便转向第二缓冲区。
此时操作系统可以从第一缓冲区移出数据,并送入用户进程。接着由CPU对数据进行计算。
在双缓冲时,系统处理一块数据的时间可以粗略地认为是Max(C,T),如果C>T,则可使CPU不必等待设备输入
环形缓冲
> 多个缓冲区
在循环缓冲中包含多个缓冲区,其每个缓冲区的大小相同。
作为输入的多缓冲区可分为三种类型
????????用于装输入数据的空缓冲区R;
????????已装满数据的缓冲区G;
????????计算进程正在使用的现行工作缓冲区C
>?多个指针
作为输入的缓冲区可设置3个指针
????????用于指示计算进程下一个可用缓冲区G的指针Nextg
????????指示输入进程下次可用的空缓冲区R的指针Nexti
????????用于指示计算进程正在使用的缓冲区C的指针Current
>?使用
Getbuf过程:计算进程要使用缓冲区的数据时调用该过程,将指针Nextg所指示的缓冲区提供给进程使用,修改Nextg和Current指针;输入进程要使用空缓冲装数据时调用该过程,将指针Nexti所指示的缓冲区提供给进程使用,修改Nexti
Releasebuf过程:当计算进程把C缓冲区中的数据提取完毕时,调用过程,将缓冲区C释放;当输入进程把缓冲区装满时,调用过程,将该缓冲区释放,并将其改为可用缓冲区G
进程间的同步问题:Nexti指针追赶上Nextg指针; Nextg指针追赶上Nexti指针
缓冲池
为了提高缓冲区的利用率,引入公用缓冲池,在池中设置了多个可供若干个进程共享的缓冲区。
对于既可用于输入又可用于输出的公用缓冲池
组成:
空闲缓冲队列emq:空缓冲区所链成的队列
输入队列inq:装满输入数据的缓冲区所链成的队列
输出队列out:装满输入数据的缓冲区所链成的队列
4种工作缓冲区:收容输入缓冲区、提取输入缓冲区、收容输出缓冲区、提取输出缓冲区
Getbuf和putbuf过程:
对缓冲池中的队列进行操作;既可实现互斥又可保证同步
工作方式:收容输入 提取输入 收容输出 提取输出
缓存Cache
缓存是保存数据副本的高速内存区域:CPU缓存、磁盘缓存、光驱缓存等。
CPU缓存(高速缓存):为了缓和CPU运行速率与内存读/写速率不匹配的矛盾; 当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理;若没有找到,则从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据库调入缓存中。
缓存和缓冲:
缓冲可以保存数据项的唯一的现有版本。
缓存只是提供一个位于其他地方的数据项的更快存储副本。
有时,同一个内存区,既可以是缓冲,也可以是缓存。
磁盘的结构:
盘面(磁头):磁盘设备可包含一或多个盘片,每个盘片分为一个或两个盘面,每个面上有一个读写磁头
磁道(柱面):每个盘面可分成若干条磁道
扇区:每条磁道逻辑上分成若干个大小相同的扇区。每个扇区的大小相当于一个盘块(数据块);
每条磁道上可存储相同数目的二进制位
磁盘密度即每英寸中所存储的位数,显然是内层磁道的密度较外层磁道的密度高。
磁盘容量计算:容量=柱面×磁头×扇区,每扇区存放512B数据
数据的组织和格式:
1)为了在磁盘上存储数据,必须先将磁盘格式化
2)如每条磁道含有30个固定大小的扇区,每个扇区容量为600个字节,其中512个字节存放数据,其余的用于存放控制信息
3)每个扇区包括2个字段:
标识符字段:其中一个字节的SYNCH具有特定的位图像,作为该字段的定界符,利用磁道号、磁头号及扇区号三者来标识一个扇区;CRC字段用于段校验 数据字段:存放512个字节的数据
磁盘的类型
分类1:硬盘、软盘
分类2:单片盘、多片盘
分类3:
1)固定头磁盘:
每个磁道上都有一个读写磁头
并行方式读/写,有效提高磁盘的I/O速度
主要用于大容量磁盘
2)移动头磁盘:
每个盘面仅配有一个磁头,能移动寻道
串行方式读/写,I/O速度较慢
广泛应用于中、小型磁盘设备中
磁盘访问时间:
磁盘在工作时是以恒定速率旋转。
为了读写:磁头必须移动到所要求的磁道上,并等待所指定的扇区的开始位置旋转到磁头下, 开始读写数据
磁盘的访问时间:磁盘的访问时间;旋转延迟时间;传输时间
寻道时间Ts:
把磁臂(磁头)移动到指定磁道上所经历的时间。
启动磁臂的时间k 磁头移动n条磁道所花费的时间公式Ts=m×n+k
m:常数,与磁盘驱动器的速度有关,对一般磁盘,m=0.2;对高速磁盘,m<=0.1 k:约2ms 对一般温盘,寻道时间将随寻道距离的增加而增大,大体上是5~30ms
磁盘访问时间
把指定扇区移动到磁头下所经历的时间。
硬盘:典型的旋转速度大多为5400r/min(现在大多7200),每转需11.1ms,平均旋转延迟时间Tτ= ?*1/(5400/60)sec =5.56ms
软盘:旋转速度300 r/min或600 r/min , Tτ=50~100ms
传输时间Tt
把数据从磁盘读出或向磁盘写入数据所经历的时间
Tt的大小与每次所读写的字节数b和旋转速度有关
由于在访问磁盘的时间中,主要是寻道时间,因此,磁盘调度的目标,是使磁盘的平均寻道时间最小。
先来先服务FCFS:(最简单)
根据进程请求访问磁盘的先后次序进行调度。
优点:公平、简单,每个进程的请求都能依次得到处理,不会出现某一进程的请求长期得不到满足的情况。
缺点:由于未对寻道进行优化,致使平均寻道时间可能较长。 FCFS仅适用于请求磁盘I/O的进程数目较少的场合。
最短寻道时间优先SSTF:
其要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但不保证平均寻道时间最短
SSTF的平均每次磁头移动的距离,明显低于FCFS的距离,因而SSTF比FCFS寻道性能更好
基于扫描的磁盘调度算法:
进程“饥饿”现象:SSTF寻道性能好,但可能导致某个进程发生“饥饿”现象。改进SSTF后,可防止进程出现“饥饿”现象。
SCAN算法:(电梯调度算法)
不仅考虑到欲访问的磁道与当前磁道的距离,更优先考虑的是磁头当前的移动方向。
磁臂从磁盘的一端向另一段移动,沿途响应服务请求。当到达另一端时,磁头改变移动方向,继续处理。磁头在磁盘上来回扫描。
循环扫描算法CSCAN:
CSCAN算法提供比SCAN算法更为均匀的等待时间。
磁头从磁盘一段移到另一端,随着移动不断的处理请求。不过,当磁头移到另一端时,马上返回到磁盘开始,返回时并不处理请求。
CLOOK:
磁头只移动到一个方向上最远的请求为止。接着,它马上回头,而不是继续到磁盘的尽头
NStepSCAN算法:
“磁臂粘着”现象:进程反复请求对某一磁道的I/O操作;
将磁盘请求队列分为若干个长度为N的子队列; 按FCFS算法依次处理子队列; 每个子队列使用SCAN算法。
FSCAN算法:
是N步SCAN算法的简化;
请求队列分为两个子队列: 一是当前所有请求队列,按SCAN算法调度; 二是扫描期间,新出现的请求队列,推迟到下一次扫描时处理。
本篇先介绍了I/O系统的功能、模型和接口,I/O硬件和I/O软件,磁盘调度等内容。