什么是记忆围栏?


Answers:


115

为了提高性能,现代CPU经常不按顺序执行指令,以最大程度地利用可用的芯片(包括存储器读/写)。因为硬件会强制执行指令完整性,所以您永远不会在单个执行线程中注意到这一点。但是,对于具有易失性内存(例如,内存映射的I / O)的多个线程或环境,这可能导致无法预测的行为。

内存栅栏/屏障是一类指令,表示内存读/写以您期望的顺序发生。例如,“全栅栏”是指栅栏之前的所有读/写在栅栏之后的所有读/写之前。

注意内存围栏是一个硬件概念。在较高级别的语言中,我们习惯于处理互斥量和信号量-可以使用低级的内存屏障来实现这些互斥量和信号量,而无需显式使用内存屏障。使用内存屏障需要仔细研究硬件体系结构,并且在设备驱动程序中比在应用程序代码中更常见。

CPU的重新排序与编译器的优化不同-尽管伪像可能相似。如果可能导致不良行为(例如,在C中使用volatile关键字),则需要采取单独的措施来停止编译器对指令重新排序。


26
我认为volatile不足以阻止编译器重新排序。AFAIK仅可确保编译器无法缓存变量值。Linux内核使用gcc扩展名(asm __volatile __(“”:::“ memory”)来创建完整的编译器优化障碍。
CesarB

5
是的,volatile是不是线程感知的,但是您可以使用它来阻止编译器进行某些优化-这与篱笆无关;)
Gwaredd

3
(.NET CLR)易失性读取是获取隔离区,写入是释放隔离区。互锁的操作已满,MemoryBarrier方法也已满。
路加·普普利特

3
有关.net中volatile关键字的有趣读物,请参见此处albahari.com/threading/part4.aspx#_NonBlockingSynch该站点包含有关c#中线程的许多有用信息
Bas Smit

developerWorks关于PowerPC内存存储模型有很好的文章[1]。[1]:ibm.com/developerworks/systems/articles/powerpc.html
Iouri Goussev 2011年

17

我的答案复制到另一个问题,处理器优化代码有哪些技巧?

最重要的是内存访问重新排序。

由于没有内存屏障或序列化指令,处理器可以自由地对内存访问进行重新排序。某些处理器体系结构对其可重新排序的数量有限制。Alpha以最弱(即可以重新排序最多的Alpha)而闻名。

可以在Linux内核源代码文档Documentation / memory-barriers.txt中找到对该主题的很好的处理。

大多数时候,最好使用编译器或标准库中的锁定原语。这些都经过了充分的测试,应该具有所有必要的内存屏障,并且可能已经过优化(优化锁定原语很棘手;甚至专家有时也会把它们弄错)。


它如何影响重新排序的流程?当你说Alpha is known for being the weakest,为什么weakest?它重新排序是否更好,因此执行起来会快得多吗?(我不是alpha用户,而是询问very reorderingvs 的影响restricted reordering)。那么,批量重新排序的缺点是什么(除了不确定行为的风险外,但我猜想,大多数现代CPU应该已经解决了良好的重新排序,并且只实现了已定义的重新排序,否则,他们做出的决定就没有意义了)。
牧民

8

以我的经验,它是指 内存屏障,它是一条指令(显式或隐式),用于在多个线程之间同步内存访问。

问题是现代先进的编译器(它们具有惊人的重新排序指令的自由度,但通常对线程一无所知)和现代多核CPU的结合出现。

对这个问题的一个很好的介绍是“ '双重检查锁定已损坏'声明 ”。对于许多人来说,这是一个警醒,那里有龙。

隐式的全内存屏障通常包含在平台线程同步例程中,涵盖了其核心。但是,对于无锁编程和实现自定义的轻量级同步模式,通常只需要障碍,甚至只需要单向障碍。


2

维基百科知道所有...

内存屏障,也称为内存屏障或内存屏障,是一类指令,可使中央处理器(CPU)对在屏障指令之前和之后发出的内存操作强制执行排序约束。

CPU采用的性能优化可能导致乱序执行,包括内存加载和存储操作。内存操作的重新排序通常不会在单个执行线程中引起注意,但会导致并发程序和设备驱动程序中出现不可预测的行为,除非仔细控制。排序约束的确切性质取决于硬件,并由体系结构的内存模型定义。某些体系结构为执行不同的排序约束提供了多个障碍。

当实现在多个设备共享的内存上运行的低级机器代码时,通常使用内存屏障。此类代码包括多处理器系统上的同步原语和无锁数据结构,以及与计算机硬件进行通信的设备驱动程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.