中断
由外部设备引起的中断,称为外中断。 由内部错误引起的中断,称为内中断,或者是陷入。例如:非法指令,地址越界,电源故障等。中断向量表
中断优先级
多中断源的处理方式
- 屏蔽中断
- 嵌套中断
- 根据优先级
- 高优先级的抢占式中断源
中断处理程序
当一个进程请求IO操作时,这个进行就挂起了,直到IO设备完成IO操作后,设备控制器向CPU发送一个中断信号,CPU响应后就转向中断处理程序,中断程序执行相应的处理,处理完后解除相应进程的阻塞状态。 中断处理程序有一下几个步骤:- 检测是否有未响应的中断信号:每当设备完成一个字符或者是一个数据块的读入或者输出,设备控制器就向CPU发送一个中断信号。请求CPU将设备读取出来的数据转存到内存缓冲区中,或者是将输出的数据传送给设备控制器。程序每当执行完当前指令后,CPU都要检测是否有未响应的中断信号。若没有,继续执行下一条指令。如果有,就停止原有进程的执行,准备转去执行中断处理程序,为把CPU的控制权交给中断处理程序做准备。
- 保护被中断进程的CPU环境:把控制权交给中断处理程序之前,需要先保护被中断的进程的CPU环境,以便后面能恢复运行。首先保存的是从中断现场恢复到当前进程运行所需要的信息。通常是由硬件自动将CPU状态子和保存在程序计数器中的下一条指令的地址保存在中断保留栈中。然后将包括所有CPU寄存器(通用寄存器、段寄存器等)内容都压入中断栈中。因为中断处理时可能会用到这些寄存器。
- 转入相应的设备处理程序:由CPU对各个中断源进行测试,以确定引起本次中断的IO设备,并向提供中断信号的设备发送确认信号。在该设备收到确认信号后,就立即取消它所发送的中断请求信号。然后,将相应的设备中断处理程序的入口地址装到程序计数器中。这样,当CPU运行时,就可以自动转向中断处理程序了。
- 中断处理:对不同的设备,有不同的中断处理程序。这样的程序首先是从设备控制器中读取出设备的状态,先判断本次中断是否能正常完成,还是异常结束中断。如果是正常的完成中断,中断程序就可以做结束处理了。假设是一次字符设备的读取操作,则来自输入设备的中断是表明该设备已经读入了一个字符数据了,并将它放到了数据寄存器中。此时中断处理是将该数据传送到CPU,再将它存入缓冲区中,并修改缓冲区对应的指针,让指针指向一下个内存单元。如果还有命令,可以再向控制器发送新的命令,进行新一轮的数据传送。如果是异常中断,就需要根据发生的异常的原因做相应的处理。
- 恢复CPU现场并退出中断。当中断处理完成后,需要恢复CPU现场。退出中断。但是,这时候是否能返回到被中断的进程,取决于以下两种因素:
- 本中断是否采用了屏蔽中断,如果是,就会返回被中断的进程
- 采用的是嵌套的中断方式,如果没有更高优先级的中断IO请求,在中断完成后就会返回被中断的进程;如果有更高优先级的IO中断,就要继续处理更高优先级的中断。
设备驱动程序
它是为了实现IO系统高层和设备控制器之间的通信,在中间做的一层代理和适配,将上层发送的简单的指令翻译成设备控制器需要的具体的、复杂的命令。给上层的感觉是只需要使用简单明了的命令,就能实现复杂的逻辑。设备驱动程序的功能
- 接受与设备无关的软件发送过来的命令和参数,并将命令中的抽象要求转换成和设备有关的底层的操作序列。
- 检查用户的IO请求的合法性,了解IO设备的状态,传递相关参数,设置设备的工作方式。
- 发出IO命令,如果空闲,就启动IO设备,完成指定的操作。如果设备忙碌,就将请求挂到设备的队列上等候
- 及时响应由设备控制器发来的中断请求,并根据它的中断类型,调用相应的中断处理程序进行处理。
设备驱动程序的特点
- 驱动程序实现了和设备无关的软件,它是和设备控制器之间通信和转换的程序。
- 驱动程序和设备控制器以及IO设备的硬件特性相关,对于不同类型的设备,应配置不同的驱动程序。可以为相同的多个中断设置一个终端驱动程序。
- 驱动程序和IO设备采用的IO控制方式紧密相关,通常是中断驱动和DMA方式
- 由于驱动程序与硬件紧密相关,所以其中一部分必须用汇编语言来写。目前很多驱动程序基本都是固化在ROM中
- 驱动程序允许可重入。一个正在运行的驱动程序经常会调用一个完成以后又调用一次。
设备处理方式
不同的操作系统,使用的设备处理方式也不一样。根据设备处理时,是否设置进程,以及设置了什么样的进程,可以分为三类:- 为每一类设备设置一个进程,专门用来执行这类设备的IO操作。比如为同一个类型的打印机设置一个打印的进程。这种方式适合使用大的系统
- 在整个系统中设置一个IO进程,也可以设置一个输入进程和一个输出进程,分别处理系统的输入和输出的
- 不设置专门的设备处理进程,只为各类设备相应的设备设置相应的设备驱动程序,供用户或者系统调用。目前微小型机器都是使用这种方式的。
设备驱动程序的处理过程
驱动程序的主要任务是启动指定的设备,完成上层指定的IO工作。但,在启动之前必须先确定设备的忙闲等准备工作,之后才会向设备控制器发送一个启动命令。 设备驱动程序处理过程如下:- 将抽象的要求转换成具体的要求:通常是在每一个设备控制器中都含有若干个寄存器,分别用于存储命令、参数和数据的等。因为上层发送的都是抽象命令。
- 对服务请求进行校验:检查上层用户发来的命令是否是设备能执行的。比如,向打印机设备读取数据这是一个典型的错误。一上来在软件层面就能发现的错误类型。
- 检查设备状态:通常在每一个设备控制器中都有状态寄存器。驱动程序在启动设备之前,要先吧状态寄存器中的内容读入到CPU的某一个寄存器中。通过不同的位标记设备的状态。这个状态位,不只是表示忙闲的状态,还有已经读取完成,读取就绪,写入就绪,写入完成等状态。
- 传递必要的参数:在确定设备处于接收(发送)就绪状态后,便可以向控制器的相应的寄存器传输数据和控制本次数据传输有关的参数。
- 启动设备:有了前面的准备工作,然后就可以向设备控制器中的命令寄存器传送相应的控制命令。最终都是通过状态寄存器来确认是否完成了操作,是否能进行下一步操作了。
IO设备的控制方法
轮训的编程方式
cpu向控制器发出一条IO指令,启动输入设备输入数据时,同时把状态寄存器中的忙闲状态值为1,然后就不断的轮训检查状态寄存器。当busy =1表示输入设备还没有完成一个字符输入,不断循环去检查这个状态。直到busy = 0 表示已经输入了一个字符到控制器的数据寄存器中了。于是cpu就将寄存器中的数据取出来,送到内存单元,这样就完成了一个字符的输入读取。然后继续去读取第二个字符。 这个中方式,cpu大部分时间都是轮训检查状态寄存器中的是否已经完成了一个字符的输入,完了后还要从控制器中的数据寄存器中取出数据,放到内存中。整个过程cpu都一直参与,做无用功的轮训操作。还要主动吧设备控制器中的数据读取出来,存入内存中。效率极低。可中断的编程方式
这是广泛使用的IO设备控制方式。当某一个进程要启动某个Io设备工作时,由CPU向相应的设备控制器发送一个IO命令,然后就立即返回继续执行原来的任务。设备控制器紧接着按照该命令的要求去控制指定的IO设备。此时,CPU与IO是并行执行的。比如输入时,当设备控制器接收到CPU发送来的读取命令后,就去控制相应的输入设备读取数据。一旦数据进入数据寄存器,控制器就可以通过控制线向CPU发送一个中断信号,由CPU检查输入过程中是否有错。在没有错误的情况下,CPU就向控制器发送取走数据的信号,然后通过控制器和数据线,将数据写入内存指定的单元中。 在设备输入每个数据的过程中,可使CPU与IO设备并行工作。仅当输完一个数据时,才需要CPU花费极短的时间去做中断处理。这样就可以使CPU和IO设备都处于忙碌状态,从而提高了整个系统的资源利用率和吞吐量。 比如:从终端输入一个字符的时间是100ms,而将字符送入缓冲区的时间小于0.1ms。如果采用程序IO方式,CPU约有99.9ms的时间都是忙等状态。但是采用了中断驱动方式后,CPU可利用这99.9的时间去做其他的事情,而仅用0.1ms的时间来处理有控制器发来的中断请求。 由此可见,中断这种方式将CPU的利用率提高了百倍。直接存储器访问方式(DMA方式)
虽然中断驱动方式已经提高了不少,但是它是以字节为单位进行IO操作的。每当完成一个字节的IO时,控制器就需要向CPU发送一个中断的信号。所以,CPU是以字节为单位干预的。这种对于那种字符设备还行,但是对于快设备是低效的。 比如,从磁盘中读取1kB的数据块,需要中断1k次CPU。直接存储器方式就是解决这种问题的。- 数据传输的基本单位是数据块:CPu和IO设备之间的,每次传送的至少一个数据块。
- 所传输的数据是直接从设备到内存的,或者是从内存到设备的
- 仅在传送一个或多个数据块的开始和结束时,才需要CPU干预。整块数据的传输是在控制器的控制下完成的。所以,DMA方式又进一步提高了CPU和IO设备并行的操作程度。
DMA控制器的组成
组成部分:主机与DMA控制器的接口、DMA控制器和设备的接口、IO控制逻辑; DMA控制器中包含的四种寄存器:- 命令、状态寄存器CR,用于接收从CPU发来的IO命令,或有关控制信息,或设备状态
- 内存地址寄存器MAR,在输入时,它存放把数据从设备传送到内存的起始目标地址,在输出时,它存放由内存到设备的内存源地址。
- 数据寄存器DR:用于暂存从设备到内存,或从内存到设备的数据
- 数据计数器DC:存放本次CPU要读或写的字数
DMA工作过程
当cpu要从磁盘中读取一个数据块,就向磁盘控制器发送一个读命令,该命令被送到命令寄存器CR中。 同时,需要将本次要读入数据在内存的起始目标地址,放到内存地址寄存器MAR中。 将要读取数据的字数送到数据计数器DC中。 还要将磁盘中的源地址直接送到DMA控制器中的IO控制逻辑上。 然后,启动DMA控制器进行控制。 当DMA控制器已经从磁盘中读入一个字的数据,并送入数据寄存器DR,再挪用一个存储器周期,将该字传送到MAR锁指定的内存单元中。同时,将MAR地址+1,将DC数-1。 如果-1后的DC内容不为0,表示还没有传送完,会继续传送下一个字。 否则,由DMA控制器发出中断请求。然后CPU响应中断,到此完成IO通道控制方式
虽然DMA方式已经解决了传送是以数据块为单位的,但是,cpu每发送一个指令,也只能去读取一个连续的块。如果,遇到一次去读取多个数据块且将他们分别传送到不同的内存区域,或者相反时,就必须让CPU发送多条IO指令并进行多次中断处理才能完成。 而IO通道方式可以进一步减少CPU的干预,把对一个数据块的读写为单位的干预,减少为对一组数据块的读写有关的控制 和管理为单位的干预。同时,又可实现CPU、通道和IO设备三者的并行操作,提高了资源的利用率。 例如:当cpu要完成一组相关的读写操作和有关控制的时候,只要想IO通道发送一条IO指令,并给出要执行的通道程序在内存的首地址和要访问的IO设备,通道接收到该指令后,通过执行通道程序就可以完成CPU给出的任务。通道程序
通道是通过执行通道程序并与设备控制器共同实现对IO设备的控制。通道程序又一系列通道指令构成。通道指令与一般的机器指令不同,在它的每条指令中都包含以下信息:- 操作码:它规定了操作是读操作,还是写操作,还是控制操作
- 内存地址:标明字符送到内存或者是从内存取走的时的首地址
- 计数:表示本条指令所要读写的数据字节数
- 通道程序结束位P:表示通道程序是否结束。P=1 表示本条指令是通道程序的最后一条指令
- 记录结束标识位R: R=0 表示本通道指令与下一条指令所处理的数据是同属于一个记录。R=1 表示这是处理某记录的最后一条指令了。
与设备无关的IO软件
增加这一层设备无关IO软件,是为了实现设备的独立性,也称为是设备无关性。 应用程序中用到的设备,不局限使用某一个具体的物理设备。为每一个设备所配置的设备驱动程序是与硬件紧密相关的。为了实现设备独立性,必须在设备驱动程序之上再设置一层软件,就是与设备无关的IO软件。以物理设备名使用设备
指定物理设备名会有一个问题,加入大家都指定使用打印机A,那么这些应用程序都会阻塞在这里,但实际上,打印机B和C都是空闲着的。这样就浪费了资源。所以引入了逻辑设备名逻辑设备名
解决上面问题,就是加一个抽象的逻辑设备名。就叫打印机。大家要使用打印架,只要其中一个是空闲的,那么就可以使用。除非是所有的打印机都是使用中,这个时候应用程序还会阻塞。这样就提高了资源的利用率,也提高的并行处理的速度。逻辑设备名到物理设备名的转换
解:
公有操作
与设备无关的软件是IO系统中最高层的软件了。在它下面的设备驱动程序,其间的界限,因操作系统和设备的不同而有所差异。但是,都有的操作包含如下:- 设备驱动程序的统一接口
- 缓冲管理
- 差错控制
- 暂时性错误:比如因为电源波动,或者网络传输等暂时性错误,可以通过重新来解决。
- 永久性错误:比如磁盘上少数的盘块遭到破坏而失效,只需要将坏盘块记录下来,放到一个坏盘块表中,以后不在使用即可。就不用换磁盘。
- 对独立设备的分配和回收
- 独立于设备的逻辑数据块
设备分配
设备分配中的数据结构
主要依赖于设备控制表DCT- 设备类型:type
- 设备标识符:devicedid
- 设备状态:等待/不等待 忙
- 指向控制器表的指针:凡是因为请求本设备没有到得到满足的进程,都要在这里排队
- 重复执行次数或时间:重试上限,如果超过上限还不成功,就认为是失败了
- 设备队列的队首指针:
控制器控制表COCT
通道控制表CHCT
系统设备表SDT
设备分配考虑因素
- 设备的固有属性
- 独占属性:
- 共享设备
- 虚拟设备
- 设备分配算法
- 优先级
- 先来先服务
- 分配安全
- 安全分配方式:一旦进程已获取某种设备后便阻塞,不能请求任何资源,而阻塞时又不保持任何资源。
- 不安全分配方式
用户层的IO软件
系统调用
spooling技术
组成部分- 输入井和输出井
- 输入缓冲区和输出缓冲区
- 输入进程和输出进程
- 井管理程序
- 将独占设改成成了共享设备:比如打印机
- 实现了虚拟设备功能
缓冲区管理
特点:- 解决cpu和设备速度不匹配问题
- 减少对cpu中断频率
- 解决数据粒度不一样问题
- 提高CPU和设备之间的并行
- 单缓冲
- 双缓冲
- 环境缓冲
- 缓冲池