原子操作是指不被打斷的操作,即它是最小的執行單位。最簡單的原子操作就是一條條的彙編指令(不包括一些偽指令,偽指令會被彙編器解釋成多條彙編指令)。在 linux 中原子操作對應的資料結構為 atomic_t,定義如下:
typedef
struct
atomic_t;
本質上就是乙個整型變數,之所以定義這麼乙個資料型別,是為了讓原子操作函式只接受 atomic_t 型別的運算元,如果傳入的不是 atomic_t 型別資料,在程式編譯階段就不會通過;另乙個原因就是確保編譯器不會對相應的值進行訪問優化,確保對它的訪問都是對記憶體的訪問,而不是對暫存器的訪問。
arm 處理器有直接對記憶體位址進行賦值的指令(str)。
#define atomic_set(v,i) (((v)->counter) = (i))
用 volatile 來防止編譯器對變數訪問的優化,確保是對記憶體的訪問,而不是對暫存器的訪問。
#define atomic_read(v) (*(volatile int *)&(v)->counter)
使用獨佔指令完成累加操作。
static
inline
void
atomic_add
(int i, atomic_t *v)
對比加操作和減操作的**可以看出,它們非常的相似,其實不同的地方就一句,所以現在最新的核心原始碼中已經使用巨集定義 atomic_op(op, c_op, asm_op) 來重寫了這部分**。
static
inline
void
atomic_sub
(int i, atomic_t *v)
類似的原子操作函式還有一些,比如 atomic_***_return、atomic_cmpxchg、atomic_clear_mask,以及在此基礎上實現的 atomic_inc、atomic_dec、atomic_***_and_test、atomic_***_return等。以上**都是針對 smp 處理器的實現方式,針對非 smp 處理器,由於不存在其他核心的搶占,所以只需要防止其他程序搶占即可實現原子操作,例如加操作:
static
inline
intatomic_sub_return
(int i, atomic_t *v)
原子性操作的實現需要具體體系結構相關的指令集的支援。 原子操作分析
armv6 up and smp safe atomic ops.we use load exclusive and store exclusive to ensure that these are atomic.we may loop static inline void atomic add i...
原子操作實現原理
原子 atomic 本意是 不能被進一步分割的最小粒子 而原子操作 atomic operation 意為 不可被中斷的乙個或一系列操作 1 使用匯流排鎖保證原子性 匯流排鎖就是使用處理器提供的乙個lock 訊號,當乙個處理器在匯流排上輸出此訊號時,其他處理器的請求將被阻塞住,那麼該處理器可以獨佔共...
原子性,原子操作
舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...