MySQL 同步機制

2021-07-04 07:21:46 字數 1866 閱讀 5047

innodb沒有使用作業系統同步機制,而是自己封裝,通過spin(自旋)和wait array(等待佇列)的設計提高效能

目前的cpu都支援tas指令。該指令通過讀取乙個位元組或者乙個word,然後和0比較,並且無條件的將其在記憶體中的值設為1,是原子操作。

用到swap-atomic操作,將記憶體中與暫存器中的值交換。

int test_and_set(volatile

int* addr)

return

1;}

在tas的基礎上,實現的 一種簡單的使用廣泛的一種互斥結構。適合於較短的**(**過長會導致cpu的等待時間過長,造成cpu的浪費)。

//利用spin lock上鎖

void

lock(volatile lock_t* lock_status)

若lock_status的值為0,tas返回0,上鎖成功。若lock_status=1,表示物件正在被使用,進入迴圈,直到物件釋放鎖。

unlock操作,只需將lock_status置為0即可

innodb的mutex物件採用test-and-set命令,和spin lock類似。不同之處在於,若tas返回1,經行自旋操作,一段時間之後若還得不到mutex則進入wait array,等待喚醒。

自旋的目的:

部分**:

void mutex_enter_func(mutex_t* mutex)

loop:

//自旋

while(mutex_get_lock_word(mutex) != 0 && i < sync_spin_rounds)

if (mutex_test_and_set(mutex) == 0)

sync_array_reserve_cell(mutex); // reserve a cell from wait array

mutex_set_waiters(mutex, 1);

for (i = 0; i < 4; i++)

}sync_array_wait_event(wait_array,index);

goto loop;

}

自旋後sync_array_reserve_cell(mutex); 從wait array中分配乙個cell,並將mutex->waiters置為1。(waiters表示是否有執行緒正在等待)然後再迴圈4次進行tas操作,檢測是否能獲得mutex。原因是:

結果沒有執行緒執行,且waiters = 1 導致無限等待。\s

xs相容相容

x不相容

不相容

x-latch與mutex一樣,在得不到latch的時候,先進行自旋,獲取不到再進入wait array。

s-latch有所不同,s-latch不支援遞迴,即乙個執行緒不能執行兩個s-latch。自旋的時候要判斷,最後加進wait array。

wait array 由多個cell組成。 每個cell 儲存等待喚醒的執行緒。有乙個全域性的wait array 物件,sync_primary_wait_array用於對等待latch的執行緒經行喚醒操作。由sync_array_create初始化,預設建立乙個由1000(os_thread_max_n)個cell的陣列。

由sync_array_reserve_cell();為wait array分配cell,每次分配時掃瞄整個陣列。由sync_array_sigal_object檢查佇列中是否有執行緒正在等待,由sync_array_free_cell(); 喚醒執行緒。

[技術支援]:《mysql核心innodb儲存引擎(卷一)》

linux同步機制

一.併發控制 1 自旋鎖 得不到資源,會原地打轉,直到獲得資源為止 定義自旋鎖 spinlock t spin 初始化自旋鎖 spin lock init lock 獲得自旋鎖 spin lock lock 獲得自旋鎖,如果能立即獲得,則馬上返回,否則自旋在那裡,直到該自旋鎖的保持者釋放 spin ...

執行緒同步機制

本週主要學習 執行緒同步機制 互斥量 讀寫鎖和條件變數 和簡單程式的實現,對執行緒同步有了進一步認識 內容如下 執行緒的基本概念,相關函式 互斥量 說明 處於標圓形框之上的線段表示相關的執行緒沒有擁有互斥量 處於圓形框中心線之上的線段表示相關的執行緒等待互斥量 處於圓形框中心線之下的線段表示相關的執...

執行緒同步機制

執行緒同步主要用於協調對臨界資源的訪問,臨界資源可以是硬體裝置 比如印表機 磁碟 檔案 記憶體 變數 陣列 佇列等 執行緒同步有4種機制 他們的主要區別在於 各同步機制詳細的功能說明如下 臨界區臨界區是一段獨佔對某些共享資源訪問的 在任意時刻只允許乙個執行緒對共享資源進行訪問。如果有多個執行緒試圖同...