1.通過鎖機制來實現同步,有兩種不同的鎖,一種是鎖被持有時選擇忙等,一種是選擇睡眠等待。
2.如何避免死鎖
a.按順序加鎖
b.不要重複加鎖
3.自旋鎖 spin lock 忙等鎖,樂觀;適合持有時間非常短,這是因為要考慮程序上下文切換的開銷。
4.訊號量 檢視獲取乙個鎖時候,如果不可用則進入睡眠佇列;
struct semaphore 其中count是該訊號可以被多少個程序持有
互斥鎖其實就是count=1的訊號量
5.讀寫屏障
讀寫屏障,避免編譯器對不存在因果關係的指令進行優化重排,而這些指令又存在隱性的因果關係時候導致的異常。
讀屏障,保證屏障之前的讀操作指令一定優先於屏障後的讀指令
寫屏障,保證屏障之前的寫操作指令一定優先於屏障後的寫指令
真正程式設計中,多執行緒對flag標記進行讀寫,例如是否工作的標記,可以使用到的volaile關鍵字是保證直接從記憶體中讀取,而不是從暫存器中讀取。
6.順序鎖
seq鎖是一種樂觀鎖,通過版本號去判斷內容是否被更改,不管讀鎖有沒有被獲取,寫鎖只要沒有被占用即可獲取成功。
Linux核心中的同步機制
與其解釋什麼是同步,倒不如告訴讀者同步的由來。在linux核心中,同步技術是為了解決問題而產生的。說起這個問題,不得不提起可重入核心。可重入核心執行多個程序交替執行,而程序的切換就發生在核心態下。程序的切換就意味著a程序還未執行結束,就要換b程序執行,如果存在全域性變數g,一旦程序切換,這意味著a程...
linux同步機制
一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...
MySQL 同步機制
innodb沒有使用作業系統同步機制,而是自己封裝,通過spin 自旋 和wait array 等待佇列 的設計提高效能 目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。用到swap atomic操作,將記憶體中...