乱序执行(乱序执行译作异步执行更贴切),是指在cpu中运行的指令并不按照代码中的顺序执行,而是按照一定的策略打乱顺序执行,也许后面的指令先执行,当然,得保证指令之间不具备相关性。

举个简单的例子,比如如下两行代码就无法乱序执行。

mov eax, [0x1234]
add eax, ebx

第2行的add加法,需要知道eax的值,但eax的值需要在第1行中的mov操作后才能确定,而且内存访问相对来说非常慢,第2步不得不等待第1步完成后才能进行。所以只能是先执行第1步,再执行第2步。

如果将上面第2步的代码修改一下,如下:

mov eax, [0x1234]
add ecx,ebx。

这样就可以在执行第1步内存访问后的等待中执行第2步啦。由于第2步不依赖第1步,所以有利于放在流水线上。

x86最初用的指令集是CISC,Complex Instruction Set Computer,意为复杂指令集计算机,为什么复杂呢?当初的cpu工程师们为了让cpu更加强大,不断地往cpu中添加各种指令,甚至在cpu硬件一级直接支持软件中的某些操作,以至于指令集越来越庞大笨重复杂。如push指令,它相当于多个子操作的合成,拿保护模式中的栈来说,push eax相当于:

  • push指令先将栈指针esp减去操作数的字长,如sub esp,4。
  • 再将操作数mov到新的esp指向的地址,如mov [esp],eax。

这两个子操作合成了一个指令,其中每一个子操作称为微操作。

与CISC指令集相对应的是RISC,Reduced Instruction Set Computer。意为精简指令集计算机。根据二八定律,最常用的指令只有20%,但它们占了整个程序指令数的80%。而不常用的指令占80%,但它们只占整个程序指令数的20%。这就是RISC指令集的由来,它精简保留了那些常用的指令,这些指令大多数都是不可再细分的,也就是,它们基本上都是属于微操作级别的指令啦。所以,x86发展到后来,虽然还是CISC指令集,但其内部已经采用RISC内核,译码对于x86体系来说,除了按照指令格式分析机器码外,还要将CISC指令分解成多个RISC指令。当一个“大”操作被分解成多个“微”操作时,它们之间通常是独立无关联,所以非常适合乱序执行。

还是拿栈举例。如下三行代码:

mov eax , [0x1234]
push eax
call function

第1步需要内存访问,由于内存较慢,所以寻址等待过程中可以做其它事。

第2步的push指令拆分成 sub esp ,4和mov [esp], eax。

第3步的call函数调用,需要在栈中压入返回地址,所以说call指令需要用栈指针。

由于第2步中的微操作sub esp,4,可以让cpu知道esp的最新值,不用等到mov [esp], eax完成,第3步call指令向栈中压入返回地址的操作就可以执行了。故第2步未执行完就开始第3步的执行了,也许第3步先于第2步才完成。

总结下,乱序执行的好处就是后面的操作可以放到前面来做,利于装载到流水线上提高效率.

一步步编写操作系统 28 cpu乱序执行相关推荐

  1. 一步步编写操作系统 30 cpu的分支预测简介

    人在道路的分岔口时要预测哪条路能够到达目的地,面对众多选择时,计算机也一样要抉择,毕竟计算机的运行方式是以人的思路来设计的,计算机中的抉择其实就是人在抉择. cpu中的指令是在流水线上执行.分支预测, ...

  2. 一步步编写操作系统 29 cpu缓存简介

    缓存是20世纪最大的发明,其原理用一些存取速度较快的存储设备做为数据缓冲区,避免频繁访问速度较慢的低速存储设备,归根结底的原因是,低速存储设备是整个系统的瓶颈,缓存用来缓解"瓶颈设备&quo ...

  3. 一步步编写操作系统 25 cpu的保护模式

    在保护模式下,我们将见到很多在实模式下没有的新概念,很多都是cpu硬件原生提供,并且要求的东西,也就是说按照cpu的设计,必须有这些东西cpu才能运行.咱们只要了解它们是什么并且怎么用就行了,不用深入 ...

  4. 一步步编写操作系统 60 cpu的IO特权级2 什么是驱动程序

    用户程序可以在由操作系统加载时通过指定整个eflags设置,操作系统如何设置自己的IOPL呢,即使内核IOPL为0也得写进去eflags寄存器中才生效.可惜的是,没有直接读写eflags寄存器的指令, ...

  5. 一步步编写操作系统 59 cpu的IO特权级1

    在保护模式下,处理器中的"阶级"不仅体现在数据和代码的访问,还体现在指令中. 一方面将指令分级的原因是,有些指令的执行对计算机有着严重的影响,它们只有在0特权级下被执行,因此被称为 ...

  6. 一步步编写操作系统 31 cpu的分支预测 下

    让我们说说预测的算法吧. 对于无条件跳转,没啥可犹豫的,直接跳过去就是了.所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立.最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一 ...

  7. 一步步编写操作系统 15 CPU与外设通信——IO接口,下

    既然都说到IO接口了,不知道各位有没有疑问,cpu是怎样访问到IO接口呢?肯定得有个链路吧?什么?有隐约听到有同学开玩笑说:cpu用无线访问其它设备.哈哈,不知道各位听说过没有,无线的终端是有线.无论 ...

  8. 一步步编写操作系统 14 CPU与外设通信——IO接口 上

    介绍显卡之前,必须得和大家交待清楚,那么多的外部设备,cpu是如何与他们交流. 大家都学过微机接口技术吧?没学过也没关系,反正我也只是笼统地说说^_^,保证大家一定能看得懂. 按理说,如果硬件种类较少 ...

  9. 一步步编写操作系统 10 cpu的实模式

    cpu的实模式 由于mbr在实模式下工作--什么?什么是实模式?这时候有同学打断了我.我心想,这下好办了--哈哈,没有啦,开个玩笑而已.我们这里所说的实模式其实就是8086 cpu的工作环境.工作方式 ...

最新文章

  1. datagridview绑定xml
  2. mysql jdbc连接 优化_java+mysql连接的优化
  3. 最酷的windows后门 呵呵
  4. Android 颜色渲染(九) PorterDuff及Xfermode详解
  5. redis中不同value类型的存取操作方式
  6. Android项目实战之(1)-- 开发一个快速冲浪的程序
  7. pytorch 预训练模型
  8. [SAP ABAP开发技术总结]搜索帮助Search Help (F4)
  9. QT5 QDateTime函数及时间格式说明
  10. Unity Singleton 单例类
  11. 一级建造师能挂靠到三级资质的企业吗?
  12. MongoDB详细安装与配置
  13. Xshell安装与使用
  14. 编程一年,我学会了什么?
  15. Msfvenom使用指南
  16. 小飞升值记——(终章)
  17. zlibirary如何登录自己的账号?看看这篇文章就可以了,zlibirary登录自己的账号,书籍直接邮寄到邮箱
  18. BloomFilter怎么用?使用布隆过滤器来判断key是否存在?
  19. Java中的抽象类和抽象函数
  20. java jsp中的日历表_java-jsp日历

热门文章

  1. 但行好事,莫问前程!
  2. java虚拟机10.内存模型与线程
  3. 201521123023《Java程序设计》第13周学习总结
  4. 行内元素与块级元素,以及区别
  5. [LeetCode] Search for a Range [34]
  6. Tomcat项目部署过程中的问题
  7. [Leetcode][第20题][JAVA][有效的括号][栈][HashMap]
  8. [剑指offer][JAVA]面试题第[15]题[二进制中1的个数][位运算]
  9. php.ini 老薛,出现Allowed memory size of 134217728 bytes exhausted怎么办?
  10. sqlserver 微信昵称_sql server用户名和登录名的区别和联系