核心同步方法(一) 原子操作

2021-06-20 11:26:02 字數 1254 閱讀 8269

簡介:

現代作業系統中,同一時間可能有多個核心執行流在執行,因此核心需要一些同步機制來同步對共享資料的訪問。而且在對稱多處理器系統(smp)上,也需要同樣的機制。多個執行執行緒同時訪問和運算元據,就有可能出現共享資料被覆蓋的情況,這是一種很難察覺的危險的情況。

原子操作可以保證指令以原子的方式執行,執行期間不會被打斷。本人的理解是原子操作就是保證變數的讀取-寫入-回寫這個過程原子的完成,不能夠被打斷,否則就有可能出現資料被覆蓋的情況。linux核心提供了兩組原子操作介面,分別是整數操作和單獨的位操作。大多數體系結構會提供支援原子操作的簡單指令。也就是把整個操作放到了乙個指令中去執行,不會被中斷打斷(cpu在每條指令結束時候進行中斷檢測)。

原子整數操作:

針對整數的原子操作採用了乙個特殊的資料型別,只能對atomic_t型別的資料進行處理。這裡引入了乙個新的資料型別,而不是使用c語言中的int直接定義乙個整型變數。這樣做讓原子操作之接受atomic_t型別的資料,使之特殊化。這一結構的定義在中。

atomic_t結構:

typedef struct atomic_t
原子操作的函式宣告在中

atomic_init(atomic_t *v,int i) 在宣告乙個atomic_t變數時候,將他初始化為i

int atomic_read(atomic_t *v);  讀取原子變數

void atomic_set(atomic *v,int i);設定原子變數

void atomic_add(int i,atomic *v);原子變數之+i

void atomic_inc(atomic *v);原子變數自加操作

void atomic_dec(atomic *v);原子變數自減操作

int atomic_sub_and_test(int i,atomic_t *v); 原子變數-i,並判斷是否為0

int atomic_add_negative(int i,atomic_t *v); 原子變數+i,並判斷是否為負

int atomic_add_return(int i,atomic_t *v); 原子變數+i,並返回

int atomic_sub_return(int i,atomic_t *v); 原子變數-i,並返回

int atomic_inc_return(atomic_t *v);原子變數自加並返回

int atomic_dec_return(atomic_t * v);原子變數自減並返回

同步與原子操作

這道題做錯了,做個筆記。同步是害怕在操作過程的時候被其他執行緒也進行讀取操作,一旦是原子性的操作就不會發生這種情況。因為一步到位的操作,其他執行緒不可能在中間干涉。另外三項都有讀取 操作兩個步驟,而x 1則是原子性操作。前三個不是原子操作,最後乙個直接賦值,為原子操作。原子 atom 本意是 不能被...

Linux 同步方法例項之原子操作

linux 同步方法例項之原子操作 linux 同步方法例項之原子操作 原子操作定義 原子操作為不可分割的,在執行完畢不會被任何其它任務或事件中斷的操作 標頭檔案位置 usr src kernels 2.6.9 55.el hugemem i686 include asm i386 atomic.h...

linux核心同步機制之原子操作(基於ARM)

linux 使用 乙個變數atomic t來表示原子變數。typedef struct atomic t 可以看到裡面是乙個int 型別的變數。這裡只分析乙個atomic add函式 static inline void atomic add int i,atomic t v 如下,可以看到linu...