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
繁體地址,請注明出處:http://hk.pswp.cn/news/909009.shtml
英文地址,請注明出處:http://en.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…