
- 加为好友
- 发送私信
- 在线聊天
|
| 发表于:2008-05-08 11:19:5131楼 得分:0 |
谢谢大家踊跃发言!!! 最后还是我自己做个了结吧,看了些资料,自己的理解,不一定完全正确 先从指令预取讲起,至于为什么要预取,就不废话了 CPU使用pipeline实现指令预取,就是缓存啦,将准备执行的指令 预取到缓存中,如果指令本身要访问内存数据元素,也从内存中读取 并写入缓存,但一级缓存还不够好,如果程序采用了逻辑分支,使指令 转移到内存中完全不同的位置,那整个缓存就没用了,所有的缓存指令 将被新的预取指令覆盖而产生新的缓存指令,如果这时又要跳回去呢? 缓存的又没用了,CPU又要等待,因而出现了二级(多级)缓存(/*不知道可对, 个人认是下一级缓存在上一级被清空时备份上一级的缓存*/) ,它保存了原来一级缓存中的指令,这样跳回去时也不用到内存取指令. 乱序执行引擎是在CPU的控制单元中的,它包含几个缓冲区用于改变pipeline中 的指令的顺序,以便提高控制单元的性能.它将缓存的指令分析然后重新排序,找出 那些能够独立(不需要前面指令的执行结果,前面的指令执行与否对它的执行及结果没影响) 执行的指令送入执行单元(之前还要分解为微操作)并发执行,而真正当EIP指向某条指令时, 它可能已经被执行过了,那CPU仅仅返回正确的结果而已(这个过程用到了寄存器重命名的技术),不会再执行一次 /*举个简单的例子,不一定恰当 mov eax,0xFFFF ;乱序执行引擎中包含128(假设时R0~R127)个逻辑寄存器,程序员无法操纵 ;这条指令可能被分析为时独立的指令,将它变成mov R0,0xFFFF(就是将R0与eax这个名字绑定) ;然后执行,而真正当EIP指向这条指令时,仅仅是将R0复制到eax中,只是我们好象以为是真的刚刚 ;才执行这条指令,这样我们编程仍然可以想象成CPU是一条汇编一条汇编的向下执行,效果一样, ;也就对程序员透明了 */ 以上是我个人的理解,不知道可对,大家看看指正,谢谢! | | |
修改
删除
举报
引用
回复
| |