中断在操作系统中有特殊而重要的地位,没有它就不可能实现多道程序,进程之间的切换就是通过中断来完成的。
中断是 I/O 系统最低的一层,也是设备管理的基础。
中断源:引起中断发生的事件
中断请求:中断源向 CPU 发出的请求中断处理信号
中断响应:CPU 收到中断请求后转到相应的事件处理程序的过程
关中断/开中断:CPU 内部的 PSW 的中断允许位被清除/被设置,不允许/允许 CPU 响应中断。用于保证某段程序执行的原子性
中断屏蔽:在中断请求产生后,系统有选择地封锁一部分中断而允许另一部分仍能得到响应。有些具有最高优先级的中断不允许被屏蔽。
根据信号的来源不同,中断分为外中断和内中断。
外中断,一般简称中断,是指 CPU 对 I/O 设备发来的中断信号的一种响应。CPU 保护暂停当前进程,转而去处理引发中断的进程。执行完后,再返回到原进程,继续执行。
I/O 设备可以是字符设备(键盘),块设备(磁盘)或通信设备(网络)等。由于中断是外部造成的,所以又叫外中断。
内中断,有些教材又称作为陷阱,陷入是由 CPU 进程内部事件引发的中断,因此叫陷入或内中断。其产生的原因往往是由于进程本身出现运行时异常。如运算中发生了溢出,或者程序出错,如非法指令。
由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU 自动形成等)
中断向量表,就是中断类型号与相应中断源的中断处理程序入口地址之间的连接表。
80x86 系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
对于多中断源的处理方式,比如,当处理机正在处理键盘引起的终端,此时又收到了高优先级的磁盘中断,应该如何处理?
一种方式是屏蔽中断,或者叫禁止中断。对于新的中断。中断处理来的中断,在当前中断未完成之前,对于其他中断不予理睬,直到当前处理完。采用先来先服务的方式。
第二种方式是嵌套中断,就是中断程序也是进程,当更高优先级的中断处理程序到来时,可以剥夺当前中断处理进程的处理机,即中断的中断。
由于中断处理与硬件紧密相关,对用户及用户程序而言,应该尽量加以屏蔽,故应该放在操作系统的底层进行中断处理,系统的其余部分尽可能少地与之发生联系。
当一个进程请求 I/O 操作时,该进程将被挂起,直到 I/O 设备完成 I/O 操作后,设备控制器便向 CPU 发送一中断请求,
CPU 响应后便转向中断处理程序,中断处理程序执行相应的处理,处理完后解除相应进程的阻塞状态。
因此,中断处理层的主要工作就是这三个方面:
对于为每一类设备设置一个 I/O 进程的设备处理方式,其中断处理程序的处理过程分成以下几个步骤
前面已经对设备驱动程序的功能、特点进行了讲解。
对设备的处理方式,一般分为三类:
随着计算机技术的发展,I/O 控制方式也在不断地发展。
在 I/O 控制方式的整个发展过程中,始终贯穿着这样一条宗旨,即尽量减少主机对 I/O 控制的干预,把主机从繁杂的 I/O 控制事务中解脱出来,以便更多地去完成数据处理任务。
早期的计算机系统中,由于无中断机构,处理机对 I/O 设备的控制采取程序 I/O(Programmed I/O)方式,或称为忙等待方式,
处理机向控制器发出一条 I/O 指令启动输入设备输入数据时,同时把 busy 置为 1,再不断循环测试 busy。
Busy=0,完成输入,处理机读取数据,送入指定单元,完成一次 I/O。
对状态寄存器中的忙/闲标志 busy 的检查实现控制
在程序 I/O 方式中,由于 CPU 的高速性和 I/O 设备的低速性,致使 CPU 的绝大部分时间都处于等待 I/O 设备完成数据 I/O 的循环测试中,
造成对 CPU 的极大浪费。在该方式中,CPU 之所以要不断地测试 I/O 设备的状态,就是因为在 CPU 中无中断机构,
使 I/O 设备无法向 CPU 报告它已完成了一个字符的输入操作。
现代计算机系统中,都毫无例外地引入了中断机构,致使对 I/O 设备的控制,广泛采用中断驱动(Interrupt Driven)方式,
即当某进程要启动某个 I/O 设备工作时,便由 CPU 向相应的设备控制器发出一条 I/O 命令,然后立即返回继续执行原来的任务。
设备控制器于是按照该命令的要求去控制指定 I/O 设备。此时,CPU 与 I/O 设备并行操作。
在输入时,当设备控制器收到 CPU 发来的读命令后,便去控制相应的输入设备读数据。
一旦数据进入数据寄存器,控制器便通过控制线向 CPU 发送一中断信号,由 CPU 检查输入过程中是否出错,
若无错,便向控制器发送取走数据的信号,然后再通过控制器及数据线将数据写入内存指定单元中。
在 I/O 设备输入每个数据的过程中,由于无需 CPU 干预,因而可使 CPU 与 I/O 设备并行工作。
仅当输完一个数据时,才需 CPU 花费极短的时间去做些中断处理。可见,这样可使 CPU 和 I/O 设备都处于忙碌状态,从而提高了整个系统的资源利用率及吞吐量。
虽然中断驱动 I/O 比程序 I/O 方式更有效,但须注意,它仍是以字(节)为单位进行 I/O 的,每当完成一个字(节)的 I/O 时,控制器便要向 CPU 请求一次中断。
换言之,采用中断驱动 I/O 方式时的 CPU 是以字(节)为单位进行干预的。如果将这种方式用于块设备的 I/O,显然是极其低效的。
例如,为了从磁盘中读出 1 KB 的数据块,需要中断 CPU 1K 次。为了进一步减少 CPU 对 I/O 的干预而引入了直接存储器访问方式。
如果 I/O 设备能直接与主存交换数据而不占用 CPU,CPU 的利用率还可提高,这就出现了直接存储器访问(DMA)方式。
DMA 控制方式的特点:
优点: CPU 利用率进一步提高(并行度有所提高)
缺点: 数据传送方向、字节数、内存地址等需由 CPU 控制,且每一设备需一台 DMA 控制器,设备增多时,不经济。
DMA 方式较之中断驱动方式,又是成百倍地减少了 CPU 对 I/O 的干预,进一步提高了 CPU 与 I/O 设备的并行操作程度。
为了获得 CPU 和外围设备间更高的并行工作能力,也为了让种类繁多,物理特性不同的外围设备能以标准的接口连接到系统中,计算机系统引入了自成独立体系的通道结构。
I/O 通道方式是 DMA 方式的发展,它可进一步减少 CPU 的干预,即把对一个数据块的读(或写)为单位的干预,
减少为对一组数据块的读(或写)及有关的控制和管理为单位的干预。
由通道管理和控制 I/O 操作,减少了外围设备和 CPU 的逻辑联系,把 CPU 从琐碎的 I/O 操作中解放出来。
可实现 CPU、通道和 I/O 设备三者的并行操作,从而更有效地提高整个系统的资源利用率。
设备独立性是指操作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样,操纵、使用这些设备,而不必知道它们的具体存在形式。其基本含义是: 应用程序独立于具体使用的物理设备。
实现设备独立性后,可带来两方面的好处。
如何实现设备独立性
为了实现设备的独立性,应引入逻辑设备和物理设备两个概念。在应用程序中,使用逻辑设备名称来请求使用某类设备;而系统执行时,是使用物理设备名称。鉴于驱动程序是一个与硬件(或设备)紧密相关的软件,必须在驱动程序上设置一层软件,称为设备独立性软件,以执行所有设备的公有操作、完成逻辑设备名到物理设备名的转换(为此应设置一张逻辑设备表)并向用户层(或文件层)软件提供统一接口,从而实现设备的独立性
设备独立性软件
前面我们已经学习过,I/O 系统是层次化管理的。操作系统设备管理的总体结构,目前最常见的是划分为设备硬件无关层和设备硬件相关层,两个层次。
无关层与相关层划分的思想依据主要在于可移植性和可扩充性。
驱动程序是一个与硬件(或设备)紧密相关的软件。为了实现设备独立性,必须再在驱动程序之上设置一层软件,称为设备独立性软件。
至于设备独立性软件和设备驱动程序之间的界限,根据不同的操作系统和设备有所差异,主要取决于操作系统、设备独立性和设备驱动程序的运行效率等多方面因素的权衡,
因为对于一些本应由设备独立性软件实现的功能,可能由于效率等诸多因素,实际上设计在设备驱动程序中。
设备独立性软件的主要功能可分为以下两个方面:
根据设备的使用性质
针对三种设备采用三种分配技术
缓冲区是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。
使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)
一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区
磁盘存储器是计算机系统中的最重要的存储设备,在其中存放了大量的文件。现代计算机系统中,都配置了磁盘存储器,并以它为主来存放文件。
对文件的读、写操作都将涉及到对磁盘的访问。磁盘 IO 速度的高低和磁盘系统的可靠性,将直接影响到系统的性能。
设法改善磁盘系统的性能,已成为现代操作系统的重要任务之一 。
高磁盘 I/O 速度的主要途径:
硬盘有机械硬盘(HDD)和固态硬盘(SSD)之分。这里只讲解机械硬盘。
机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成。
磁盘设备可包括一或多个物理盘片,每个磁盘片分一个或两个存储面(surface),每个磁盘面被组织成若干个同心环,这种环称为磁道(track),各磁道之间留有必要的间隙。
每条磁道又被逻辑上划分成若干个扇区(sectors),软盘大约为 8 ~ 32 个扇区,硬盘则可多达数百个。一个扇区称为一个盘块(或数据块),常常叫做磁盘扇区。各扇区之间保留一定的间隙。
磁道从外缘,以“0”开始编号,往里面递增。具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。
磁盘访问时间分成以下三部分:
这样, 访问时间 $T_a$ 表示为: $T_a = T_s + \frac{1}{2r}+\frac{b}{rN}$
在访问时间中,寻道时间和旋转延迟时间基本上都与所读/写数据的多少无关,而且它通常占据了访问时间中的大头。
例如,我们假定寻道时间和旋转延迟时间平均为 20ms,而磁盘的传输速率为 10MB/s,如果要传输 10KB,此时总的访问时间为 21ms,可见传输时间所占比例是非常小的。
当传输 100KB 数据时,其访问时间也只是 30ms,即当传输的数据量增大 10 倍时,访问时间只增加约 50%。
目前磁盘的传输速率已达 80MB/s 以上,数据传输时间所占的比例更低。 可见,适当地集中数据(不要太零散)传输,将有利于提高传输效率。
磁盘是可供多个进程共享的设备,当有多个进程都要求访问磁盘时,应采用一种最佳调度算法,以使各进程对磁盘的平均访问时间最小。目前常用的磁盘调度算法有:
根据进程请求访问磁盘的先后次序进行调度。此算法的优点是公平、简单,且每个进程的请求都能依次地得到处理,不会出现某一进程的请求长期得不到满足的情况。
算法选择这样的进程,其要求访问的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,SSTF 调度本质上是一种最短作业优先(SJF)调度,同样并不能保证平均寻道时间最短。
SSTF 算法虽然能获得较好的寻道性能,但却可能导致某个进程发生“饥饿 Starvation”现象。
SSTF 算法虽然能获得较好的寻道性能,但却可能导致某个进程发生“饥饿”(Starvation)现象。因为只要不断有新进程的请求到达,且其所要访问的磁道与磁头当前所在磁道的距离较近,这种新进程的 I/O 请求必然优先满足。对 SSTF 算法略加修改后所形成的 SCAN 算法,即可防止老进程出现“饥饿”现象。
SCAN 算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN 算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这样自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。这时,同样也是每次选择这样的进程来调度,即要访问的磁道在当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现象。由于在这种算法中磁头移动的规律颇似电梯的运行,先处理完一个方向的请求,然后再处理相反方向的请求,因而又常称之为电梯调度算法。
CSCAN 算法规定磁头单向移动,例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
SCAN 算法既能获得较好的寻道性能,又能防止“饥饿”现象,故被广泛使用。
但 SCAN 算法存在这样的问题: 当磁头刚从里向外移动而越过了某一磁道时,恰好又有一进程请求访问此磁道,这时,该进程必须等待,待磁头继续从里向外,然后再从外向里扫描完处于外面的所有要访问的磁道后,才处理该进程的请求,致使该进程的请求被大大地推迟。
为了减少这种延迟,CSCAN 算法规定磁头单向移动。
例如,只是自里向外移动,当磁头移到最外的磁道并访问后,磁头立即返回到最里的欲访问磁道,亦即将最小磁道号紧接着最大磁道号构成循环,进行循环扫描。
采用循环扫描方式后,上述请求进程的请求延迟将从原来的 2T 减为 T+Smax。
其中 T 为由里向外或由外向里单向扫描完要访问的磁道所需的寻道时间,而 Smax 是将磁头从最外面被访问的磁道直接移到最里面欲访问的磁道的寻道时间。
SCAN 和 C-SCAN 在磁盘的整个宽度内移动磁臂。实际上,这两种算法通常都不是按这种方式实施的。更常见的是,磁臂只需移到一个方向的最远请求为止。
遵循这种模式的 SCAN 算法和 C-SCAN 算法分别称为 LOOK 和 C-LOOK 调度,因为它们在向特定方向移动时查看是否会有请求
I/O System