中断方式与轮询方式
标签(空格分隔): 计算机
原文链接:http://lionwq.spaces.eepw.com.cn/articles/article/item/18936#
此文章仅仅用于本人练习MarkDown语法之用,如果作者本人觉得侵权,请留言,本人立即删除
1. 中断方式的基本概念
程序中断通常简称中断,是指CPU在正常运行程序的过程中,由于预选安排或发生了各种随机的内部或外部事件,使CPU中断正在运行的程序,而转到为相应的服务程序去处理,这个过程称为程序中断。
2. 80 x86微处理器的中断
80 x86微处理器的中断类型一般分为2类,即由于执行某些指令引起的软中断和由处理器以外其他控制电路发出中断请求信号引起的硬中断。 CPU要从主程序转入中断服务程序,必须知道该中断服务程序的入口地址,即中断向量。80 x86为CPU的PC机共有256个中断向量。
中断的一般过程:
主程序只是在设备A,B,C数据准备就绪时,才去处理A,B,C,进行数据交换。在速度较慢的外围设备准备自己的数据时,CPU照常执行自己的主程序 。在这个意义上说,CPU和外围设备的一些操作是并行地进行的,因而同串行进行的程序查询方式相比,计算机系统的效率是大大提高了。如下图:
Start-->|主程序| node1
node1 --> node2
node2 --> node3
node3 --> End
A[鼠标]-->|请求中断| node1
node1 --> |响应中断| A
B[键盘]-->|请求中断| node2
node2 --> |响应中断| B
C[摄像头]-->|请求中断| node3
node3 --> |响应中断| C
实际的中断过程还要复杂一些,下图示出了中断处理过程的详细流程图.当CPU执行完—条现行指令时,如果外设向CPU发出中断请求
,那么CPU在满足响应条件的情况下,将发出中断响应
信号,与此同时关闭中断
(中断屏蔽
触发器置1
),表示CPU不再受理另外—个设备的中断。这时、CPU将寻找中断请求源
是哪个设备。并保存CPU自己的程序计数器(PC)的内容
.然后,它将转移到处理该中断源的中断服务程序
.CPU再保存现场信息
,执行设备服务(如交换数据)以后.将恢复现场信息
。在这些动作完成以后,开放中断
(中断屏蔽
触发器置0
),并返回到原来被中断的主程序的下一条指令。
start=>start
op1=>operation: 取指令
op2=>operation: 执行指令
op3=>operation: 响应中断
op4=>operation: 转移到中断服务子程序
op5=>operation: 关闭中断,中断屏蔽复位
op6=>operation: 找出中断源,保存计数器(PC)
op7=>operation: 保存CPU现场
op8=>operation: 执行设备服务
op9=>operation: 恢复CPU现场
op10=>operation: 打开中断,返回主程序执行下一条命令
cond1=>condition: 中断
sub1=>subroutine: 中断服务程序(比如键盘输入响应程序)
start->op1->op2->cond1
cond1(no)->op1
cond1(yes)->op3->op4->sub1->op9->op10->op1
- 尽管外界中断请求是随机的,但CPU只有在当前一条指令执行完毕后,即转入公操作[1]时才受理设备的中断请求,这样才不致于使当前指令的执行受到干扰。公操作是指一条指令执行结束后CPU所进行的操作,如中断处理、直接内存传送、取下条指令等。外界中断请求信号通常存放在接口中的
中断源锁存器
里,并通过中断请求线连至CPU,每当一条指令执行到末尾,CPU便检查中断请求信号。若中断请求信号为1
,则CPU转入中断周期
,受理外界中断。 - 为了在中断服务程序执行完毕以后正确地返回到原来主程序被中断的断点(PC内容)而继续执行主程序,必须把程序计数器PC的内容,以及当前指令执行结束后CPU的状态(包括寄存器的内容和一些状态标志位)都保存到堆栈中去。这些操作叫做保存现场。
- 当CPU响应中断后,正要去执行中断服务程序时,可能有另一个新的中断源向它发出中断请求。为了不致造成混乱,在CPU的中断管理部件中必须有一个
中断屏蔽触发器
,它可以在程序的控制下置1
(设置屏蔽),或置0
(取掉屏蔽)。只有在中断屏蔽标志为0
时,CPU才可以受理中断。当一条指令执行完毕,CPU接受中断请求并作出响应时,它一方面发出中断响应信号INTA
,另一方面把中断屏蔽标志置1
,即关闭中断。这样,CPU不能再受理另外的新的中断源发来的中断请求。只有在CPU把中断服务程序执行完毕以后,它才重新使中断屏蔽标志置0
,即开放中断,并返回主程序。因此,中断服务程序的最后必须有两条指令
,即开中断指令
和返主指令
,同时在硬件上要保证返主指令执行以后才受理新的中断请求。 - 中断处理过程是由
硬件
和软件
结合来完成的。如在前图中,中断周期由硬件实现,而中断服务程序由机器指令序列
实现。后者除执行保存现场
、恢复现场
、开放中断并返回主程序
任务外,对要求中断的设备进行服务,使其同CPU交换一定的数据,或作其他服务。
3. 轮询方式的基本概念
轮询(Polling)I/O方式
,也称作程序控制I/O方式
,是让CPU以一定的周期按次序查询每一个外设,看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出
服务;若无,或I/O处理完毕后,CPU就接着查询下一个外设。
- 所需硬件:外设接口提供状态端口、数据端口
- 软件机制:应用程序必须定时查询各个接口的状态端口,判断是否需要输入、输出数据,如果需要,则通过数据端口进行数据操作。
- 特点:CPU通过执行指令主动对外部设备进行查询,外部设备处于被动地位 。
st=>start: 开始
end=>end: 结束
cond1=>condition: 设备需要数据交换
sub1=>subroutine: 执行一段应用程序
cond2=>condition: 是否结束
op1=>operation: 通过端口执行数据交换
st->cond1
cond1(no)->sub1->cond2
cond1(yes)->op1->sub1
cond2(yes)->end
cond2(no)->cond1
4. 轮询方式与中断方式的比较
速度
程序控制方式
硬件的速度指标:由于程序控制方式
完全采用软件的方式对外设接口进行控制,所以它的硬件操作只是普通的端口读写,并无特别之处,其速度指标由总线传输速度
、端口的响应速度
共同决定。
对于这种外设控制方式,速度指标关键在于软件。
中断处理方式
中断处理方式本身所作的原子操作解释和程序控制方式是一致的。
只不过因为加入了中断请求和响应机制,对状态端口的读取变成了在中断响应过程中对中断号的读取,对状态端口的判断变成了对中断入口地址的确定。
从本质上来说,中断处理方式和程序控制方式本身的速度指标一致,没有大的差别。
可靠性
程序控制方式
由于硬件不支持中断方式,因此操作系统把CPU控制权交给应用程序后,只要应用程序不交还CPU控制权,操作系统就始终不能恢复对CPU的控制(无定时中断)。应用程序与操作系统都是软件模块,操作系统属于核心模块,它们之间存在交接CPU控制权的关系。正是由于这样的关系,一旦使用对外设的程序控制方式
时,应用程序出现死锁,则操作系统永远无法恢复对系统的控制。应用程序的故障通过外设控制方式波及到作为核心模块的操作系统,因此,根据关联可靠性指标的计算可知,程序控制方式
的关联可靠性指标很低。
中断处理方式
由于提供定时中断,操作系统可以在应用程序当前时间片结束后通过中断服务程序重新获得对CPU的控制权。应用程序的故障不会波及到操作系统,因此,中断处理方式的关联可靠性指标高。
可扩展性
程序控制方式
由于所有应用程序中都包含对端口的操作,一旦硬件接口的设计发生变化,则所有应用程序都必须进行修改,这会使修改费用升高很多倍。因此,程序控制方式会使相关硬件模块的局部修改指标相对较低。
中断处理方式
应用程序不直接操作端口,对端口的操作是由中断服务程序来完成的。如果某个硬件接口的设计发生了变化,只需要修改它相关的中断服务程序即可。因此,中断处理方式使得相关硬件模块的局部修改指标较高。
生命期
程序控制方式(CPU查询方式)
在早期的计算机系统中能够满足应用需求;但是随着外部设备种类的增多、速度差异的加大,这种方式逐渐成为系统性能提高的障碍。它的生命期只限于早期计算机阶段,因为当时外部设备少,且都是低速设备,到8位机出现以后,这种外设控制方式(体系结构)被淘汰。
中断处理方式(外设请求方式)
能够协调CPU与外设间的速度差异,能够协调各种外设间的速度差异,提高系统的工作效率(速度指标)。使应用程序与外设操作基本脱离开来,降低了程序的设备相关性(关联可靠性指标、局部修改指标)。虽然目前某些快速设备相互间的通信没有通过CPU,也没有使用中断处理方式,但是对于慢速设备、设备故障的处理来说,中断处理方式仍然是最有效的。无论将来计算机系统中的元件怎样变化,只要存在慢速设备与快速CPU之间的矛盾,使用中断处理方式都是适合的。即便不使用中断服务程序,中断的概念也会保持很久。在短时期内,计算机系统还无法在所有领域离开人工交互操作,人的操作速度一定比机器的处理速度慢,因此慢速设备将仍然保持存在(但这不是慢速设备存在的唯一原因)。正因为存在这样的需求,中断处理方式具有较长的生命期。
公操作:所谓公操作,就是一条指令执行完毕后,CPU所开始进行的一些操作,这些操作主要是CPU对外围设备请求的处理,如中断处理、通道处理等。如果外围设备没有向CPU请求交换数据,那么CPU又转向下一条指令。由于所有指令的取指周期是完全一样的,因此,取指令也可以认为是
公操作
。这是因为,一条指令执行结束后,如果没有外设请求,CPU一定转 入“取指令”操作。 ↩︎