什么是记忆围栏?
什么是使用明确的内存围栏?
为了提高性能,现代CPU通常不按顺序执行指令,以最大限度地利用可用的硅片(包括内存读取/写入)。 由于硬件强制指令完整性,所以在单个执行线程中永远不会注意到这一点。 但是对于multithreading或具有易失性内存的环境(例如内存映射I / O),这可能会导致不可预知的行为。
内存围栏/屏障是一类指令,意味着内存读取/写入以您所期望的顺序进行。 例如,“全栅栏”意味着栅栏在栅栏之后的所有读/写之前。
注意内存屏蔽是一个硬件概念。 在较高级别的语言中,我们习惯于处理互斥和信号量 – 这些可以在低层使用内存隔离来实现,而不需要明确使用内存屏障。 使用内存屏障需要仔细研究硬件体系结构,在设备驱动程序中比应用程序代码更常见。
CPU重新sorting与编译器优化不同 – 尽pipe这些工件可能是相似的。 如果可能导致不良行为(例如在C中使用volatile关键字),则需要采取单独的措施来停止编译器重新sorting指令。
将我的答案复制到另一个问题中, 处理器如何优化代码有哪些技巧? :
最重要的将是内存访问重新sorting。
缺less内存隔离或序列化指令,处理器可以自由地重新sorting内存访问。 一些处理器体系结构对它们可重新sorting的次数有限制; 阿尔法被认为是最弱的(即最能重新sorting的)。
在Linux内核源代码文档Documentation / memory-barriers.txt中可以find有关该主题的非常好的处理方法。
大多数情况下,最好使用来自编译器或标准库的locking原语; 这些都经过了充分的testing,应该具备所有必要的内存屏障,并且可能是相当优化的(优化locking原语是非常棘手的,甚至有时候专家也会弄错它们)。
根据我的经验,它指的是内存屏障 ,这是一个指令(显式或隐式)来同步multithreading之间的内存访问。
问题出现在现代积极的编译器(他们有令人惊异的自由重新sorting指令,但通常对你的线程一无所知)和现代多核CPU的组合。
这个问题的一个很好的介绍就是“双重locking破坏声明 ”。 对于很多人来说,这只是龙的起床。
隐式全内存障碍通常包含在平台线程同步例程中,它覆盖了它的核心。 但是,对于无锁编程和实现自定义轻量级同步模式,通常只需要屏障,甚至只需要单向屏障。
维基百科知道所有…
内存屏障,也称为内存或内存围栏,是一类使中央处理单元(CPU)对屏障指令之前和之后发出的内存操作执行sorting约束的指令。
CPU使用性能优化,可能会导致乱序执行,包括内存加载和存储操作。 内存操作重新sorting通常在单个执行线程内不被注意,但是在并发程序和设备驱动程序中会导致不可预知的行为,除非仔细控制。 sorting约束的确切性质取决于硬件,并由架构的内存模型定义。 一些体系结构为执行不同的sorting约束提供了多重障碍。
内存屏障通常用于实现在多个设备共享的内存上运行的低级机器代码。 此类代码包括多处理器系统上的同步原语和无锁数据结构,以及与计算机硬件通信的设备驱动程序。