內存屏障 - LINUX KERNEL MEMORY BARRIERS 上 與 下

內存屏障(Memory Barrier)是在計算機體系結構中使用的一種同步機制,用于確保在多線程或多核處理器環境中,對共享內存的操作按照預期順序進行。它們通過強制在特定點執行一些指令來規定內存訪問的順序,并防止內存亂序執行帶來的不一致性問題。

內存屏障分為兩種類型:讀屏障(Read Barrier)和寫屏障(Write Barrier)。

讀屏障用于確保在讀操作之前,所有該讀操作之前的寫操作已經完成。它可以防止指令亂序執行,保證讀取到的數據是最新的。

寫屏障用于確保在寫操作之前,所有該寫操作之前的寫操作和讀操作都已經完成。它可以防止指令亂序執行,保證寫入的數據不會被其他操作覆蓋或丟失。

內存屏障的使用能夠解決多線程或多核處理器中的原子性、可見性和有序性等問題,確保程序的正確性和一致性。在編寫并發程序時,合理地使用內存屏障可以提高程序的性能和正確性。

void foo(void)
{a = 1;smp_mb();b = 1;
}void bar(void)
{while (b == 0) continue;assert(a == 1);
}

https://www.kernel.org/doc/Documentation/memory-barriers.txticon-default.png?t=N7T8https://www.kernel.org/doc/Documentation/memory-barriers.txt

Consider the following abstract model of the system::                ::                ::                :+-------+   :   +--------+   :   +-------+|       |   :   |        |   :   |       ||       |   :   |        |   :   |       || CPU 1 |<----->| Memory |<----->| CPU 2 ||       |   :   |        |   :   |       ||       |   :   |        |   :   |       |+-------+   :   +--------+   :   +-------+^       :       ^        :       ^|       :       |        :       ||       :       |        :       ||       :       v        :       ||       :   +--------+   :       ||       :   |        |   :       ||       :   |        |   :       |+---------->| Device |<----------+:   |        |   ::   |        |   ::   +--------+   ::                :

(memory barriers logically act on the dotted line in the following diagram):<--- CPU --->         :       <----------- Memory ----------->:+--------+    +--------+  :   +--------+    +-----------+|        |    |        |  :   |        |    |           |    +--------+|  CPU   |    | Memory |  :   | CPU    |    |           |    |        ||  Core  |--->| Access |----->| Cache  |<-->|           |    |        ||        |    | Queue  |  :   |        |    |           |--->| Memory ||        |    |        |  :   |        |    |           |    |        |+--------+    +--------+  :   +--------+    |           |    |        |:                 | Cache     |    +--------+:                 | Coherency |:                 | Mechanism |    +--------++--------+    +--------+  :   +--------+    |           |    |	      ||        |    |        |  :   |        |    |           |    |        ||  CPU   |    | Memory |  :   | CPU    |    |           |--->| Device ||  Core  |--->| Access |----->| Cache  |<-->|           |    |        ||        |    | Queue  |  :   |        |    |           |    |        ||        |    |        |  :   |        |    |           |    +--------++--------+    +--------+  :   +--------+    +-----------+::

Cache 一致性問題出現的原因是在一個多處理器系統中,每個處理器核心都有獨占的Cache 系統(比如一級 Cache 和二級 Cache),而導致一個內存塊在系統中同時可能有多個備份,從而引起訪問時的不一致性問題。Cache 一致性問題的根源是因為存在多個處理器獨占的 Cache,而不是多個處理器。它的限制條件比較多:多核,獨占 Cache,Cache 寫策略。當其中任一個條件不滿足時便不存在cache一致性問題。

?

?

read: 包含要讀取的CACHE-LINE的物理地址
read response: 包含READ請求的數據,要么由內存滿足要么由cache滿足
invalidate: 包含要invalidate的cache-line的物理地址,所有其他cache必須移除相應的數據項
invalidate ack: 回復消息
read invalidate: 包含要讀取的cache-line的物理地址,同時使其他cache移除該數據。需要read response和invalidate ack消息
writeback:包含要寫回的數據和地址,該狀態將處于modified狀態的lines寫回內存,為其他數據騰出空間

?

void foo(void)
{a = 1;smp_mb();b = 1;
}

smp_mb()指令可以迫使CPU在進行后續store操作前刷新store-buffer。以上面的程序為例,增加memory barrier之后,就可以保證在執行b=1的時候CPU0-store-buffer中的a已經刷新到cache中了,此時CPU1-cache中的a 必然已經標記為invalid。對于CPU1中執行的代碼,則可以保證當b==0為假時,a已經不在CPU1-cache中,從而必須從CPU0- cache傳遞,得到新值“1”

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11765.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

弱網對抗的策略有哪些?

在弱網環境下&#xff0c;數據傳輸可能會面臨丟包、延遲、抖動等問題&#xff0c;因此采取合適的弱網對抗策略對于確保數據傳輸的穩定性和可靠性至關重要。以下是一些常見的弱網對抗策略&#xff1a; 數據壓縮&#xff1a;使用壓縮算法如Gzip、Brotli等對數據進行壓縮&#xf…

Linux-vi/vim

vi是一個文本編輯器&#xff0c;用于撰寫文檔或開發程序 vim是vi的增強版&#xff0c;功能一致&#xff0c;可視化效果更好一些&#xff0c;去鼠標化&#xff0c;編輯更加方便&#xff0c;可定制化 vim編輯器是一個模式化文本編輯工具 vim有三種模式 編輯模式、插入模式和末…

使用PageHelper分頁插件,發現獲取到的total總記錄數量不對,無法獲取到正確的total數量

目錄 1.1、錯誤描述 1.2、解決方案 1.1、錯誤描述 周一在工作中&#xff0c;寫了一個列表分頁的接口&#xff0c;其中使用的是PageHelper分頁依賴&#xff0c;原本想著挺簡單的&#xff0c;也就是使用PageHelper.startPage(pageNum, pageSize);方法就可以了&#xff0c;代碼…

Linux下COOLFluiD源碼編譯安裝及使用

目錄 軟件介紹 基本依賴 其它可選依賴 一、源碼下載 二、解壓縮&#xff08;通過Github下載zip壓縮包格式&#xff09; 三、編譯安裝 3.1 依賴項-BOOST 3.2 依賴項-Parmetis 3.3 依賴項-PETSc 3.4 安裝COOLFluiD 四、算例運行 軟件介紹 COOLFluiD&#xff08;面向對象…

學術共振 美妙發聲 | 2024美沃斯大會完美收官,米蘭柏羽傾力承辦

5月10日-5月12日&#xff0c;為期3天的第十七屆美沃斯醫療美容大會在杭州國際博覽中心盛大舉辦&#xff0c;作為行業頂級學術交流平臺&#xff0c;本屆美沃斯大會不僅是醫美行業的一次學術交流盛會&#xff0c;更是一次深度探討行業未來的遠眺之窗。 5月9日&#xff0c;即美沃…

golang中switch-case及select-cas

switch a{ case b: 執行內容b case c: 執行內容c } golang中case后自帶break跳出功能&#xff0c;既&#xff1a;滿足case b 執行內容b后自動跳出&#xff0c;不會去走case c select { case <- ch1: 執行內容b case -<ch2: 執行內容c default: fmt.Println("chan…

定時備份docker-MySQL中的所有數據庫

backup_mysql.sh #!/bin/bash# 設置備份存儲目錄 backup_dir"/docker/hunqingyun-docker/mysql/backup"# 設置 MySQL 容器名稱和備份文件名 mysql_container"ruoyi-mysql" backup_file"$backup_dir/$(date %Y%m%d%H%M%S).sql"# MySQL root 用戶…

vue-router路由,帶參數的動態路由匹配(2024-05-14)

需求 需要將給定匹配模式的路由映射到同一個組件。例如&#xff0c;我們可能有一個 User 組件&#xff0c;它應該對所有用戶進行渲染&#xff0c;但用戶 ID 不同。在 Vue Router 中&#xff0c;我們可以在路徑中使用一個動態字段來實現&#xff0c;我們稱之為 路徑參數 &#…

添磚Java之路(其五)——封裝,String,StringBuilder類。

封裝&#xff1a; 封裝意義&#xff1a;更好的維護數據&#xff0c;讓使用者無需關心如何使用&#xff0c;只需要知道怎么使用。 Java Bean&#xff1a; 然后我們要知道Java Bean(實體類)標準。 1.對于這個類的成員都需要設為私有&#xff0c;而且要對外提供相應Get,Set的接…

組合商標申請如何風控提高通過率!

最近一個老客戶找到普推知產老楊&#xff0c;說要申請注冊一個新的商標&#xff0c;是一個組合商標&#xff0c;有圖形&#xff0c;兩行文字&#xff0c;一行文字的拼音&#xff0c;還有三個字母的簡稱&#xff0c;組合商標在申請時會進行拆分審查&#xff0c;圖形、文字、拼音…

【C++初階】第十一站:list的介紹及使用

目錄 list的介紹及使用 1.list的含義 2.list的介紹 3.list的使用 1.list的構造 2.list iterator的使用 3.list capacity 4.list element access 5 list modifiers 尾插尾刪 和 頭插頭刪 insert 和 erase resize swap clear 6.list sort and reverse 7.list copy vector copy li…

Java身份證識別接口集成開發示例,身份證查詢接口

人類是有情感的&#xff0c;人們所接觸到的各種事物和信息都會被身體相應器官所接收&#xff0c;然后通過神經元傳入大腦繼而被識別&#xff0c;然后大腦便會產生對該事物的認知和情緒。人們大多喜歡熱情、有趣的事物&#xff0c;對冷冰冰、枯燥、無趣的APP基本是提不起興趣的。…

16.Set、泛型、枚舉、反射、Class

Set Set集合是Collection集合的子接口&#xff0c;元素不能重復&#xff0c;只能有一個null&#xff0c;元素存放無序。 常用子類 HashSet TreeSet LinkedHashSet HashSet 其實底層就是HashMap&#xff0c;當我們構造一個HashSet對象&#xff0c;就是在 new HashSet(); …

23. 合并 K 個升序鏈表 - 力扣(LeetCode)

基礎知識要求&#xff1a; Java&#xff1a;方法、while循環、for循環、PriorityQueue類、if判斷 Python&#xff1a; 方法、while循環、for循環、heapq 模塊、if判斷 數據結構:隊列 題目&#xff1a; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈…

11.php-fpm模板(監控頁面取值)

php-fpm模板(監控頁面取值) 開啟監控頁面配置 #修改php配置文件 vim /etc/php-fpm.d/www.conf pm.status_path /php_status#修改nginx配置文件,添加到nginx配置文件中 vim /etc/nginx/conf.d/default.conflocation /php_status {root html;fastcgi_pass 127.0.…

肥貓“也能變“型男“?揭秘福派斯牛肉高脂貓糧的神奇效果!

福貓養成指南&#xff1a;福派斯牛肉高脂貓糧的優點與考慮因素 福派斯牛肉高脂貓糧&#xff0c;這款富含蛋白質與脂肪的貓糧&#xff0c;仿佛是貓咪世界中的美味佳肴&#xff0c;讓無數貓咪為之傾倒。然而&#xff0c;這款貓糧的利與弊&#xff0c;你是否都了解呢&#xff1f;接…

AI模型部署實戰:利用OpenCV的CUDA模塊加速視覺模型部署流程

本文首發于公眾號【DeepDriving】&#xff0c;歡迎關注。 一. 前言 我在之前的文章《AI模型部署實戰&#xff1a;利用CV-CUDA加速視覺模型部署流程》中介紹了如何使用CV-CUDA庫來加速視覺模型部署的流程&#xff0c;但是CV-CUDA對系統版本和CUDA版本的要求比較高&#xff0c;在…

大模型介紹

大模型通常指的是參數量超過億級別&#xff0c;甚至千億級別的深度學習模型。這類模型能夠處理更加復雜的任務&#xff0c;并在各項基準測試中取得了優異的成績。大模型在自然語言處理、計算機視覺、推薦系統等領域都取得了顯著的成果。 大模型的主要優勢在于其強大的表征能力&…

k8s的核心組件etcd功能詳解【含etcd各類參數詳細說明】

etcd 是 Kubernetes 中的一個關鍵組件&#xff0c;用于存儲集群的配置信息、狀態和元數據。它通常作為 Kubernetes 集群的數據存儲后端&#xff0c;為其他組件提供可靠的分布式鍵值存儲服務。下面我會詳細介紹 etcd 的功能以及常見的參數&#xff0c;以及如何配置和使用 etcd。…

Linux實驗 Shell編程

實驗目的&#xff1a; 熟練掌握Shell程序的建立與執行&#xff1b;掌握Shell變量的兩種類型&#xff08;Shell環境變量和用戶自定義變量&#xff09;及其用法&#xff1b;掌握Shell中的特殊字符、算術與邏輯運算&#xff1b;掌握Shell中輸入輸出命令&#xff1b;掌握Shell程序…