Concurrency 什么是记忆栅栏?

Concurrency 什么是记忆栅栏?,concurrency,memory-fences,Concurrency,Memory Fences,使用显式内存围栏是什么意思?在我的经验中,它指的是一个,它是一个指令(显式或隐式),用于同步多个线程之间的内存访问 问题出现在现代agressive编译器(它们有惊人的自由来重新排序指令,但通常对线程一无所知)和现代多核CPU的组合中 对这个问题的一个很好的介绍是“”。对许多人来说,有龙是一个警钟 隐式全内存障碍通常包含在平台线程同步例程中,它涵盖了它的核心。然而,对于无锁编程和实现定制的轻量级同步模式,您通常只需要屏障,甚至只需要单向屏障 为了提高性能,现代CPU经常无序执行指令,以最大限度地

使用显式内存围栏是什么意思?

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

问题出现在现代agressive编译器(它们有惊人的自由来重新排序指令,但通常对线程一无所知)和现代多核CPU的组合中

对这个问题的一个很好的介绍是“”。对许多人来说,有龙是一个警钟


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

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

内存栅栏/屏障是一类指令,意味着内存读/写按照预期的顺序进行。例如,“完全隔离”是指隔离前的所有读/写操作都在隔离后的读/写操作之前提交

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

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

记忆屏障,也称为记忆棒 或者说记忆栅栏,是一类 导致中心错误的指令 用于强制执行 内存的排序约束 在会议之前和之后发布的操作 障碍教学

CPU采用性能优化 这可能会导致故障 执行,包括内存加载和 商店经营。内存操作 重新排序通常不会引起注意 在单个执行线程中, 但会导致不可预测的行为 并发程序和设备驱动程序 除非小心控制。确切的 排序约束的性质是 硬件相关,并由 体系结构的内存模型。一些 体系结构提供了多种 实施不同政策的障碍 排序约束

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

复制到另一个问题:

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

如果没有内存限制或串行化指令,处理器可以自由地重新排序内存访问。一些处理器架构对它们可以重新排序的数量有限制;众所周知,Alpha是最弱的(即,可以重新排序最多的一个)

在Linux内核源代码文档中,可以找到关于这个主题的非常好的介绍

大多数情况下,最好使用编译器或标准库中的锁定原语;这些都经过了很好的测试,应该具有所有必要的内存障碍,并且可能已经进行了相当优化(优化锁定原语是一件棘手的事情;即使专家有时也会出错)

内存栅栏
内存栅栏
)是一种用于同步的无锁机制多线程。在单线程环境中,重新排序是安全的

问题在于排序、共享资源和缓存。处理器或编译器能够重新排列程序指令(程序员顺序)以进行优化。它会在多线程环境中产生副作用。这就是为什么引入了
内存屏障
,以保证程序正常工作的原因。虽然速度较慢,但它解决了此类问题


我认为volatile不足以停止编译器的重新排序;AFAIK只确保编译器不能缓存变量值。Linux内核使用gcc扩展(asm _volatile _(“::“内存”)来创建完整的编译器优化屏障。没错,volatile不支持线程,但可以使用它来停止编译器应用某些优化-这与fences无关;)(.NET CLR)易失性读取是获取围栏,写入是释放围栏。与MemoryBarrier方法一样,Interlocated ops也很完整。可以在这里找到有关.net中volatile关键字的有趣阅读。该网站包含了许多关于c#developerWorks中线程的有用信息。developerWorks有一篇关于PowerPC内存存储模型的好文章[1]。[1] :它如何影响重新订购的流程?当你说,
Alpha被认为是最弱的
,为什么
最弱的
?这不是更好,它重新排序更多,因此,它将更快地执行?(我不是alpha用户,但询问
非常重新排序
限制重新排序
的效果)。那么,批次重新排序的缺点是什么(除了未定义行为的风险,但我猜,大多数现代CPU应该解决良好的重新排序问题,并且只执行定义的重新排序,否则,它们所做的决策就没有意义了)