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

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

cpu中的指令是在流水线上执行。分支预测,是指当处理器遇到一个分支指令时,是该把分支左边的指令放到流水线上还是把分支右边的指令放在流水线上呢?

如C语言程序中的if、switch、for等语言结构,编译器将它们编译成汇编代码后,在汇编一级来说,这些结构都是用跳转指令来实现的,所以,汇编语言中的无条件跳转指令很丰富,以至于称之为跳转指令“族”,多的足矣应对各种转移方式。

举个例子,如下面测试代码

1 void main () {
2 int i = 0;
3 while (i < 10) {
4 i++;
5 }
6 }

里面的while结构,就是执行了10次i++。我们来看一下while结构是如何翻译成汇编语言的。

gcc -S -o ~/test/while.S ~/test/while.c回车,这样gcc就将while.c编译成了汇编代码while.S。其中的参数-S是编译到汇编语言,不进行汇编和链接。

查看下~/test /while.S文件,cat -n ~/test/while.S回车

 1		.file	"while.c"2		.text3	.globl main4		.type	main, @function5	main:6		pushl	%ebp7		movl	%esp, %ebp8		subl	$16, %esp9		movl	$0, -4(%ebp)
10		jmp	.L2
11	.L3:								;此处是while的循环体
12		addl	$1, -4(%ebp)
13	.L2:								;此处是while循环条件表达式
14		cmpl	$9, -4(%ebp)
15		jle	.L3
16		leave
17		ret
18		.size	main, .-main
19		.ident	"GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)"
20		.section	.note.GNU-stack,"",@progbits

这个生成的汇编语言并不是我们熟悉的intel语法,而是AT&T语法,如果此时您觉得太陌生也不要慌张,因为在后面的章节我们会专门说到此类语法,现在先抛出来和大家预预热。

本来打算只列出第9~15行的,但考虑到本身才20行,干脆就全贴出来了,简要说明下,前4行是用于声明代码段、导出main函数符号。第5行是main函数起始地址,高级语言中的函数名在汇编语言中只是个符号,而符号便是地址,这就是很多教科书上都说函数名是地址的原因。话说数组也同理,数组名在汇编语言中也是个标号地址,所以数组名也是地址。局部变量是在栈中分配空间的,所以第6~8行是在创建堆栈框架,也就是为局部变量i在栈中分配空间,-4(%ebp)便是指局部变量i。堆栈框架以后会说到。咱们主要是看第9~15行。

第9行是为变量i赋值为0。AT&T语法中,寄存器前要用%来指示,立即数前要用$来指示。-4(%ebp)表示内存地址“ebp寄存器的值减4”处内存内容。相当于intel汇编语法形式[ebp – 4]。AT&T语法中是源操作数在左,目的操作数在右,和intel语法相反。所以第9行是将0送入了变量i所在的栈空间。

第10行就是简单的无条件跳转,直接进入while循环结构的条件表达式判断,也就是第13行。

第14行就是while括号中的条件表达式,用变量i的值和立即数9做比较。

第15行的jle意思是,若第14行的比较结果是小于等于9,则跳到11行,继续执行第12行的加法。可见第11~12行则是循环体。

程序执行流是由第15行跳到第11行,这样组成了循环结构的回路。

程序执行while循环后就结束了,所以局部变量i所在的栈空间要被回收,第16行的指令leave是用于堆栈框架的回收工作。

第17行是main函数退出。由于main也是被调用的,所以gcc显示的帮咱们加了个ret以示退出,为什么main也是由别人调用的,这个在加载用户程序时咱们会说到的。

上面的第15行jle指令就是程序中的分支结构。我们花了“大力气”讲述了程序流的分支,这并不是浪费力气。类似这样的分支结构很多,它们只有两种结果,要么转移到这一边,要么转移到那一边。分支结构虽然让程序更加灵活多样,但这却成了cpu执行效率的诟病。这是怎么回事呢?

之前说流水线的时候,我和大家强调了两次“重叠”,即同一时间周期内完成的是当前指令的执行,下一条指令的译码,第三条指令的取指。其中最重要的是“执行”,指令只有执行了,才真正是泼出去的水,收不回来了。另外的译码和取指并不重要,首先它们并不是执行,其次它们也不属于当前指令,当前指令的“取指”和“译码”早就在前两个周期内完成了。

不知道您注意到了没有,拿表4-14的周期3来说,这一时钟周期内的“执行”是指的当前指令的执行阶段,“取指”和“译码”这两个工序分别隶属于未来要执行的下一条指令和下下一条指令。想到这里不禁要有个疑问,这两个未来的指令,cpu是如何确定的?如果程序一直是顺序执行的,未来无论多少条指令都可以轻易得到,都可以提前放到流水线上。可是,程序是有分支啊,到底该把哪个分支的指令放到流水线上呢?

流水线是有效提升cpu效率的方式,但流水线最大的问题是程序中的分支结构,如何把握好转移的方向,才是使流水线保持高效的关键,因为如果流水线上的指令放错了的话,必须要清空那些已经在流水线上的指令,一定不能执行错误的指令。随着流水线级数越多,要清空的指令也将越多,清空流水线的代价就越大,这严重影响cpu效率。

当遇到一个分岔口时,是往左走还是往右走呢?对于这种分支情况,就需要预测出哪一侧的指令将被执行,然后将预测出的那一分支上的指令放入流水线。从统计学的角度来看,某些事情一旦出现,下一次出现的机率还会很大。纵观历史,很多事情都是在重复的发生,很多伟人都拿这些历史样本来预测未来发生的事情。这个说的有点悬乎了,说点简单的,比如现在是葡萄收获的季节,今天刚吃了葡萄,很好吃,明天后天甚至未来的几周都会继续吃葡萄,哈哈,我大爱葡萄。

本内容摘自《操作系统真象还原》,作者不容易,请大家支持正版。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439798.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 5492】Find a path(dp,tricks)

题干&#xff1a; Frog fell into a maze. This maze is a rectangle containing NN rows and MM columns. Each grid in this maze contains a number, which is called the magic value. Frog now stays at grid (1, 1), and he wants to go to grid (N, M). For each step,…

Apollo进阶课程㉜丨Apollo ROS原理—1

原文链接&#xff1a;进阶课程㉜丨Apollo ROS原理—1 ROS在开发过程中&#xff0c;基于功能把整个自动驾驶系统分成多个模块&#xff0c;每个模块负责自己消息的接收、处理、发布。当模块需要联调时&#xff0c;通过框架可以把各个模块快速的集成到一起。 上周阿波君为大家详细…

Ubuntu下安装Chrome浏览器的两个方法

一、通过直接下载安装Google Chrome浏览器deb包。 打开Ubuntu终端&#xff0c;以下为32位版本&#xff0c;使用下面的命令。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_i386.deb 以下为64位版本&#xff0c;使用下面的命令。 wget https://dl.…

Apollo进阶课程㉝丨Apollo ROS原理—2

原文链接&#xff1a;进阶课程㉝丨Apollo ROS原理—2 在ROS系统中&#xff0c;从数据的发布到订阅节点之间需要进行数据的拷贝。在数据量很大的情况下&#xff0c;很显然这会影响数据的传输效率。所以Apollo项目对于ROS第一个改造就是通过共享内存来减少数据拷贝&#xff0c;以…

Java 10 常用集合继承关系图

概述 集合类存放的都是对象的引用&#xff0c;而非对象本身&#xff0c;出于表达上的便利&#xff0c;我们称集合中的对象就是指集合中对象的引用。 类图如下&#xff1a; 1、Iterable与Iterator接口之间的区别 我看到好多网上的文章类图里面Collection 是继承Iterator接口&a…

【CodeForces - 673D】Bear and Two Paths(构造,tricks)

题干&#xff1a; Bearland has n cities, numbered 1 through n. Cities are connected via bidirectional roads. Each road connects two distinct cities. No two roads connect the same pair of cities. Bear Limak was once in a city a and he wanted to go to a cit…

Apoll进阶课程㉞丨Apollo ROS原理—3

原文链接&#xff1a;进阶课程㉞丨Apollo ROS原理—3 机器人操作系统(ROS)是一个成熟而灵活的机器人编程框架。ROS提供了所需的工具&#xff0c;可以轻松访问传感器数据&#xff0c;处理数据&#xff0c;并为机器人的电机和其它执行器生成适当的响应。整个ROS系统被设计为在计…

SM3密码杂凑算法原理

目录 1.概述 2、算法描述 2.1 概述 2.2 填充 2.3 迭代压缩 2.3 消息扩展 2.4 压缩函数 2.5 杂凑值 1.概述 SM3是我国采用的一种密码散列函数标准&#xff0c;由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。 在商用密码体…

动手学无人驾驶(1):交通标志识别

今天主要介绍无人驾驶当中深度学习技术的应用。 本文是根据博客专家AdamShan的文章整理而来&#xff0c;在此表示感谢。 关于深度学习的图像分类技术&#xff0c;网上已有很多关于深度学习的课程&#xff08;如吴恩达老师的深度学习专项课程&#xff09;&#xff0c;故本文不对…

《操作系统真象还原》-阅读笔记(上)

第一章 配置bochs&#xff0c;进入bochs simulator后一直是黑屏&#xff0c;原来默认是调试模式&#xff0c;需要输入C&#xff08;continue&#xff09;来让调试继续。 第二章 主讲MBR及进入MBR前的步骤 1.实模式只能访问1MB的内存空间。 2.BIOS在ROM中。 3.开机上电后CS&a…

Apollo进阶课程㉟丨Apollo ROS原理—4

原文链接&#xff1a;进阶课程㉟丨Apollo ROS原理—4 ROS是一个强大而灵活的机器人编程框架&#xff0c;从软件构架的角度说&#xff0c;它是一种基于消息传递通信的分布式多进程框架。 ROS本身是基于消息机制的&#xff0c;可以根据功能把软件拆分成为各个模块&#xff0c;每…

《操作系统真象还原》-阅读笔记(中)

第七章 操作系统是由中断驱动的。 中断分为外部中断和内部中断。 外部中断分为可屏蔽中断和不可屏蔽中断&#xff0c;内部中断分为软中断和异常。 外部中断 来自CPU外部的中断。可屏蔽中断&#xff1a;通过INTR引脚进入CPU&#xff0c;外部设备如硬盘、网卡、打印机等发出的…

动手学无人驾驶(2):车辆检测

上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用&#xff08;动手学无人驾驶&#xff08;1&#xff09;&#xff1a;交通标志识别&#xff09;。 本文介绍如何使用深度学习进行车辆检测&#xff0c;使用到的模型是YOLO模型&#xff0c;关于YOLO模型的具体检测原理&a…

《操作系统真象还原》-阅读笔记(下)

第十一章 任意进程的页目录表第0~767个页目录项属于用户空间&#xff0c;指向用户页表。第768~1023个页目录项指向内核页表。每创建一个新的用户进程,就将内核页目录项复制到用户进程的页目录表&#xff0c;其次需要把用户页目录表中最后一个页目录项更新为用户进程自己的页目…

Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接&#xff1a;进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架&#xff0c;从软件构架的角度说&#xff0c;它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的&#xff0c;可以根据功能把软件拆分成为各个模块&#xff0c;每…

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

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

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接&#xff1a;进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构&#xff1a;一般采用激光雷达作为主要感知传感器&#xff0c;同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等&#xff0c;以NVIDIA Drive PX2 或 Xavier作为主要计算平台&#xff0c;在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接&#xff1a;进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台&#xff0c;帮助他们结合车辆和硬件系统&#xff0c;快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能&#xff0c;这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局&#xff0c;由于系统内存各部分的类型属性不同&#xff0c;bios就按照类型属性来划分这片系统内存&#xff0c;所以这种查询则呈迭代式&#xff0c;每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业&#xff0c;在此表示感谢。课程链接&#xff1a;https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…