什麼是原子操作?
原子操作:就是在執行某一操作時不被打斷。
Linux原子操作問題來源於中斷、進程的搶佔以及多核smp系統中程序的併發執行。
對於臨界區的操作可以加鎖來保證原子性,對於全局變量或靜態變量操作則需要依賴於硬件平臺的原子變量操作。
因此原子操作有兩類:一類是各種臨界區的鎖,一類是操作原子變量的函數。
對於arm來說,單條彙編指令都是原子的,多核smp也是,因爲有總線仲裁所以cpu可以單獨佔用總線直到指令結束,多核系統中的原子操作通常使用內存柵障(memory barrier)來實現,即一個CPU核在執行原子操作時,其他CPU核必須停止對內存操作或者不對指定的內存進行操作,這樣才能避免數據競爭問題。但是對於load update store這個過程可能被中斷、搶佔,所以arm指令集有增加了ldrex/strex這樣的實現load update store的原子指令。
但是linux種對於c/c++程序(一條c編譯成多條彙編),由於上述提到的原因不能保證原子性,因此linux提供了一套函數來操作全局變量或靜態變量。