一场流水线带来的灾难

http://blog.csdn.net/tigerjb/article/details/6143151

 一场流水线带来的灾难

---------------------------------------------------------

Author   :tiger-john
WebSite 
:blog.csdn.net/tigerjb

Email    jibo.tiger@gmail.com

Tiger声明:本人鄙视直接复制本人文章而不加出处的个人或团体,但不排斥别人转载tiger-john的文章,只是请您注明出处。3Q

---------------------------------------------------------

流水线的设计对计算机体系结构来说是一个重要意义的设计。前人不会无缘无故的把一个毫无意义的东西引入到计算机世界。

引入流六线对计算机结构的重要性及其优点本人在次不涉及。

(想知道的话,就去问问我们伟大的google老师把)

通过哲学观点我们知道任何事物都是有两面性的。如果不在合适的时间,合适地点使用,那么它就给我们这些挨踢人士带来不小的麻烦。

下面就是三级流水线带来的一些灾难。

先大概说一些废话:

三级流水线由:预取,译码和执行三部分组成。

此篇文章针对是ARM7体系结构

一.   指令的预取和自修改代码

1.许多ARM实现了在前一条指令的指令尚未完成时,将指令从存储器中取出。这个action被称为指令的预取。

2.此处说明一点:指令的预取并不代表实际执行指令(就好比一个空头支票一样,只是一个口头承诺)被预期的指令可能得不到运行。有以下两种原因:

l  发生异常

当发生异常时,当前指令执行完毕,所有预取的指令都被丢弃,指令的执行从异常向量开始。

l  发生跳转

当发生跳转时,预取的的在分支指令后的指令将被丢弃。

3.在预期指令之前要进行转移测试,例如在执行一条分支指令,此时要判断是预期分支指令之后的指令还是转移目标地址的指令。

二.预取指令引起的困惑

1.如果在存储器中的指令在被预取之后,被执行之前发生改变。

那么计算机该怎么办呢,是继续执行以前预期的指令还是执行新的指令?

(whether  first  or  second?

   This is a serious question!)

看一个程序:

;File name     :triple instructions pipelining

;Author        :冀博

;Function      :emulate the triple instructions pipelining

;Time          :2010年1月15号

                       AREA    TEST,CODE,READONLY

                       CODE32

                       ENTRY

START       LDR          R0,AddInstr                       (1)

                       STR            R0,NextInstr                       (2)

NextInstr   SUB     R0,R0,#0X1                       (3)

                        SUB     R1,R1,#0X1                       (4)

                        SUB           R2,R1,R0                         (5)

AddInstr   ADD     R1,R1,#0X1                       (6)

                   B       START                            (7)

                            END

分析指令的执行过程:

1>  从地址(1)预取指

2>  从地址(2)预取值,LDR指令进入译码阶段

3>  从地址(3)预取值,STR指令进入译码阶段,同时LDR指令进入执行阶段,执行完后将地址(6)的指令装入R0.

4>  从地址(4)处预取指,STR指令进入执行阶段,执行完后将ADD 指令存入地址(3);SUB指令被覆盖。

5>  虽然SUB指令子啊存储器中被覆盖,但是它仍处于流水线上,并进入执行阶段。

  Tiger-John总结:

1>如果存储器中的指令在它被预取指之后,被执行令之前发生改变,此时,对存储器中的指令进行修改一般不能阻止已取指令的执行。

2>但是,如果存储器中的指令在它被预取指之后,被执行令之前,发生中断,那么该指令就将被丢弃而步会被执行

例如:当指令第一次执行时,在STR指令之后有可能产生一个中断,那么,已经预期的SUB指令将被丢弃。当中断处理程序返回时,位于NextInstr处的指令被再次预取,而这次则执行ADD指令。

3>如果ARM处理器或存储器系统允许保持预取指令的备份并使用这些备份而不是重新预取。那么以后执行这段代码仍将执行SUB指令。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了python应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值