首页 > 其他分享 >关于指令重排

关于指令重排

时间:2022-11-01 23:26:09浏览次数:43  
标签:关于 编译器 屏障 指令 重排 cpu 内存

什么是指令重排

计算机在执行程序时,为了提高性能,编译器和处理器一般会进行指令重排;
1.单线程环境下指令重排后可以保证与顺序执行指令的结果一致(就是不进行指令重排的情况)

//原来的执行顺序
a=1;
b=0;
//进行指令重排后执行
b=0;
a=1;

2.多线程环境下,多个线程交替执行,由于编译器会进行指令重排,结果无法预测。

指令重排的作用
一段代码并不是由单条指令就可以执行完毕的,而是通过流水线技术来执行多条指令。
流水线技术是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,这样就提高了指令的执行速度
简单来说就是通过指令重排,可以使用流水线技术实现指令的细分,然后实现几条指令的并行处理,从而提高速度

volatile是怎么禁止指令重排的?

这就涉及到一个概念内存屏障(内存栅栏),它是一个cpu指令,有两个作用:
保证某些特定操作的执行顺序
保证某些变量的内存可见性(实现了volatile保证可见性)
编译器和处理器都可以进行指令重排,那么如果我们在程序中插入一条Memery Barrier(内存屏障),那么就会告诉编译器和cpu不能对这条指令进行重排,也就是说通过插入内存屏障,使屏障前后的指令不会进行重排优化,内存屏障还可以强制刷出cpu的缓存,因此cpu上的线程都能读到这些数据的最新版本。
简单来说就是插入内存屏障后告诉cpu和编译器,这个内存屏障前后的指令你不要给我进行重排序
内存屏障分为四种:
StoreStore屏障、StoreLoad屏障、LoadLoad屏障、LoadStore屏障。
Load相当于读屏障
Store相当于写屏障

标签:关于,编译器,屏障,指令,重排,cpu,内存
From: https://www.cnblogs.com/xuzhidong/p/16845907.html

相关文章

  • Demo54_关于继承_02_super与this
      子类代码://继承packagecom.oop.Jichen_3;//学生类继承学校类publicclassstudentextendsschool{publicstudent(){//本类的无参构造方法super();......
  • 关于Markdown语法的入门学习与使用
    Markdown介绍(百度扒的)Markdown是一种轻量级标记语言,创始人为约翰·格鲁伯(JohnGruber)。它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文......
  • 关于项目需要装依赖生成node_modules太大的解决办法
    记录一下今天跟大神学到的新的东西:描述:前端的项目需要装依赖,久而久之,每个项目的node_modules就非常的大,实在是太占电脑的内存了,于是大神就找了一个解决办法,亲测有用步骤:......
  • 关于undefined reference to `__stack_chk_fail'踩坑
    有这样两个源文件,main.c文件会引用sub.c内的swap函数和变量,现在将他们编译后链接错误做法​ 这是因为编译源码到目标文件时,若没有加“-fno-stack-protector”,默认会调......
  • 关于BFC
    定义:Blockformattingcontexts块格式化上下文。能包裹住内部(浮动)元素能与外部浮动元素划清界限、产生边界使用方式:常用块级元素的overflow属性不为visible......
  • 关于mysql编码
     参考原文地址:https://www.cnblogs.com/beiyeren/p/3835412.html在开发程序的时候,我们使用mysql数据库开发的时候,有时会碰到自己明明输入的是中文,为什么数据库中存储的......
  • 关于Python封装函数的几道练习题
    1.封装函数,可以判断一个数字是否为偶数deffunc(n):ifn%2==0:print("%d是偶数"%n)else:print("%d是奇数"%n)func(11)#11是奇数2.封装......
  • 关于代理的设置
    环境变量设置代理全局设置代理就使用环境变量配置(这里只针对Linux或者Mac)vim/etc/profile--------------------------------------------http_proxy=IP:PORThttps_pr......
  • 关于Editview失去焦点问题
    项目背景:在一次项目中,需要输入框输入结束后就立即发送注册包给平台以获取网关列表,开始的想法是,监听收起键盘就执行,但是最后没有实现,最后想到了editview失去焦点的事件,一旦......
  • 聊一聊安全且正确使用缓存的那些事 —— 关于缓存可靠性、关乎数据一致性
    大家好,又见面了。本文是笔者作为掘金技术社区签约作者的身份输出的缓存专栏系列内容,将会通过系列专题,讲清楚缓存的方方面面。如果感兴趣,欢迎关注以获取后续更新。在......