英特尔 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 |原子操作包括获取/释放语义 的相关文章

随机推荐

  • 一个 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 信号前缀 确保处理器在信号置位时独占使用任何共享内存 这可以是总线或高速缓存锁的形式 但是 这就是我问这个问题的原因 我不清楚这个前缀是否也提供任何内存障碍 我正在多处