背景
I/O系统是OS的重要组成部分,用于管理诸如打印机和扫描仪等I/O设备,以及用于存储数据,如磁盘驱动器和磁带机等各种存储设备。由于I/O系统所含设备种类繁多,差异非常大,致使I/O系统成为操作系统中最繁杂且与硬件最紧密相关的部分。
一、I/O系统的功能、模型和接口
I/O系统的功能
- 隐藏物理设备的细节:I/O设备的类型非常多,且彼此间在多方面都有差异,如接受和生产速度,I/O系统必须通过对设备加以适当的抽象,以隐藏掉物理设备的实现细节,仅向上层进程提供少量的、抽象的读写命令,如read、write等。
- 与设备的无关性: 这是在1的基础上实现的,一方面用户可以使用抽象的逻辑设备名来使用设备,另一方面也可以提高OS的可移植性和易适用性。
- 提高处理机和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现场,然后转入相应的设备的中断处理程序进行处理,在处理完成后,又恢复被中断进程的CPU环境,返回断点继续进行。
-
设备驱动程序:他处于次底层,是进程和设备控制器之间的通信程序,其主要功能是,将上层发来的抽象I/O请求转化为对I/O设备的具体的命令和参数,并把它装入到设备控制器中的命令和参数寄存器中,或者相反。每当在系统中增加一个设备时,都需要由安装厂商提供新的驱动程序。
I/O系统接口
- 块设备接口: 快设备、隐藏了磁盘的二维结构(磁道号和扇区号)、将抽象命令映射为底层操作
- 流设备接口:又称为字符设备接口,大多数流设备属于独占设备,必须采用互斥方式实现共享,为此,流设备接口提供打开和关闭操作,在使用是要判断是否被其他进程使用。
- 网络通信接口
二、I/O设备和设备控制器
I/O设备一般由执行I/O操作的机械部分和执行控制I/O的电子部件组成。
I/O设备
- 类型:按使用特性分为存储设备(外存、辅存,存取速度较内存慢,但容量大,价格也便宜)和I/O设备(输入输出设备,如鼠标、键盘、打印机,用与同步显示用户命令及命令执行输入);按传输速率分低速设备(鼠标、键盘)、中速设备(打印机、激光打印机)和高速设备(磁带机、光盘机)
- 设备与控制器之间的接口:通常,设备并不是直接和CPU通信,而是与设备控制器通信,因此I/O设备中应含有与设备控制器间的接口,接口对应有信号,分别是数据信号线、控制信号线和状态信号线
设备控制器
主要用来控制一个或者多个I/O设备,以实现I/O设备和计算机之间的数据交换,他是cpu和I/O设备之间的接口,接受从cpu发来的命令,去控制I/O设备工作,使cpu从繁杂的设备控制事务中解脱出来。
- 基本功能:接受和识别命令,如cpu发来的read、write、format等;数据交换;标识和报告设备的状态;地址识别;数据缓存区;差错控制
- 组成:与处理机的接口、与设备的接口、I/O逻辑
内存映像I/O
驱动程序将抽象的I/O命令转换出的一些列具体的命令、参数等数据装入设备控制器的相应寄存器,由控制器来执行这些命令,具体实施对I/O设备的控制。这一工作可用如下两种方式完成
- 利用特定的I/O指令:缺点是访问内存和访问设备需要两种不同的指令
- 内存映像:统一了对内存和对控制器的访问方法,这无疑将简化I/O的编程
I/O通道
虽然在cpu和I/O设备之间加了设备控制器,已经能大大减少cpu对I/O的干预,但当主机配置的外设很多时,cpu的负担仍然很重,为此引入了I/O通道
- 目的:建立独立的I/O操作,不仅数据的传送能独立于cpu,而且希望有关对I/O操作的组织、管理及其结束处理尽量独立。转而有通道来承担。
- 流程:在设置了通道后,cpu只需要向通道发送I/O指令,通道在接受到指令后,执行,仅当完成了I/O任务后,才向cpu发送中断信号。
- I/O通道是一种特殊的处理机,只不过没有自己的内存和指令比较单一
- 类型:字节多路通道、数组多路通道、数组选择通道
- 问题:由于通道接个昂贵,致使在系统中数量较少,这往往成为I/O瓶颈。
- 解决办法:增加设备到主机间的通路而不是通道,即把一个设备连接到多个控制器上,而一个控制器又连接到多个通道上。这样不仅解决了‘瓶颈’问题,而且还提高了系统的可靠性,因为个别通道或控制器的故障不会使设备和存储器之间没有通路。
三、中断机构和中断处理程序
没有中断就不可能实现多道程序,因为进程之间的切换就是通过中断来完成的。另一方面,中断也是设备管理的基础,为了提高处理机的利用率和实现cpu和I/O设备并行执行,也必须中断的支持。
中断简介
- 中断:是指cpu对I/O设备发来的中断信号的响应,cpu暂停正在执行的程序,保留环境,转去执行该I/O设备的中断处理程序,完成后,再返回断点,继续。由于是外部设备引起的,又称为外中断。
- 陷入:由cpu内部事件引起的中断,如非法指令、地址越界和电源故障等。成为内中断或陷入trap。
- 中断向量表:通常每种设备又对应的中断处理程序,并把程序的入口地址放在向量表的一个表项中。
- 中断优先级:系统会为各种中断分别规定不同的优先级
- 处理方式:屏蔽中断(处理中断时,不会对新中断处理,排队执行,缺点:不能用于实时性要求较高的中断请求)和嵌套中断(可以根据优先级执行,即高的可以抢占低的)
中断处理程序
当一个进程请求I/O操作时,该进程将被挂起,直到I/O设备完成I/O操作后,设备控制器便向cpu发出中断请求,cpu响应后便转向中断处理程序,中断处理程序执行完后,解除进程的阻塞状态。
中断处理程序的步骤
- 测定是否有未响应的中断信号
- 保护被中断进程的cpu环境
- 转入相应的设备处理程序
- 中断处理
- 恢复cpu的现场并退出中断(是否能返回到被中断的进程取决于本次中断处理方式)
四、设备驱动程序
五、与设备无关的I/O软件
基本概念
- 以物理设备名使用设备
- 引入了逻辑设备名
- 两者的转换
与设备无关的软件
- 设备驱动程序的统一接口
- 缓存管理
- 差错控制
- 对独立设备的分配和回收:对于独占设备,为避免进程间对它的争夺,必须由系统来统一分配。
- 独立与设备的逻辑数据块
设备分配
为实现对系统独占设备的分配,必须在系统中配置相应的数据结构。
- 设备分配的数据结构:设备控制表DCT、通道控制表和系统控制表
- 设备分配应考虑的因素:固有属性、分配算法、安全性
- 独占设备的分配程序
逻辑设备名和物理设备名的转换
- 逻辑设备表LUT
- 逻辑设备表设置问题:第一种,在单用户系统中,只设置一张;第二种方式,多用户系统中,每一个用户设置一张。
六、用户层的I/O软件
一般而言,大部分的I/O软件都放在操作系统的内部,但仍有一小部分在用户层,其中包括与用户程序连接在一起的库函数,以至于完全运行于内核之外的假脱机系统等。
系统调用与库函数
- 系统调用:当应用进程需要执行某种I/O操作时,在应用进程中必须要使用到系统调用,当os捕获到,便将cpu的状态用用户态转入到核心态,然后转向操作系统中相应过程,有该过程完成I/O操作,执行完后,系统将cpu从核心态转入到用户态,返回用户应用程序执行。
- 库函数:内核提供了OS的基本功能,库函数扩展了OS内核,使用户能够方便取得操作系统的服务。
假脱机(Spooling)
如果说,通过多道程序技术可以将一台物理cpu虚拟为多台逻辑的cpu,从而实现多个用户共享一台主机,那么通过假脱机技术,则可以将物理I/O设备虚拟为多台逻辑I/O设备,这样就允许多个用户共享一台物理设备。
- 为了缓和cpu的高速性与I/O设备低速性间的矛盾,而引入了脱机输入、脱机输出技术,该技术利用专门的外围控制机,先将低速I/O设备上的数据传送到高速磁盘上,或者相反,事实上,当系统中引入了多道程序后,完全可以利用其中的一道程序,来模拟脱机输入时的外围控制机,把低速I/O设备上的数据传送到高速磁盘上,再用另外一道程序模拟脱机输出时外围控制机的功能,我们把这种在联机情况下实现的同时外围操作的技术称为SPOOLing
- SPOOLing系统的组成:输入井和输出井、输入缓存区和输出缓存区、输入进程和输出进程、井管理程序
- 特点:提高了I/O的速度;将独占设备改造为共享设备;实现了虚拟设备功能
- 假脱机打印机系统
- 守护进程:凡是需要将独占设备改造为可供多个进程共享的设备时,都要为该设备配置一个守护进程和一个假脱机文件队列(目录),同样,守护进程是允许使用该独占设备的唯一进程,所有其他进程都不能直接使用该设备,只能将对该设备的使用要求写入一份文件中,放在假脱机目录中。由守护进程按照目录中的文件依次来完成诸进程对该设备的请求,这样就把一台独占设备改造为多个进程共享的设备。
七、缓存区管理
缓存区是一个存储区域,他可以由专门的硬件寄存器组成,但成本昂贵,在一般情况下,更多的是利用内存来作为缓冲区,以下内容也是后者,缓存区管理主要功能是组织好这些缓冲区,并提供获得和释放缓冲区的手段。
引入
- 缓和cpu和I/O间速度不匹配的矛盾
- 减少对cpu的中断频率,放宽对cpu中断响应时间的限制
- 解决数据粒度不匹配的问题
- 提高cpu和I/O设备之间的并行性
单缓冲区和双缓冲区
- 单缓冲区:如果在消费者和生产者之间未设置任何缓冲,那么就会互相限制,如生产者完成了数据的生产但是消费者无法接受,那么生产者者就必须等待,直到消费者就绪,如果设置了单缓冲区,生产者就无需等待,直接把数据输入到缓冲区即可。
- 双缓冲区:由于缓冲区是共享资源,生产者与消费者在使用缓冲区时必须互斥,如果消费者尚未取走缓冲区中的数据,即使生产者生产出新的数据,也无法将它送入缓冲区,这时也会等待。如果设置两个缓冲区,便能解决这个问题。这种机制也称为缓冲对换,即在设备输入时,先将数据输入第一缓存区,装满后便转向第二缓冲区,此时操作系统可以从第一缓冲区中取数据。
环形缓存区
当输入与输出的速度基本相匹配时,采用双缓冲能获得较好的效果,可使生产者和消费者基本上能并行操作。但若两者的速度相差甚远,就可以多缓冲区,如环形缓冲区。
缓冲池
缓冲池和缓冲区的区别在于:缓存区仅仅是在一组内存块的链表,而缓冲池则是包含了一个管理的数据结构及一组操作函数的管理机制,用于管理多个缓冲区。
- 缓冲池的组成:空白缓冲队列emq、输入队列inq、输出队列outq
- getbuf过程和putbuf过程:需要加上互斥信号量MS和资源信号量
- 缓存区的工作方式
八、磁盘存储器的性能和调度
磁盘I/O速度的高低和磁盘系统的可靠性,将直接影响系统的性能,可以通过多种途径来改善磁盘系统的性能。首先可以选择好的磁盘调度算法,以减少磁盘的寻道地址;其次是提高磁盘I/O速度,以提高对文件的访问速度;第三可以采取冗余技术,提高磁盘系统的可靠性。其中第二和第三在磁盘存储器管理中介绍
磁盘性能简述
- 数据的组织和格式
- 磁盘的类型
- 磁盘的访问时间
早期的调度算法
- FCFS:先来先服务
- SSTF:最短寻道时间优先
基于扫描的磁盘调度算法
- SCAN:扫描算法
- CSCAN:循环扫描算法
- NStepSCAN 算法
- FSCAN 算法