许多问题和文章/书籍,如https://mirrors.edge.kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.2018.12.08a.pdf,Preshing的文章,如https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/他的整个系列文章都抽象地讨论了内存排序,根据不同类型的障碍提供的排序和可见性保证。我的问题是如何在x86和ARM micro架构上实现这些障碍和内存排序语义?
对于存储-存储屏障,似乎在x86上,存储缓冲区维护存储的程序顺序并将它们提交到L1D(因此使它们以相同的顺序全局可见)。如果存储缓冲区没有排序,即没有按照程序顺序维护它们,那么存储存储屏障是如何实现的?它只是以这样一种方式“标记”存储缓冲区,即在屏障之前存储在存储之后提交到缓存相干域之前?还是内存屏障实际上会刷新存储缓冲区并停止所有指令,直到刷新完成?它可以两种方式实现吗?
对于加载-加载障碍,如何防止加载-加载重新排序?很难相信x86会按顺序执行所有加载!我假设加载可以无序执行,但按顺序提交/退出。如果是这样,如果一个cpu执行2个加载到2个不同的位置,如何确保一个加载从例如T100获得一个值,而下一个加载在T100上或之后获得它?如果第一个加载在缓存中丢失并等待数据,而第二个加载命中并获取其值怎么办。当加载1获取其值时,它如何确保它获得的值不是来自加载2值的较新存储?如果加载可以无序执行,如何检测违反内存排序的行为?
类似地,加载存储障碍(隐含在x86的所有加载中)是如何实现的,以及存储加载障碍(例如m立方体)是如何实现的?即dmb ld/st和只是dmb指令在ARM上的微架构上做了什么,以及每个加载和每个存储做了什么,以及m立方体指令在x86上做微架构以确保内存排序?
这方面的大部分内容已在其他Q中介绍
在x86上,每个ami加载都是一个获取加载。为了有效地实现这一点,现代x86硬件推测性地提前加载,然后检查该推测。(可能导致内存顺序错误推测管道核武器。)为了跟踪这一点,英特尔将加载和存储缓冲区的组合称为“内存顺序缓冲区”。
弱序ISA不需要推测,它们可以按任意顺序加载。
x86存储顺序是通过仅允许存储以程序顺序从存储缓冲区提交到L1d来维护的。
至少在Intel CPU上,当存储发出时(从前端到ROB RS)会为存储分配一个存储缓冲区条目。所有uops都需要为它们分配一个ROB条目,但某些uops还需要分配其他资源,例如加载或存储缓冲区条目、它们读取/写入的寄存器的RAT条目等。
所以我认为存储缓冲区本身是有序的。当存储地址或存储数据uop执行时,它只会将地址或数据写入其已分配的存储缓冲区条目中。由于commit(释放SB条目)和allocate都是按程序顺序进行的,所以我假设它是一个具有头部和尾部的循环缓冲区,就像ROB一样。(与RS不同)。
避免LoadStore基本上是免费的:加载在执行之前不能退出(从缓存中获取数据)。商店直到退役后才能提交。按顺序退休自动意味着所有以前的加载都在商店“毕业”并准备提交之前完成。
一个弱有序的uarch实际上可以进行加载存储重新排序,它可以在ROB中记录加载并跟踪它们:一旦知道它们没有故障,就让它们退役,即使数据还没有到达。
这似乎更有可能发生在有序内核上,但IDK。因此,您可能有一个已停用的负载,但如果任何东西试图在数据实际到达之前读取它,寄存器目标仍然会停止。我们知道,有序内核实际上是这样工作的,不需要在以后的指令执行之前完成加载。(这就是为什么使用大量寄存器的软件流水线在此类内核上如此有价值,例如实现memcpy。立即在有序内核上读取加载结果会破坏内存并行性。)
如何加载-
对常规存储执行任何操作的唯一屏障指令是mfence,它实际上会暂停内存操作(或整个管道),直到存储缓冲区耗尽。加载和存储是唯一重新排序的指令吗?用更新的微码行为来覆盖Skylake,就像lfence一样。
lford
主要存在于微架构效果中,即阻止以后的指令甚至发出,直到所有以前的指令都离开无序后端(已退休)。lford
fo内存排序的用例几乎不存在。
相关:
\u mm\u sfence()
只会使您的代码比原子线程Geofence(mo\u释放)更慢我对std::memory\u order\u acquire和std::memory\u order\u release的理解如下: Acquire意味着在Acquire fence之后出现的内存访问不能重新排序到fence之前。 释放意味着在释放栅栏之前出现的任何内存访问都可以重新排序为栅栏之后。 我不明白的是,为什么在C 11原子库中,获取界限与加载操作相关联,而发布界限与存储操作相关联。
我已经阅读了一些关于keydove-spring实现的文章(例如:使用keydove轻松保护您的Spring Boot应用程序),但没有人提到如何使用JWT。 我已经创建了zuul api网关,并添加了KeyCloak适配器,如前面链接的文章所述。没关系,但是我想用JWT和钥匙斗篷。 如前所述,将客户端访问类型设置为仅承载,将会话策略设置为NullAuthenticatedSessionStrat
我最近开始使用Node.js,我必须构建一个应该使用多个Express.js服务的体系结构。其中一些服务必须位于一台服务器上,另一台则位于其他服务器上。我想构建一个基础服务(像API网关),但是我不知道在这个网关和微服务之间,或者在两个微服务之间进行通信的合适方式是什么。 目前我正在研究一个基于此的解决方案:
问题内容: 我有一个.a文件,我想从中获取体系结构信息。在中运行结果。如何获得有关文件包含的体系结构的更多信息? 问题答案: 您还可以通过以下命令跳过命令并使用readelf: 如果相关,这里是您可以从中获取的其他信息。我只是用修剪了以上内容: 这是输出为 一个 在目标文件,但它给每个文件相同的信息。
在我的应用程序中,我使用ViewModels为视图提供数据,数据存储库为viewmodel提供数据,并处理与数据源(如数据库、internet API和首选项)的通信。 现在android使用特殊的片段来处理设置。这些特殊片段通过直接写入SharedPreferences来处理设置数据。因此它们不符合MVVM体系结构。我还从API中读取数据,从中提取一些初始设置数据并将其保存在自己的Prefere
我有一个微服务体系结构,它的日志必须发送到远程Kafka主题。在它旁边,本主题的使用者将把日志发送到麋鹿堆栈(另一个团队) 我想要一个专用的微服务(fwk proxy elasticsearch),其职责是收集其他人的日志,并将其发送到远程Kafka主题。 将从我的微服务聚合的所有日志分派到fwk-代理-弹性搜索微服务的最佳协议是什么? 我希望这个模式不会重复远程Kafka主题的安全配置。我想把它