1 精确例外
上一篇文章提到的Tomasulo算法,是一个非精确的例外,也就是说一旦发生例外,硬件就很难处理,因为是乱序执行,怎么才能给软件一个干净的现场呢?
所以操作系统就希望动态流水线提供精确例外。
精确例外:指在处理例外的时候,发生例外指令之前所有的指令都已经执行完了,例外指令后面的所有指令都还没执行。
所以我们要怎么做呢?就是扩展Tomasulo算法来支持推测,我们必须将指令结果的旁路从一条指令的实际完成操作中分离出来,进行这种分离之后,就可以允许执行一条指令,并将其结果旁路给其他指令,但不允许这条指令执行任何不能撤销的更新操作,直到确认这条指令不再具有不确定性为止。
其实简单来说,就是增加一个缓冲区暂时存放结果,直到这个数据不再更新,再写回寄存器堆。
2 重排序缓冲区(ROB)
重排序缓冲区像Tomasulo算法通过保留站扩展寄存器集一样,提供了附加寄存器。ROB会在一定时间内保存指令的结果,这段时间从与指令相关的运算完成开始,到该指令提交完毕为止。
提交(commit): 就是在流水线中增加了一个commit阶段,只有在这个阶段才能真正修改计算机的状态。其他时候都是修改ROB中的值。
所以现在指令的执行步骤就分为四步,分别是发射、执行、写结果和提交。
2.1 ROB包含的内容
ROB中的每个项目包含4个字段:
· 指令类型——分支指令、存储指令、寄存器操作指令
· 目的地字段——提供写入结果的寄存器编号
· 值字段——在提交指令前保存指令结果
· 就绪字段——指令已经完成执行,结果值准备就绪
2.2 增加了ROB的流水线结构
2.3 提交(commit)阶段详解
利用ROB实现了乱序执行后的有序结束,防止在指令提交之前采取任何不可撤销的动作。那么我们重点介绍一下提交阶段的具体操作。
当一个指令到达ROB的头部而且其结果出现在缓冲区中时,则正常提交,此时处理器用结果更新其寄存器,并从ROB中清除该指令。
当预测错误的分支指令到达ROB头部时,他指出推测是错误的。那么ROB被清空,执行过程从该分支的正确后续指令重新开始。如果对该分支的预测正确,则该分支完成提交。
指令一旦提交完毕,它在ROB的相应项将被收回,寄存器或存储器目的地址将被更新,并且不再需要ROB项。
任意一条指令发生例外,就清除操作队列以及ROB,保证了现场的干净,因为在例外之前的指令都已经执行完毕,而后面的指令都未执行(未把结果写回)。
2.4 流水线执行情况详解
3 总结
有序发射、乱序执行、有序结束
ending~