- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Java 8 中,三个内存屏障指令被添加到 Unsafe
类(source):
/**
* Ensures lack of reordering of loads before the fence
* with loads or stores after the fence.
*/
void loadFence();
/**
* Ensures lack of reordering of stores before the fence
* with loads or stores after the fence.
*/
void storeFence();
/**
* Ensures lack of reordering of loads or stores before the fence
* with loads or stores after the fence.
*/
void fullFence();
如果我们用以下方式定义内存屏障(我认为或多或少容易理解):
Consider X and Y to be operation types/classes that are subject for reordering,
X_YFence()
is a memory barrier instruction that ensures that all operations of type X before the barrier completed before any operation of type Y after the barrier is started.
Unsafe
到这个术语:
loadFence()
变成 load_loadstoreFence()
; storeFence()
变成 store_loadStoreFence()
; fullFence()
变成 loadstore_loadstoreFence()
; load_storeFence()
、
store_loadFence()
、 0x2513431 和 132513432 ?
最佳答案
概括
CPU 内核具有特殊的内存排序缓冲区,以帮助它们进行乱序执行。这些可以(并且通常是)单独用于加载和存储:用于加载顺序缓冲区的 LOB 和用于存储顺序缓冲区的 SOB。
为 Unsafe API 选择的防护操作是基于以下假设选择的:底层处理器将具有单独的加载顺序缓冲区(用于重新排序加载)、存储顺序缓冲区(用于重新排序存储)。
因此,基于此假设,从软件的角度来看,您可以向 CPU 请求以下三件事之一:
failure
的缓存线最初由 CPU 1 所有,而包含
shutdown
的缓存线最初由 CPU 0 所有。
// CPU 0:
void shutDownWithFailure(void)
{
failure = 1; // must use SOB as this is owned by CPU 1
shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
while (shutdown == 0) { ... }
if (failure) { ...}
}
failure
的值 1 写入存储顺序缓冲区,同时发送缓存一致性消息以获取对缓存行的独占访问。然后它将继续执行下一条指令(在等待独占访问时)并立即更新
shutdown
标志(该缓存线已由 CPU0 独占所有,因此无需与其他内核协商)。最后,当它稍后收到来自 CPU1 的无效确认消息(关于
failure
)时,它将继续处理
failure
的 SOB 并将该值写入缓存(但现在顺序颠倒了)。
// CPU 0:
void shutDownWithFailure(void)
{
failure = 1; // must use SOB as this is owned by CPU 1
SFENCE // next instruction will execute after all SOBs are processed
shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
while (shutdown == 0) { ... }
if (failure) { ...}
}
shutdown
在通往 CPU 1 的途中无法超过
failure
,并专注于另一侧。即使在商店围栏的存在下,也有发生错误的情况。考虑
failure
在两个缓存(共享)中的情况,而
shutdown
仅存在于 CPU0 的缓存中并由其独占拥有。不好的事情可能会发生如下:
failure
;作为缓存一致性协议(protocol)的一部分,它还向 CPU1 发送消息以使其共享缓存行的副本无效。 failure
的 SOB 提交。 shutdown
并且(意识到它缺少该值)发送缓存一致性消息以读取该值。 failure
无效,并立即发送确认。注意:这是使用失效队列实现的,因此实际上它只是输入一个注释(在其 LOB 中分配一个条目)以稍后进行失效,但在发送确认之前实际上并不执行它。 failure
的确认,并通过 SFENCE 进入下一条指令 shutdown
值并将其提交到其本地缓存,继续下一行。 failure
值,但由于无效队列(LOB 注释)尚未处理,它使用其本地缓存中的值 0(不进入 if 块)。 failure
更新为1,但是已经来不及了... // CPU 0:
void shutDownWithFailure(void)
{
failure = 1; // must use SOB as this is owned by CPU 1
SFENCE // next instruction will execute after all SOBs are processed
shutdown = 1; // can execute immediately as it is owned be CPU 0
}
// CPU1:
void workLoop(void)
{
while (shutdown == 0) { ... }
LFENCE // next instruction will execute after all LOBs are processed
if (failure) { ...}
}
loadFence() becomes load_loadstoreFence();
load_storeFence() becomes ???
关于Java 8 不安全 : xxxFence() instructions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23603304/
是否有任何文档或 cecil 源代码的一部分可供我引用以全面了解 cecil 将针对给定的代码 使用哪些Operand 类型> 值(value)?例如:我可以从 MethodBodyRocks 中了解
在 Destroy 之后,我打印了一条 Log 语句,Log 是否会显示为应用程序已经被销毁并且在应用程序被销毁后无法执行任何指令。 @Override protected void onDe
我注意到,在某些情况下(我仍然是 R 的初学者!),多行指令不能“按原样”合并到简单的行指令中。让我们举个例子,这是我最近在网上的一个类: > make.power cube square ma
我做网站已经有一段时间了,我的网站设计不太好?我的老板正在推荐我去上一些课。 但我真的想坚持开发而不是设计吗? 最佳答案 您无需成为设计师。但我强烈建议您了解该过程和使用的一些技术。拥有这些知识将有助
指令微调 是一种技术,它能让大语言模型 (LLMs) 更好地理解和遵循人类的指令。但是,在编程任务中,大多数模型的微调都是基于人类编写的指令 (这需要很高的成本) 或者是由大型专有 LLMs 生成
我开始探索计算机体系结构领域。有两个关于 ISA 的问题让我困惑。 据我所知,ISA有多种,如ARM、MIPS、80x86等。我想知道CPU是否只能专门读取一种ISA。例如,处理器可以同时读取 80x
这只是一个简单的代码,用于检查一个数字是否是质数,我不知道这是编译器还是代码的问题。如果您能提供一些帮助,我们将不胜感激。 这是代码: #include "stdio.h" int main() {
我有以下一段 x86 汇编代码: 1 2 .text 3 4 .data 5 6 # define an array of 3 dwords 7
我理解计算机是图灵完备的概念(具有 MOV 或命令或 SUBNEG 命令,因此能够“合成”其他指令,例如 )。如果这是真的,那么像 x86 这样的 100 条指令的目的是什么?是为了提高效率? 最佳答
我刚刚开始使用Jenkinsfiles和Docker,所以很抱歉,这很明显。 我有一个包含Dockerfile和Jenkins文件的仓库。 Dockerfile通过添加几个依赖项和构建工具,简单地扩展
当指令 LOAD 800 被输入时,我了解其他值如何加载到累加器中,但我不知道如何获得索引和间接寻址的结果。 最佳答案 不确定您正在讨论哪种架构,因此我将尽我所能进行一般性解释(基于更具体架构的经验,
我正在使用反汇编程序(SmartDec:http://decompilation.info/)并且生成的反汇编中的许多指令看起来类似于: mov rax, [rip + 0x32b5]:64 我不熟悉
我的计算机上有一个 python3 脚本,我可以使用 python3motion_detection.py 运行它,并且该脚本有效,我尝试在我的 Raspberry 上使用它,但失败并显示消息非法指令
我遇到了这个错误 /tmp/ccK86fyk.s: Assembler messages: /tmp/ccK86fyk.s:69: Error: bad instruction `sw $3,0(r3
我正在尝试将一些 C/C++ 代码转换为 UNIX shell。我进行了一些转换,但有时,我发现 C/C++ 中的代码很奇怪,可能是因为我在上下文中不理解它。更重要的是,客户端没有给我输入/输出文件或
我已经尝试过 AVX 内在函数。但它导致“test.exe 中 0x00E01555 处出现未处理的异常:0xC000001D:非法指令。” 我使用的是 Visual Studio 2015。异常错误
这个问题在这里已经有了答案: Is the CSS :not() selector supposed to work with distant descendants? (2 个答案) 关闭 7
在Centos 6.2中,我使用gcc 4.8.0编译DPDK代码(dpdk-stable-17.05.2),遇到编译错误。编译命令:make install T=x86_64-native-linu
我正在浏览一些随机的 Java 代码并遇到了这段代码,我试图理解流程并且很难理解类的实际实现,类的实际操作,所以我的基本问题是WhatDoIDo 类实际上做了什么?任何指导将不胜感激。 问:解释由于在
我在 http://www.problemio.com/problems/problem.php 有一个页面,你在右下角看到我有一张蓝绿色的图像。它确实是一个链接,在该链接中我似乎无法让文本颜色显示为
我是一名优秀的程序员,十分优秀!