i.MX6ULL終結者Linux併發與競爭原子操作
1 什麼是原子操作
原子操作,顧名思義,就是說像原子一樣不可再細分不可被中途打斷。一個操作是原子操作,意思就是說這個操作是以原子的方式被執行,要一口氣執行完,執行過程不能夠被系統的其他行為打斷,是一個整體的過程,在其執行過程中,系統的其它行為是插不進來的。
我們現在假設有兩個執行單元A和B,這兩個執行單元要對共享變數X加1,X的初始值是1。當CPU實現加一的操作時,先從記憶體讀取X的值,執行加一的操作,在將X的值寫回記憶體。假如這兩個執行單元A和B是順序執行的,執行過程如圖 1.1:
按照上圖所示的流程,X變數的值最終變為3,經過了兩次加一操作。但是實際的執行流程可能如圖 1.2所示:
按照上述流程執行的最終結果X的值為2,這就是一個最簡單的設定變數值的併發與競爭的例子,要解決這個問題就要保證X變數加一操作的三個步驟要作為一個整體執行,也就是作為一個原子存在。
在linux中提供了兩種形式的原子操作,一種是對整數進行的操作,一種是對單獨的位進行操作,並且Linux核心提供了這兩種形式原子操作的API函式,接下來分別看一下這些函式。
2 整型原子操作
在Linux中有一個專門的atomic_t的結構體來完成整型資料的原子操作,此結構體定義在 include/linux/types.h 檔案中,定義如下:
typedef struct {
int counter;
} atomic_t;
在使用原子操作函式之前,首先要定義一個atomic_t 的變數,如下所示:
atomic_t a; //定義 a
也可以在定義原子變數的時候給原子變數賦初值,如下所示:
atomic_t b = ATOMIC_INIT(0); //定義原子變數 b 並賦初值為 0
可以通過巨集 ATOMIC_INIT 向原子變數賦初值。
原子變數有了,接下來就是對原子變數進行操作,比如讀、寫、增加、減少等等,Linux 核心提供的原子操作 API 函式如下所示:
原子變數和相應的 API 函式使用起來很簡單,參考如下示例:
atomic_t v = ATOMIC_INIT(0); /* 定義並初始化原子變零 v=0 */
atomic_set(10); /* 設定 v=10 */
atomic_read(&v); /* 讀取 v 的值,肯定是 10 */
atomic_inc(&v); /* v 的值加 1,v=11 */
3 位原子操作
位操作也是很常用的操作,Linux 核心也提供了一系列的原子位操作 API 函式,只不過原子位操作不像原子整型變數那樣有個 atomic_t 的資料結構,原子位操作是直接對記憶體進行操作,API 函式如下所示:
函式 作用
相關文章
- Linux 併發與競爭Linux
- 淺談併發的資料競爭(可見性)與競態條件(原子性)
- Linux 併發與競爭實驗學習Linux
- 併發程式設計基礎與原子操作程式設計
- Java 併發包原子操作類解析Java
- 【北京迅為】i.MX6ULL終結者I2C操作原理分析
- GO安全併發之無鎖原子操作Go
- 面試官讓你講講Linux核心的競爭與併發,你該如何回答?面試Linux
- 原子操作與原子型別型別
- i.MX6ULL終結者Linux INPUT子系統實驗執行測試Linux
- 【linux】驅動-12-併發與競態Linux
- 人工智慧會是雲端計算白熱化競爭的終結者嗎?人工智慧
- 023 Rust死靈書之併發、競爭Rust
- 輕鬆檢測Golang併發的資料競爭Golang
- Go併發程式設計之原子操作sync/atomicGo程式設計
- C++11併發程式設計:原子操作atomicC++程式設計
- 《java併發程式設計的藝術》原子操作類Java程式設計
- [Java併發系列] 2.Java中的原子操作類Java
- 從JDK原始碼角度看併發競爭的超時JDK原始碼
- 【Golang】淺談協程併發競爭資源問題Golang
- i.MX6ULL終結者主頻和時鐘配置例程程式設計程式設計
- 原子操作 vs 非原子操作
- Linux 的 OOM 終結者LinuxOOM
- i.MX6ULL終結者Linux檔案系統的構建根檔案系統目錄介紹Linux
- i.MX6ULL終結者Linux檔案系統的構建BusyBox構建根檔案系統Linux
- Java併發之CAS與原子類實現原理講解Java
- 原子操作
- Java併發程式設計(Java Concurrency)(8)- 競爭與臨界區(Race Conditions and Critical Sections)Java程式設計
- Linux或增加VMware支援 讓其與Xen平等競爭(轉)Linux
- 企業競爭情報蒐集與分析
- 谷歌與ChatGPT展開直接競爭谷歌ChatGPT
- 熱點塊競爭與解決
- 年度遊戲的有力競爭者,《死亡迴圈》與背後的Arkane遊戲
- CAS 原子操作
- 併發程式設計的原子性 != 事務ACID的原子性程式設計
- ActiveRecord發update請求的原子操作
- 死磕 java原子類之終結篇(面試題)Java面試題
- 什麼是原子操作?Java如何實現原子操作?Java