技术向|内存屏障(Memory Barriers)--Runtime Time

在讨论CPU的内存屏障之前,让我们先了解一下缓存结构。

缓存(Cache)结构简介

现代计算机系统的缓存结构粗略如下:

每个CPU都有自己的缓存。

缓存(Cache)分为又分多个级别。

一级缓存L1的访问非常接近一个cpu周期(cycles),二级缓存L2的存取可能就要大概10个周期了。

缓存和内存交换数据的最小单元叫Cache Line。它是一个固定长度的块,可能是16到256字节(bytes).

比如一个32位的CPU有1M的缓存,每个Cache Line的大小是64bytes。那么这个缓存就可以有1M*1024*1024/64=16384条Cache Line(s) 。

CPU重排序

CPU以CacheLine为单位,通过Load,Store 和Write-combining等动作: 操作和重拍序缓存。

如果你对SourceControl熟悉:

那么请把内存想象成Source Control的一个仓库。

而每个CPU相当以一个程序员。

而缓存是每个程序员对仓库的一个本地副本。

以此假设:有张三和李四两个程序员,发生如下场景:

X,Y是是仓库里面的两个文件,最初他们的值都是0,张三和李四做了如下操作:

张三在他的副本中(相当于缓存)中更改了X文件的值为1:

Store X 1

Load r1 Y

李四在自己的副本中更改了Y文件的值为1:

Store Y 1

Load r2 Y

就会出现下面的情况,CPU0是张三,李四是CPU1:

结果是:张三的Y文件和李四的X文件都不是最新的。

那么在解决张三和李四的问题之前,请看官们耐心看完下面的四个屏障介绍,如果对四个屏障的Store和Load指令不理解,请移步我的前两篇文章:

CPU的指令分类 和 内存屏障(Memory Barriers)--Compile Time

细说四种内存屏障

这四种屏障也是最接近真实CPU实现的屏障指令。

注意,所有的内存屏障都有防止重排序功能。

即禁止CPU把前面的Load/Store操作排序到屏障后面的Load/Store后面

以LoadLoad为例:它禁止前面的Load(s)操作排序到后面的Load(s)操作之后,其他几个内存屏障一样,不做赘述。

  1. LoadLoad

    屏障之前的Load(s) 操作完才能进行屏障后面的Load(s)。

    这个很类似张三必须对前面的文件从仓库中进行pull下来,他才能进行后面的文件pull。

    这样就保证了张三在进行下面的操作之时,屏障前面的文件是最新的(不能一直最新,因为李四还可能在仍然在改文件)

  2. StoreStore相当于先把屏障前面的文件push到仓库,才能进行后面文件的push操作。

    这样就防止了我上一篇文章的多线程问题,如果没看过请移步内存屏障(Memory Barriers)--Compile Time

  3. LoadStore

    LoadStore 张三必须把前面的pull下来,才能push文件到仓库。主要防止后面的文件改动依赖前面的值

  4. StoreLoad

    StoreLoad 张三必须push文件到仓库以便于让李四可以看见(Visible),然后才能从仓库获取文件。

解决问题

我想你应该知道答案了:

张三:

Store X 1

StoreLoad Barrier

Load r1 Y

LoadLoad Barrier 或者 LoadStore Barrier

李四:

Store Y 1

StoreLoad Barrier

Load r2 Y

LoadLoad Barrier 或者 LoadStore Barrier

这样他们的更新保证对方看见,也及时查看对方的更新。

更多干货,请长按下图关注IT圈圈。

时间: 2024-10-25 19:25:08

技术向|内存屏障(Memory Barriers)--Runtime Time的相关文章

内存屏障 & Memory barrier

Memory Barrier http://www.wowotech.net/kernel_synchronization/memory-barrier.html 这里面讲了Memory Barrier 对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的"所见"和最后的执行结果隔着: 1.编译器 2.CPU取指执行 编译器了解底层CPU的思维模式,因此,它可以在将c翻译成汇编的时候进行优化(例如内存访问指令的重新

Linux内核中的内存屏障解析

缓存一致性 之前一直认为linux中很多东西是用来保证缓存一致性的,其实不是.缓存一致性绝大部分是靠硬件机制实现的,只有在带lock前缀的指令执行时才与cache有一点关系.(这话说得绝对,但我目前看来就是这样)我们更多的时候是为了保证顺序一致性. 所谓缓存一致性,就是在多处理器系统中,每个cpu都有自己的L1 cache.很可能两个不同cpu的L1 cache中缓存的是同一片内存的内容,如果一个cpu更改了自己被缓存的内容,它要保证另一个cpu读这块数据时也要读到这个最新的.不过你不要担心,这

聊聊高并发(三十五)理解内存屏障

在聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了硬件层提供了满足某些一致性需求的能力,Java内存模型利用了硬件层提供的能力指定了一系列的语法和规则,让Java开发者可以隔绝这种底层的实现专注于并发逻辑的开发.这篇我们来看看硬件层是如何提供这些实现一致性需求的能力的. 硬件层提供了一系列的内存屏障 memory barrier / memory fence(Intel的提法)来提供一致性的能力.拿X86平台来说,有几种主要的内存屏障 1. ifence

谈乱序执行和内存屏障【转】

谈乱序执行和内存屏障 10多年前的程序员对处理器乱序执行和内存屏障应该是很熟悉的,但随着计算机技术突飞猛进的发展,我们离底层原理越来越远,这并不是一件坏事,但在有些情况下了解一些底层原理有助于我们更好的工作,比如现代高级语言多提供了多线程并发技术,如果不深入下来,那么有些由多线程造成问题就很难排查和理解. 今天准备来聊聊乱序执行技术和内存屏障.为了能让大多数人理解,这里省略了很多不影响理解的旁枝末节,但由于我个人水平有限,如果不妥之处,希望各位指正. 按顺执行技术 在开始说乱序执行之前,得先把按

内存屏障

原文地址:http://ifeve.com/memory-barriers-or-fences/ 本文我将和大家讨论并发编程中最基础的一项技术:内存屏障或内存栅栏,也就是让一个CPU处理单元中的内存状态对其它处理单元可见的一项技术. CPU使用了很多优化技术来实现一个目标:CPU执行单元的速度要远超主存访问速度.在上一篇文章 “Write Combing (合并写)”中我已经介绍了其中的一项技术.CPU避免内存访问延迟最常见的技术是将指令管道化,然后尽量重排这些管道的执行以最大化利用缓存,从而把

原子操作&优化和内存屏障

原子操作 假定运行在两个CPU上的两个内核控制路径试图执行非原子操作同时"读-修改-写"同一存储器单元.首先,两个CPU都试图读同一单元,但是存储器仲裁器插手,只允许其中的一个访问而让另一个延迟.然而,当第一个读操作已经完成后,延迟的CPU从那个存储器单元正好读到同一个(旧)值.然后,两个CPU都试图向那个存储器单元写一新值,总线存储器访问再一次被存储器仲裁器串行化,最终,两个写操作都成功.但是,全局的结果是不对的,因为两个CPU写入同一(新)值.因此,两个交错的"读-修改-

内存关卡/栅栏 ( Memory Barriers / Fences ) – 译

翻译自:Martin Thompson – Memory Barriers/Fences 在这篇文章里,我将讨论并发编程里最基础的技术–以内存关卡或栅栏著称,那让进程内的内存状态对其他进程可见. CPU 使用了很多技术去尝试和适应这样的事实:CPU 执行单元的性能已远远超出主内存性能.在我的"Writing Combining"文章,我只是谈及其中一种技术.CPU 使用的用来隐藏内存延迟的最普通技术是管线化指令,然后付出巨大努力和资源去尝试重排序这些管线来最小化缓存不命中的有关拖延.

Memory Barriers/Fences(内存关卡/栅栏 —原文)

In this article I'll discuss the most fundamental technique in concurrent programming known as memory barriers, or fences, that make the memory state within a processor visible to other processors. CPUs have employed many techniques to try and accomm

volatile关键字?MESI协议?指令重排?内存屏障?这都是啥玩意

一.摘要 三级缓存,MESI缓存一致性协议,指令重排,内存屏障,JMM,volatile.单拿一个出来,想必大家对这些概念应该有一定了解.但是这些东西有什么必然的联系,或者他们之间究竟有什么前世今生想必是困扰大家的一个问题.为什么有了MESI协议,我们还需要volatile?内存屏障的由来?指令重排带来的问题?下面我们通过分析每一个技术的由来,以及带来的负面影响,跟大家探讨一下这些技术之间的联系.具体每个关键词相关文章也很多不再赘述,只谈个人理解. 二.三级缓存篇 1,三级缓存的由来 CPU的发