操作系统原理第10章 输入-输出原理.ppt

10.2.3 中断驱动I/O 现在我们考虑在不缓冲字符而是在每个字符到来时便打印的打印机上进行打印的情形。如果打印机每秒可以打印100个字符,那么打印每个字符将花费10ms。这意味着,当每个字符写到打印机的数据寄存器中之后,CPU将有10ms搁置在无价值的循环中,等待允许输出下一个字符。这10ms时间足以进行上下文切换并且运行其他进程,否则就浪费了。 10.2.3 中断驱动I/O 这种允许CPU在等待打印机变为就绪的同时做某些其他事情的方式就是使用中断。当打印字符串的调用被发出时,如我们前面所介绍的,字符串缓冲区被复制到内核空间,并且一旦打印机准备好接收一个字符时就将第一个字符复制到打印机中。这时,CPU要调用调度程序,并且某个其他进程将运行。打印字符串的进程将被阻塞,直到整个字符串打印完。 10.2.3 中断驱动I/O 当打印机将字符打印完并且准备好接收下一个字符时,它将产生一个中断。这一中断将停止当前进程并且保存其状态。然后,打印机中断服务过程将运行。如果没有更多的字符要打印,中断处理程序将采取某个操作将用户进程解除阻塞。否则,它将输出下一个字符,响应中断,并且返回到中断之前正在运行的进程,该进程将从其停止的地方继续运行。 10.2.4 使用DMA的I/O 中断驱动I/O的一个明显缺点是中断发生在每个字符上。中断要花费时间,所以这一方法将浪费一定数量的CPU时间。这一问题的一种解决方法是使用DMA。此处的思路是让DMA控制器一次给打印机提供一个字符,而不必打扰CPU。本质上,DMA是程序控制I/O,只是由DMA控制器而不是主CPU做全部工作。这一策略需要特殊的硬件(DMA控制器),但是使CPU获得自由从而可以在I/O期间做其他工作。 10.2.4 使用DMA的I/O DMA重大的成功是将中断的次数从打印每个字符一次减少到打印每个缓冲区一次。如果有许多字符并且中断十分缓慢,那么采用DMA可能是重要的改进。另一方面,DMA控制器通常比主CPU要慢很多。如果DMA控制器不能以全速驱动设备,或者CPU在等待DMA中断的同时没有其他事情要做,那么采用中断驱动I/O甚至采用程序控制I/O也许更好。 10.3 I/O软件层次 I/O软件通常组织成四个层次,如图10-5所示。每一层具有一个要执行的定义明确的功能和一个定义明确的与邻近层次的接口。功能与接口随系统的不同而不同,所以下面的讨论并不针对一种特定的机器。 图10-5 I/O软件系统的层次 10.3.1 中断处理程序 虽然程序控制I/O偶尔是有益的,但是对于大多数I/O而言,还是应当将其隐藏在操作系统内部,使系统的其他部分尽量不与它发生联系。隐藏它们的最好办法是将启动I/O操作的驱动程序阻塞起来,直到I/O操作完成且产生一个中断。驱动程序阻塞自己的手段有:在一个信号量上执行down操作、在一个条件变量上执行wait操作、在一个消息上执行receive操作或者某些类似的操作。 10.3.1 中断处理程序 当中断发生时,中断处理程序着手对中断进行处理,然后将启动中断的驱动程序解除阻塞。在一些情形中,它只是在一个信号量上执行up操作;其他情形中,是对管程中的条件变量执行signal操作;还有一些情形中,是向被阻塞的驱动程序发一个消息。在所有这些情形中,中断最终的结果是使先前被阻塞的驱动程序现在能够继续运行。如果驱动程序构造为内核进程,具有它们自己的状态、堆栈和程序计数器,那么这一模型运转得最好。 10.3.1 中断处理程序 当然,现实情况没有这么简单。对操作系统而言,还涉及更多的工作。下面是一系列硬件中断完成之后必须在软件中执行的操作步骤。应该注意的是,细节依赖于系统,某些步骤在一个特定的机器上可能是不必要的,某些步骤在某些机器上也可能有不同的顺序。 1)保存没有被中断硬件保存的所有寄存器(包括PSW)。 2)为中断服务过程设置上下文,可能包括设置TLB、MMU和页表。 3)为中断服务过程设置堆栈。 10.3.1 中断处理程序 4)应答中断控制器,如果不存在集中的中断控制器,则再次开放中断。 5)将寄存器从它们被保存的地方(可能是某个堆栈)复制到进程表中。 6)运行中断服务过程,从发出中断的设备控制器的寄存器中提取信息。 7)选择下一次运行哪个进程,如果中断导致某个被阻塞的高优先级进程变为就绪,则可能选择它现在就运行。 8)为下一次要运行的进程设置MMU上下文,也许还需要设置某个TLB。 10.3.1 中断处理程序 9)装入新进程的寄存器,包括其PSW。 10)开始运行新进程。 由此可见,中断处理要花费相当多的CPU指令,特别是在有虚拟内存并且必须设置页表或者必须保存MMU状态(例如R和M位)的机器上。在某些机器上,当在用户态与核心态之间切换时,可能还需要管理TLB

文档评论(0)

1亿VIP精品文档

相关文档