英特尔 64 和 IA-32 |原子操作包括获取/释放语义

2023-11-24

根据 Intel 64 和 IA-32 架构软件开发人员手册,LOCK 信号前缀“确保处理器在信号置位时独占使用任何共享内存”。这可以是总线或高速缓存锁的形式。

但是 - 这就是我问这个问题的原因 - 我不清楚这个前缀是否也提供任何内存障碍。

我正在多处理器环境中使用 NASM 进行开发,需要使用可选的获取和/或释放语义来实现原子操作。

那么,我是否需要使用 MFENCE、SFENCE 和 LFENCE 指令,还是多余的?


不,不需要使用说明MFENCE, SFENCE and LFENCE与...有关系LOCK prefix.

MFENCE, SFENCE and LFENCE指令保证所有CPU内核中内存的可见性。就实例而言MOV指令不能与LOCK前缀,因此为了确保内存移动的结果对所有 CPU 核心都可见,我们必须确保 CPU 缓存已刷新到 RAM,并且我们可以通过栅栏指令到达。

EDIT:有关锁定原子操作的更多信息,请参阅英特尔手册:

锁定原子操作

32 位 IA-32 处理器支持锁定原子 对系统中位置的操作 记忆。这些操作通常是 用于管理共享数据结构 (如信号量、段 描述符、系统段或页 表)其中两个或多个 处理器可能会同时尝试 修改相同的字段或标志。这 处理器使用三个相互依赖的 执行锁定的机制 原子操作:

• 有保证的原子操作

• 总线锁定,使用LOCK#信号和LOCK指令前缀

• 缓存一致性协议,确保可以对缓存数据结构执行原子操作(缓存锁);此机制存在于 Pentium 4、Intel Xeon 和 P6 系列处理器中

这些机制是相互依存的 有以下几种方式。一定基础的 内存事务(例如读取 或在系统内存中写入一个字节) 始终保证得到处理 原子地。也就是说,一旦开始, 处理器保证 操作将在之前完成 另一个处理器或总线代理是 允许访问内存位置。 该处理器还支持总线 锁定以执行选定的内存 操作(例如 读-修改-写操作 共享内存区域)通常 需要原子处理,但是 不会自动以这种方式处理。 因为经常使用内存 位置通常缓存在 处理器的 L1 或 L2 缓存,原子 经常可以进行操作 在处理器的缓存内,无需 断言总线锁定。这里的 处理器的缓存一致性协议 确保其他处理器 缓存相同的内存位置是 原子性的同时管理得当 操作是在缓存上执行的 记忆位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英特尔 64 和 IA-32 |原子操作包括获取/释放语义 的相关文章

  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • 如何在 Debian 上编译 DOS 程序?

    在我的汇编语言课程中 我们使用 DPMI 编写 DOS 程序 不幸的是 我无法一直使用 32 位 Windows 机器 我在我使用的几乎每台计算机上都安装了 Debian 虚拟机 我已经安装了 DOSBox 和 DOSEMU 有什么办法可以
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • Linux内核页表更新

    在linux x86 中分页 每个进程都有它自己的页面目录 页表遍历从 CR3 指向的页目录开始 每个进程共享内核页目录内容 假设三个句子是正确的 假设某个进程进入内核 模式并更新他的内核页目录内容 地址映射 访问 权利等 问题 由于内核地
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • mmap() 和锁定文件

    考虑以下代码片段 故意缺少错误处理 void foo const char path off t size int fd void ret fd open path O RDWR lockf fd F LOCK 0 ret mmap NUL
  • AVX-512 指令编码 - {er} 含义

    在 Intel x86 指令集参考中 有许多 AVX 512 指令在指令中具有可选的 er 例如 VADDPD 的一种形式定义为 EVEX NDS 512 66 0F W1 58 r VADDPD zmm1 k1 z zmm2 zmm3 m
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • 为什么 FMA _mm256_fmadd_pd() 内在函数有 3 个 asm 助记符:“vfmadd132pd”、“231”和“213”?

    有人可以向我解释一下为什么融合乘法累加指令有 3 种变体 vfmadd132pd vfmadd231pd and vfmadd213pd 而只有一个 C 内在函数 mm256 fmadd pd 为了简单起见 在 AT T 语法中 有什么区别
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • 在 x86 程序集中存储大量布尔值的最佳方法是什么?

    最近我一直在处理充满布尔值的大型数组 目前 我将它们存储在 bss部分有一个 space指令 它允许我创建字节数组 但是 由于我只需要存储布尔值 因此我希望从数组中逐位读取和写入数据 目前 我能想到的最好方法是有一个 space指令所需存储
  • 如何使用 Bochs 运行汇编代码?

    我想使用 Bochs 作为 8086 模拟器 是否有捷径可寻 我想要的是类似 emu8086 的东西 http www emu8086 com http www emu8086 com 如果程序的初始部分适合 512 字节 并且您不介意将自
  • 错误 LNK2019:函数 main 中引用的外部符号无法解析

    我正在尝试在 C 中运行我的简单汇编代码 我只有两个文件 cpp 文件和 asm 文件 编译时出现错误 见下文 如果有人可以提供帮助 我将不胜感激 这是我的 main cpp 文件 include
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 高效memcspn

    有谁知道 memcspn 函数的有效实现吗 它的行为应该类似于 strcspn 但在内存缓冲区中查找跨度 而不是在以 null 结尾的字符串中查找跨度 目标编译器是 VisualC 谢谢 卢卡 一种近乎最佳的实现 size t memcsp
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 如何在不饥饿的情况下锁定 std::mutex

    在我的程序中 我有一个互斥体和两个线程 这些线程之一经常获取锁 另一个线程尝试获取但必须永远等待 难道释放锁后获取锁的速度太快 以至于其他线程没有机会获得锁 互斥体总是给每个人一个机会吗 如果没有 什么是一个好的解决方案 某种 FIFO 锁
  • 避免 gcc 函数序言开销?

    我最近遇到了很多 gcc 在 x86 上生成非常糟糕的代码的函数 它们都符合以下模式 if some condition do something really simple and return else something comple
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n

随机推荐

  • 一个 Firefox 扩展,可以更改 about:config 中的值

    我一直在网络上广泛搜索一些微小的光 但一无所获 我需要创建一个 Firefox 扩展 除其他外 它还可以更改 about config 变量之一的值 我找到的教程都没有涵盖这个问题 所以我不知道从哪里开始 谁能给我一个链接 几行代码或解释
  • 如何使用 LINQ 从 List 中获取最接近的数字?

    如何从a中获取最接近的数字List
  • 使用适配器通过 MOXy 或任何其他 JAXB 实现将类编组到根元素

    我有一个类 它扩展了 Apache Commons Configuration 中的 CompositeConfiguration 类 我正在尝试使用 MOXy 将其编组为 XML 我创建了一个 XML 适配器 它将配置转换为简单名称 值对
  • 如何使用 php 删除 json 响应中的反斜杠(“\”)?

    我尝试使用 php 将一行 mysql 查询添加到 JSON 中 我使用这段代码 public function lugaresCercanos lng lat distance result mysql query SELECT nomb
  • 在运行时根据语法构建解析器

    许多 大多数 C 正则表达式库允许在运行时从字符串创建表达式 有谁知道任何 C 解析器生成器允许在运行时将表示为字符串的语法 最好是 BNF 输入到生成器中 我发现的所有实现要么需要运行显式代码生成器 要么需要通过巧妙的模板元编程来表达语法
  • 64 位 Windows 中的汇编系统调用

    我使用的是 Windows 10 安装了 Cygwin 我一直使用 Cygwin 来使用 Cygwin 安装的 gcc 和 nasm 来编译 汇编 c 和汇编程序 据我所知 nasm有一个 f win64模式 因此它可以汇编64位程序 现在
  • 标识列与主键[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我们如何决定使用身份列还是主键 这两个概念并不相互排斥 所有组合都是可能的 身份列也是主
  • 为什么此查询在存储过程中返回不同的结果?

    Synopsis 我有一个查询WHERE包含一个条件的子句 该条件根据可能为 NULL 的参数检查可 NULL 列 如下所示 SELECT FROM Table WHERE NullableColumn NullableParameter
  • Python Tkinter 笔记本小部件

    Using 这个蟒蛇食谱 我在我的 Tk 窗口上创建了一个类似笔记本的小部件 一切正常 直到我尝试将图像添加到每个选项卡中 当我将图像添加到选项卡中时 我最初设置的文本不再显示 我想知道是否可以使文本 在本例中为 选项卡一 显示在图像正下方
  • Node.js 网络库:从“data”事件获取完整数据

    我四处寻找 要么找不到我想要回答的确切问题 要么我需要有人像我 5 岁一样向我解释 基本上 我有一个使用 Net 库的 Node js 脚本 我正在连接到多个主机 发送命令 并监听返回数据 var net require net var n
  • 使用 WKWebView 拉动刷新

    我正在尝试将刷新拉动添加到 WKWebView 在这段代码中 我应该在哪里添加一些东西来允许我触发拉动刷新 我还没有找到任何可行的方法将其添加到我的代码中 因此您不会在下面的代码中找到我尝试完成此操作的任何尝试 我找到的大多数答案都是 Ob
  • 添加高斯噪声

    我有一个 arff文件 其中包含浮点数列表 我需要向每个数字添加高斯噪声 在 MATLAB 中为 m m k randn size m where m是列表中的数字之一 并且k是一个标准差并且有值0 1 是什么C 相当于randn 您能举个
  • Hibernate Envers - 不为 createQuery(...).executeUpdate() 写入审核记录,仅为 .persist() 和 .merge() 写入审核记录

    我有 3 种方式将数据写入数据库 public void create T object entityManager persist object public void update T object object entityManag
  • 寻找一个 O(1) 索引和 O(log(n)) 插入和删除的数据容器

    我不确定这是否可能 但对我来说似乎有点合理 我正在寻找一种允许我执行这些操作的数据结构 插入一个项目的时间复杂度为 O log n 删除一个项目的时间复杂度为 O log n 查找 编辑 O 1 中的第 k 个最小元素 对于任意 k O 1
  • 条带连接错误

    我有以下后端 Node js 代码来连接到我的 Stripe 帐户以进行收费 但我收到这个错误 我正在使用 Firebase 函数 并且此功能以前可以工作 因此我怀疑这与 Firebase 访问限制有关 对此的任何想法和帮助将不胜感激 va
  • Firebase 云消息传递 HTTP V1 API:如何通过 REST 调用获取 Auth 2.0 访问令牌?

    为了使用HTTP V1 API 不是旧版 API 对于 PHP 必须使用 REST 接口 https firebase google com docs cloud messaging send message top of page 我想知
  • 跟踪大型 XML 文件的加载进度

    我尝试跟踪 dotnet C 框架 3 5 SP1 中大 XML 文件 我不是这些文件的提供者 的加载进度 通过网络文件共享从 1 MB 到 300 MB 我使用 XmlReader 进行加载 而不是直接使用 XmlDocument Loa
  • 错误:“致命:使用捆绑安装时我不处理协议“git”

    我的 GemFile 中有以下行 gem rails git gt git github com rails rails git 我收到以下错误 Fetching git github com rails rails git fatal I
  • Kubernetes Pod 中的 OpenVPN 客户端

    我正在研究如何使 OpenVPN 客户端在 Pod 的容器上工作 我解释了我所做的事情 但是您可以跳过我的所有解释并直接提供您的解决方案 如果可行的话 我不在乎将以下所有内容替换为您的步骤 我想让我的容器以外部和内部网络都可以工作的方式使用
  • 英特尔 64 和 IA-32 |原子操作包括获取/释放语义

    根据 Intel 64 和 IA 32 架构软件开发人员手册 LOCK 信号前缀 确保处理器在信号置位时独占使用任何共享内存 这可以是总线或高速缓存锁的形式 但是 这就是我问这个问题的原因 我不清楚这个前缀是否也提供任何内存障碍 我正在多处