atomicity of memory accesses

文章目录

  • atomicity of memory accesses
    • ✅ 正确认识原子性的边界
      • 对于 **Load**:
      • ✅ 正确的原子性边界是:
      • 对于 **Store**:
      • ✅ 正确的原子性边界是:
    • 🔄 修正原文中的说法(对照分析)
    • ✅ 原子性边界最终澄清总结
  • 为什么 Sequential Consistency的两个核心约束 不提 read atomicity ?
    • 🎯 问题本质
    • ✅ 回答:因为 "Read Atomicity" 本身在 SC 中是隐含成立的,不需要单独强调
      • 🧠 思考路径如下:
      • 1. **Read 是不可观察的副作用**
      • 2. **读的行为完全依赖于写是否可见**
      • 3. **读操作在 SC 中没有并发可见性问题**
    • 📌 举个例子说明
    • ✅ 总结
  • 从实现角度讲,并不需要额外引入“read atomicity”机制,只要确保读不会从“未完成的写”中读到值即可。

atomicity of memory accesses

原子性边界的界定—是理解 memory model 的核心之一。

SC 要求 atomicity of memory accesses , 下面将 memory accesses 进行拆解, 以 更深刻理解 SC 对 atomicity 的要求。


✅ 正确认识原子性的边界

对于 Load

步骤回顾

  1. 地址计算(EA)
  2. 发起访问(向 cache 发 load 请求) ← Issue
  3. 从 cache/mem 返回值 ← Perform point
  4. 写入目标寄存器

✅ 正确的原子性边界是:

  • 第 2 步(issue)第 3 步(fetch 到值)必须原子的部分
  • 原因:这是 load 真正与 memory hierarchy 交互的部分,如果其他 store 在这之间插入,会导致读取到错误值,破坏 SC。

❗注意:写入寄存器不是 memory model 的可见性关键,因此不是原子性边界的一部分。


对于 Store

步骤回顾

  1. 地址计算
  2. 指令 commit,进入 store buffer
  3. 从 store buffer 发起写 cache(store buffer flush)
  4. 写入缓存并完成 coherence 动作(例如 invalidate 或 update)Perform point

✅ 正确的原子性边界是:

  • 第 3 步(issue to cache)第 4 步(完成全局可见性)必须原子的部分
  • 原因:这决定了其他 core 能否读到这个 store 的值,如果这个过程可被插入或拆分,就会打破 memory consistency。

❗所以你说的 store 的 perform 阶段是必须原子的 —— 是完全正确的。


🔄 修正原文中的说法(对照分析)

我之前说:

“Load 的两个阶段(issue, completion)构成其原子性边界。”

→ ✅ 正确,但需要明确 “completion” 是指 从 cache 得到值,不是写入寄存器。

我之前说:

“Store 的边界是从 issue 到 perform(全局可见)。”

→ ✅ 正确,但更精确地讲是:从 store buffer flush 到 coherence 完成 是关键部分。


✅ 原子性边界最终澄清总结

操作类型开始点结束点
Load发起 cache read数据拿到为止
Store发起 cache write数据在所有核心可见为止

为什么 Sequential Consistency的两个核心约束 不提 read atomicity ?

你问得非常到位。这关系到 Sequential Consistency (SC) 模型中的核心假设和设计目标。


🎯 问题本质

你提到的两个约束其实是:

  1. 程序顺序对所有处理器都一致可见:每个处理器的指令(load/store)必须以程序写的顺序在系统中对所有处理器保持一致的顺序
  2. 写操作必须具有原子性(write atomicity):一旦某个处理器看到一个写(store)发生了,那么所有处理器必须同时看到这个写

于是问题来了:

为什么只强调了 Write Atomicity,而没有强调 Read Atomicity?


✅ 回答:因为 “Read Atomicity” 本身在 SC 中是隐含成立的,不需要单独强调


🧠 思考路径如下:

1. Read 是不可观察的副作用

读(load)操作不会对其他核心产生直接可观察的副作用,它只是读取某个内存位置的当前值,并不会改变共享状态。而写操作会改变共享状态,是全局可观察事件。

所以,SC 中只需要定义:写什么时候被"别人"看到;读自然是基于"可见的写"结果。


2. 读的行为完全依赖于写是否可见

在 SC 中,读到的值必须是某个已经完成的写,也就是说:

如果一个 core 看到 x = 1,那么在它看来 x = 1 这个写已经 globally visible 了(write atomicity 确保的)。

读到这个值是"合法"的前提是这个值是来自某个已经发生且"所有人都同意的"写。这一点正是 write atomicity 保证的。

所以 SC 中不需要额外声明 “read atomicity”——读只是在一组可见写中选一个。


3. 读操作在 SC 中没有并发可见性问题

  • 写的非原子性会导致 不同 core 看到不同写入值,所以必须强调 atomicity。
  • 但读不会被“别人看到”,所以不会产生一致性问题

因此,“read atomicity”没有意义:它不是一个互斥事件,也不需要所有 core "看到"某个读行为——它只是个本地动作。


📌 举个例子说明

// P0
x = 1;
y = 1;// P1
if (y == 1)assert(x == 1);

SC 要求:

  • P0 的 store 顺序是 x=1 → y=1
  • 如果 P1 看到 y1,那么由于 store 顺序一致性,它也必须看到 x1(因为 x=1 写在前)

关键是:

  • 写操作(x=1, y=1)必须在所有 core 看起来顺序一致
  • 读操作(y1, x1)只是根据这些写的“时间点”来决定自己的返回值,不存在“可见性”问题

✅ 总结

类型是否强调原子性原因
Write✅ 强调写影响全局状态,需要保证对所有核心同时可见
Read❌ 不强调读只是查询当前状态,不会影响其他核心,不存在多核心“看到”问题

所以:SC 模型中只需要定义 Write Atomicity,Read Atomicity 不是一个有意义的概念。


如果你在考虑更弱的 memory model(如 TSO, RCsc, ARM, RISC-V 等),那时读操作就可能变得“更复杂”,因为 load-store reordering 和缓存的本地视图都会造成读操作行为更微妙。在那种模型下,load 有时也需要 fence 或 acquire-semantics 来保证语义,但那是更进一步的问题了。你也可以继续问这方面的内容。

从实现角度讲,并不需要额外引入“read atomicity”机制,只要确保读不会从“未完成的写”中读到值即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VScode安装配置PYQT6

开始是准备安装PYQT5的,但是安装不下去,就改成安装PYQT6 一.安装pyqt5,成功。 c:\PYQT>pip install pyqt5 Defaulting to user installation because normal site-packages is not writeable Collecting pyqt5 Downloading PyQt5-5.15.…

SpringBoot使用oshi获取服务器相关信息

概念 OSHI是Java的免费基于JNA的(本机)操作系统和硬件信息库。它不需要安装任何其他本机库,并且旨在提供一种跨平台的实现来检索系统信息,例如操作系统版本,进程,内存和CPU使用率,磁盘和分区&a…

Spring Boot 3 集成 MyBatis 连接 MySQL 数据库

Spring Boot 3 集成 MyBatis 连接 MySQL 数据库的步骤&#xff1a; 以下是集成 Spring Boot 3、MyBatis、HikariCP 连接池并操作 MySQL 数据库的完整步骤和代码&#xff1a; 一、创建 Spring Boot 项目 添加以下依赖&#xff1a; <dependencies><!-- Spring Web --…

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统

&#x1f4cc; 文章摘要&#xff1a; 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信&#xff0c;并支持图文多模态数据上传。通过构建 multipart/form-data 请求&#xff0c;配合 ReadableStream 实时读取 AI 回复内容&#xff0c;实现类似 ChatGPT…

YOLOv8 升级之路:主干网络嵌入 SCINet,优化黑暗环境目标检测

文章目录 引言1. 低照度图像检测的挑战1.1 低照度环境对目标检测的影响1.2 传统解决方案的局限性2. SCINet网络原理2.1 SCINet核心思想2.2 网络架构3. YOLOv8与SCINet的集成方案3.1 总体架构设计3.2 关键集成代码3.3 训练策略4. 实验结果与分析4.1 实验设置4.2 性能对比4.3 可视…

所有的Linux桌面环境

Linux操作系统提供了多种桌面环境&#xff0c;每种都有其独特的特点和适用场景。以下是一些常见的Linux桌面环境&#xff1a; 轻量级桌面环境 Xfce&#xff1a;广泛使用的轻量级桌面环境&#xff0c;适合资源有限的设备。Xfce 4.18带来了性能改进和新功能&#xff0c;如Thuna…

@component、@bean、@Configuration的区别

详细解析Spring框架中这三个最核心、也最容易混淆的注解&#xff1a;Component、Bean和Configuration。 为了快速理解&#xff0c;我们先看一个总结性的表格&#xff1a; 注解应用级别作用使用场景Component类级别将类标识为Spring组件&#xff0c;让Spring自动扫描并创建实例…

Android多媒体——音/视同步数据处理(二十)

在多媒体播放过程中,音频数据的处理不仅要保证其解码和输出的连续性,还需要与视频帧保持时间上的严格对齐,以实现良好的观看体验。Android 多媒体框架中的 NuPlayerRenderer 是负责最终渲染音视频数据的核心组件之一。 一、Audio数据处理 NuPlayerRenderer 是 Android 原生…

MYSQL 使用命令mysqldump备份数据库的时候需要用户具备什么权限

背景 之前都是使用数据库root用户备份数据库&#xff0c;没有权限问题&#xff0c;今天使用一个数据库基本用户备份数据库&#xff0c;提示一直没有权限&#xff0c;提示的很明显 mysqldump: Error: Access denied; you need (at least one of) the PROCESS privilege(s) for …

WebRTC源码线程-1

1、概述 本篇主要是简单介绍WebRTC中的线程&#xff0c;WebRTC源码对线程做了很多的封装。 1.1 WebRTC中线程的种类 1.1.1 信令线程 用于与应用层的交互&#xff0c;比如创建offer&#xff0c;answer&#xff0c;candidate等绝大多数的操作 1.1.2 工作线程 负责内部的处理逻辑&…

spring:使用标签xml静态工厂方法获取bean

在spring可以直接通过配置文件获取bean对象&#xff0c;如果获取的bean对象还有若干设置&#xff0c;需要自动完成&#xff0c;可以通过工厂方法获取bean对象。 静态工厂类&#xff0c;其中InterfaceUserDao和InterfaceUserService都是自定义的接口&#xff0c;可以自己替换。…

linux 用户态时间性能优化工具perf/strace/gdb/varlind/gprof

1. perf top -g或者top分析卡顿(cpu占用比较高的函数) gdb 是 GNU 调试器,可以用于分析程序的时间性能。虽然 info time 不是直接用于性能分析的命令,但 gdb 提供了与时间相关的功能,例如通过 timer 命令设置计时器或通过 info proc 查看进程的时间信息。 #include <…

客户端和服务器已成功建立 TCP 连接【输出解析】

文章目录 图片**1. 连接状态解析****第一条记录&#xff08;服务器监听&#xff09;****第二条记录&#xff08;客户端 → 服务器&#xff09;****第三条记录&#xff08;服务器 → 客户端&#xff09;** **2. 关键概念澄清****(1) 0.0.0.0 的含义****(2) 端口号的分配规则** *…

Win系统下的Linux系统——WSL 使用手册

我们在复现一些项目的时候&#xff0c;有些依赖包只能在 linux 环境下使用&#xff0c;还不打算使用远程服务器&#xff0c;那么此时我们可以使用 WSL 创建一个 ubutu 系统&#xff0c;在这个系统里创建虚拟环境、下载依赖包。然后&#xff0c;我们就可以在 windows 下的 vscod…

电脑同时连接内网和外网的方法,附外网连接局域网的操作设置

对于工作一般都设置在内网网段中&#xff0c;而同时由于需求需要连接外网&#xff0c;一般只能通过内网和外网的不断切换进行设置&#xff0c;如果可以同时连接内网和外网会更加便利&#xff0c;同时连接内网和外网方法具体如下。 一、电脑怎么弄可以同时连接内网和外网&#…

C++11:原子操作与内存顺序:从理论到实践的无锁并发实现

文章目录 0.简介1.并发编程需要保证的特性2.原子操作2.1 原子操作的特性 3.内存顺序3.1 顺序一致性3.2 释放-获取&#xff08;Release-Acquire)3.3 宽松顺序&#xff08;Relaxed)3.4 内存顺序 4.无锁并发5. 使用建议 0.简介 在并发编程中&#xff0c;原子性、可见性和有序性是…

oracle 归档日志与RECOVERY_FILE_DEST 视图

1. RECOVERY_FILE_DEST 视图的作用 RECOVERY_FILE_DEST 是 Oracle 数据库用于 管理快速恢复区&#xff08;Fast Recovery Area, FRA&#xff09; 的一个视图。FRA 是 Oracle 提供的一种集中存储恢复相关文件&#xff08;如归档日志、备份文件、闪回日志等&#xff09;的区域。…

零基础玩转物联网-串口转以太网模块如何快速实现与MQTT服务器通信

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件准备 2.3 驱动检查 3 MQTT服务器通信配置与交互 3.1 硬件连接 3.2 开启MQTT服务器 3.3 打开配置工具读取基本信息 3.4 填写连接参数进行连接 3.5 通信测试 4 总结 1 前言 MQTT&#xff1a;全称为消息队列遥测传输协议&#xff08;…

六、Sqoop 导出

作者&#xff1a;IvanCodes 日期&#xff1a;2025年6月7日 专栏&#xff1a;Sqoop教程 Apache Sqoop 不仅擅长从关系型数据库 (RDBMS) 向 Hadoop (HDFS, Hive, HBase) 导入数据&#xff0c;同样也强大地支持反向操作——将存储在 Hadoop 中的数据导出 (Export) 回关系型数据库。…

数据结构-如果将堆结构应用到TOP-K问题上会怎样?

数据结构的应用-如何用堆解决TOP-K问题 前言一、TOP-K问题是什么&#xff1f;二、如何用堆解决TOP-K问题1.怎么建堆&#xff0c;建大堆还是小堆&#xff1f;2.代码实现 总结 前言 本篇文章进行如何用堆结构解决TOP-K问题的讲解 一、TOP-K问题是什么&#xff1f; TOP-k问题&am…