一步步编写操作系统 28 cpu乱序执行
乱序执行(乱序执行译作异步执行更贴切),是指在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乱序执行相关推荐
- 一步步编写操作系统 30 cpu的分支预测简介
人在道路的分岔口时要预测哪条路能够到达目的地,面对众多选择时,计算机也一样要抉择,毕竟计算机的运行方式是以人的思路来设计的,计算机中的抉择其实就是人在抉择. cpu中的指令是在流水线上执行.分支预测, ...
- 一步步编写操作系统 29 cpu缓存简介
缓存是20世纪最大的发明,其原理用一些存取速度较快的存储设备做为数据缓冲区,避免频繁访问速度较慢的低速存储设备,归根结底的原因是,低速存储设备是整个系统的瓶颈,缓存用来缓解"瓶颈设备&quo ...
- 一步步编写操作系统 25 cpu的保护模式
在保护模式下,我们将见到很多在实模式下没有的新概念,很多都是cpu硬件原生提供,并且要求的东西,也就是说按照cpu的设计,必须有这些东西cpu才能运行.咱们只要了解它们是什么并且怎么用就行了,不用深入 ...
- 一步步编写操作系统 60 cpu的IO特权级2 什么是驱动程序
用户程序可以在由操作系统加载时通过指定整个eflags设置,操作系统如何设置自己的IOPL呢,即使内核IOPL为0也得写进去eflags寄存器中才生效.可惜的是,没有直接读写eflags寄存器的指令, ...
- 一步步编写操作系统 59 cpu的IO特权级1
在保护模式下,处理器中的"阶级"不仅体现在数据和代码的访问,还体现在指令中. 一方面将指令分级的原因是,有些指令的执行对计算机有着严重的影响,它们只有在0特权级下被执行,因此被称为 ...
- 一步步编写操作系统 31 cpu的分支预测 下
让我们说说预测的算法吧. 对于无条件跳转,没啥可犹豫的,直接跳过去就是了.所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立.最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一 ...
- 一步步编写操作系统 15 CPU与外设通信——IO接口,下
既然都说到IO接口了,不知道各位有没有疑问,cpu是怎样访问到IO接口呢?肯定得有个链路吧?什么?有隐约听到有同学开玩笑说:cpu用无线访问其它设备.哈哈,不知道各位听说过没有,无线的终端是有线.无论 ...
- 一步步编写操作系统 14 CPU与外设通信——IO接口 上
介绍显卡之前,必须得和大家交待清楚,那么多的外部设备,cpu是如何与他们交流. 大家都学过微机接口技术吧?没学过也没关系,反正我也只是笼统地说说^_^,保证大家一定能看得懂. 按理说,如果硬件种类较少 ...
- 一步步编写操作系统 10 cpu的实模式
cpu的实模式 由于mbr在实模式下工作--什么?什么是实模式?这时候有同学打断了我.我心想,这下好办了--哈哈,没有啦,开个玩笑而已.我们这里所说的实模式其实就是8086 cpu的工作环境.工作方式 ...
最新文章
- datagridview绑定xml
- mysql jdbc连接 优化_java+mysql连接的优化
- 最酷的windows后门 呵呵
- Android 颜色渲染(九) PorterDuff及Xfermode详解
- redis中不同value类型的存取操作方式
- Android项目实战之(1)-- 开发一个快速冲浪的程序
- pytorch 预训练模型
- [SAP ABAP开发技术总结]搜索帮助Search Help (F4)
- QT5 QDateTime函数及时间格式说明
- Unity Singleton 单例类
- 一级建造师能挂靠到三级资质的企业吗?
- MongoDB详细安装与配置
- Xshell安装与使用
- 编程一年,我学会了什么?
- Msfvenom使用指南
- 小飞升值记——(终章)
- zlibirary如何登录自己的账号?看看这篇文章就可以了,zlibirary登录自己的账号,书籍直接邮寄到邮箱
- BloomFilter怎么用?使用布隆过滤器来判断key是否存在?
- Java中的抽象类和抽象函数
- java jsp中的日历表_java-jsp日历
热门文章
- 但行好事,莫问前程!
- java虚拟机10.内存模型与线程
- 201521123023《Java程序设计》第13周学习总结
- 行内元素与块级元素,以及区别
- [LeetCode] Search for a Range [34]
- Tomcat项目部署过程中的问题
- [Leetcode][第20题][JAVA][有效的括号][栈][HashMap]
- [剑指offer][JAVA]面试题第[15]题[二进制中1的个数][位运算]
- php.ini 老薛,出现Allowed memory size of 134217728 bytes exhausted怎么办?
- sqlserver 微信昵称_sql server用户名和登录名的区别和联系