5.2.7 精确断点与不精确断点
当正在处理机中运行的一个程序被某一个中断源中断时,因为在流水线中同时有多条指令在执行;那么,断点究竟在哪一条指令呢?
对于常规输入输出设备申请的输入输出中断服务,其目的是要求处理机暂时停止正在执行的程序,转去完成设备所要求的输入输出任务。对于这种情况,实际上不需要有精确的断点。因此,比较简单的处理方法是:让已经进入流水线的所有指令都执行完成,断点就是最后进入流水线的那条指令的地址。如图5.38中,精确断点地址是i,而实际断点地址在i+5。中断服务程序可以紧接在第i+5条指令之后进入流水线。
由于常规输入输出设备的中断服务在整个中断处理中占据主要部分,采用不精确断点法,只要能够及时从主存储器中读入中断服务程序,流水线可以不"断流";而且,采用不精确断点法所需要的硬件比较少,控制逻辑相对比较简单;它的主要缺点是中断响应时间稍长些。
对于程序性错误和机器故障等引起的中断,它们出现的概率很低,在整个程序执行过程中所占的比例很小;因此,流水线处理机处理这类中断的出发点不在于如何缩短"断流"时间,关键是要正确保存现场和正确恢复断点。
如图5.38中,第i条指令执行到流水段时出现程序性错误,可能的程序性错误有指令或数据格式错、主存保护、非法操作码、地址越界、各种运算结果溢出、调用管理程序等,可能的机器故障有信息校验错误(包括电源故障、运算电路误动作、主存储器出错、输入输出设备或控制器出错、机器的其它各种硬件故障等)、虚拟存储器缺页等。这时,第i+1、i+2、……、i+5条指令都已经进入流水线。
处理因为程序性错误和机器故障等产生的中断,可以有两种方法,一种是采用不精确断点(Imprecise interrupt)方法,另一种是采用精确断点(Precise
interrupt)方法。如果采用不精确断点法,中断处理过程与常规的输入输出设备相同;凡是已经进入流水线的指令都执行完成,断点就是最后进入流水线的那条指令的地址。然而,采用不精确断点法可能会发生如下两个问题。一个问题是程序执行的结果可能出错;例如,有如下两条指令:
i: FADD R1, R2 ;(R1)+(R2)→R1
i+1: FMUL R3, R1 ;(R3)×(R1)→R3
当第i条指令执行到流水段时发现浮点加法结果溢出,于是发出中断服务申请。由于采用不精确断点法,要让已经进入流水线的第i+1条指令也执行完成;因为第i+1条指令使用了不正确的通用寄存器R1中的内容作源操作数,因此,浮点乘法的执行结果一般也是不正确的。另一个问题是在程序凋试过程中,通常要设置断点,程序员通过查看断点处的中间执行结果来判断程序编写是否正确。如果采用不精确断点法,由于程序不能准确中断在程序员所设置的断点处,因此,在这种流水线处理机上程序员很难凋试程序。在流水线处理机出现的初期,因为采用了这种不精确断点法,曾经有一些程序设计人员批评流水线处理机,而且不喜欢使用流水线处理机。
在流水线的流水段数目不是很多,只要采取适当措施;例如,判断发生程序性错误的指令与已经进入流水线的其它指令之间是否有数据相关等。只要发生程序性错误的指令不影响流水线中其它指令的执行结果,在这种情况下,采用不精确断点法仍然能够保证程序的执行结果是正确的。在早期生产的一批大型流水线处理机中,有许多采用了不精确断点法;例如,IBM
360/91计算机等。
近期生产的流水线处理机一般都采用精确断点法。由哪一条指令的程序性错误或故障发出的中断申请,断点就是这条指令的地址。例如,在图5.38中,如果第i条指令发生了程序性错误或故障,那么,断点就是i。为了实现精确断点法,需要把断点处的指令的执行结果都保存下来,为此,要设置一定数量的后援寄存器。因此,采用精确断点法所需要的硬件代价比较高,控制逻辑也比较复杂。