【操作系统之十二】分支预测、CPU亲和性(affinity)

摘要:
分支预测技术就是为了解决这个问题。另一方面,根据CPU的不同,预测条件跳转将始终发生。如果此静态预测产生错误,则惩罚是清除后续PipeLine中的指令。执行指令分支后,其TargetAddress也将在BTB中更新,PredictionStatistics也将更新。

一、分支预测

当包含流水线技术的处理器处理分支指令时就会遇到一个问题,根据判定条件的真/假的不同,有可能会产生转跳,而这会打断流水线中指令的处理,因为处理器无法确定该指令的下一条指令,直到分支执行完毕。流水线越长,处理器等待的时间便越长,因为它必须等待分支指令处理完毕,才能确定下一条进入流水线的指令。分支预测技术便是为解决这一问题而出现的。分支预测技术包含编译时进行的静态分支预测和硬件在执行时进行的动态分支预测。

1、静态分支预测
(1)静态预测器
预测条件跳转不发生,因此总是顺序取下一条指令推测执行。仅当条件跳转指令被求值确实发生了跳转,则非顺序的代码地址被加载执行。
另外一种,则预测条件跳转总会发生,因CPU而异。对于这种静态预测如果产生错误,则惩罚就是清空后续的PipeLine中的指令。

(2)LSD:检测CPU是否处于程序的循环语句(for,while,do---while)中,如果处于循环,则会停止分支预测和禁用硬件取指,并且将LSD中的存储的指令流向ReoderBuffer。

2、动态分支预测
基于之前执行的分支信息,处理器对于正在执行的程序所做的决定。
(1)1-bit动态预测:根据该指令上次是否跳转来预测此次是否跳转。如果上次跳转,则预测此次也会跳转

(2)2-bit动态预测器:
当处于00状态时候,预测顺序分支
  预测成功,仍处于00状态
  预测失败,则调整为01状态
当处于01状态时,继续预测顺序分支
  预测成功,则调整为00状态
  预测失败,则调整为10状态
当处于10状态时,预测其他分支
  预测成功,则调整为11状态
  预测失败,则调整为01状态
当处于11状态时,预测其他分支
  预测成功,仍处于11状态
  预测失败,则回退到10状态

【操作系统之十二】分支预测、CPU亲和性(affinity)第1张

变种2-bit动态预测器:

【操作系统之十二】分支预测、CPU亲和性(affinity)第2张

BTB(Branch Target Buffer):
标记分支状态以及分支历史的一段内存被称为BTB,这段内存非常小,仅仅只存储了分支指令地址,以及预测的目标地址,以及预测的位。
当一个分支指令第一次执行时,处理器为该指令分配一个Entry放入BTB中,当指令读取请求的时候,将该指令同步放到L1的Instruction Cache以及BTB中,如果在BTB中Match上该指令,Branch Target Address将会从BTB中被读取。当指令分支执行完毕后,它的Target Address也会在BTB中被更新,Prediction Statistics也同样会更新。

【操作系统之十二】分支预测、CPU亲和性(affinity)第3张

3、对比
通常静态分支预测方法不需要太多硬件资源,不过它会提高编译器的复杂度,同理动态预测方法会增加硬件的复杂度,但是对编译器的要求不会太高。通常动态预测的结果会比较好,并且在编译期后决定分支,对面向对象的代码提供了更好的兼容性。


二、CPU亲和性(affinity)
CPU affinity 是一种调度属性(scheduler property), 它可以将一个进程"绑定" 到一个或一组CPU上.
在SMP(Symmetric Multi-Processing对称多处理)架构下,Linux调度器(scheduler)会根据CPU affinity的设置让指定的进程运行在"绑定"的CPU上,而不会在别的CPU上运行.
Linux调度器同样支持自然CPU亲和性(natural CPU affinity): 调度器会试图保持进程在相同的CPU上运行, 这意味着进程通常不会在处理器之间频繁迁移,进程迁移的频率小就意味着产生的负载小。
因为程序的作者比调度器更了解程序,所以我们可以手动地为其分配CPU核,而不会过多地占用CPU0,或是让我们关键进程和一堆别的进程挤在一起,所有设置CPU亲和性可以使某些程序提高性能。


参考:
处理器结构--分支预测(Branch Prediction)
分支预测
Linux中CPU亲和性(affinity)

linux进程、线程与cpu的亲和性(affinity)

免责声明:文章转载自《【操作系统之十二】分支预测、CPU亲和性(affinity)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jQuery日期弹出选择框Datepicker效果Onvif协议及其在Android下的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

axios 处理超时问题 记录

前言:记录最近两天处理请求超时的逻辑。...

Winform知识点

BringToFront()将控件移动到Z顺序的前面。...

使用Docker构建redis集群

将六个独立的Redis节点关联到主机上的Redis集群中。Redis部落。rb是Redis官方提供的一个ruby脚本,用于构建Redis集群并修改Redis conf将其移动到上部路径/usr/docker_root/redis_Cluster/。受保护模式norequipassa1s2W3l4%Greunbind无法连接到凹坑以构建Redis基本映像。9....

nginx 浏览php的时候会变成下载

php的时候会变成下载:这是因为nginx没有设置好碰到php文件时,要传递到后方的php解释器。当然啦,你的php-fpm解析器也需要正常运行,并监听好9000端口,才能最终生效并有效处理php脚本。windows下开启监听的办法,php-cgi.exe-b127.0.0.1:9000-cphpphp.ini待续:。。。。。...

mongodb 占用内存及解决方法

解决方案是限制Swap的使用:[root@mongodb~]#Sysctl wvm。swap=0查看内存最常用的命令是空闲的:[root@mongodb~]#Free totalused freesharedbuff/cacheavailableEm:78250931925992443Swap:000当新手看到used列中的值太大而Free列中的数值太小时,...

Java注解

Java注解注解实际就是一种元数据为程序元素设置元数据并且可以对程序执行没有影响。目前Java有5个元注解,他们是:Retention描述注解被保留的时间长短,有三个取值分别是:RetentionPolicy.SOURCE、RetentionPolicy.CLASS、RetentionPolicy.RUNTIME如果我们想要通过反射获取注解那么应该使用Ret...