單核、多核上鎖、同步操作、原子操作
阿新 • • 發佈:2019-01-25
(1) 所有的同步操作最基礎的理論就是原子操作,記憶體屏障、鎖都是為了保證在不同平臺或者cpu下的原子操作。
記憶體屏障作用:
A:在編譯時,拒絕編譯器優化之後的指令
B:在執行時,告訴記憶體地址匯流排,共享資料地址必須同步
鎖是記憶體中一種整型資料,只有兩種狀態:空閒和上鎖。
加鎖過程
1、 read lock
2、 判斷lock狀態
3、 如果已經加鎖,返回失敗
4、 把鎖狀態設定為上鎖
5、 返回成功
(2) 什麼情況下會導致不同執行緒同時得到鎖:
1、 中斷,上面1到5步驟中出現中斷,cpu被搶佔
2、 多核,可以同步在不同核心上處理1到5步驟
(3) 解決辦法
1:單核情況下,可以先關閉中斷,加鎖後再開啟中斷。Test-and-Set就是用來做這個事情的。Test-and-Set主要功能,取出記憶體某一單元的值。還有swap用來交換兩個記憶體單元的值。這兩個命令都是原子性的。
2:單核情況下Test-and-Set不會被中斷打斷所以是原子性的,對於多核來說Test-and-Set就不再是原子性的了。對於多核可以在鎖記憶體匯流排的情況下進行Test-and-Set。原子操作裡面的lock是鎖記憶體匯流排,這裡面的lock是保證執行的執行順序嚴格按照lock前,lock中,lock後的順序執行