Oracle Mutex實現機制(轉帖)

tingsheng發表於2010-12-01

我們都知道Latch是Oracle用來在記憶體中做序列控制的機構,從10g R2開始,Oracle引入了一個新的技術-Mutex。Mutex並不是Oracle的發明,而是系統提供的一個底層呼叫,Oracle只是利用它實現序列控制的功能,並替換部分Latch。

Mutex中有兩個變數:分別是Holider identifer和Reference count,Holider identifer記錄持有mutex的SID,而Reference count是一個計數,記錄了當前正在以share方式訪問mutex的數量,每當session以share方式持有mutex時,計數會加1,而釋放 時會減1。如果Reference count大於零,則表示該記憶體結構正在被Oracle pin住。

我們看一段虛擬碼,演示mutex的申請過程:

Function Mutex_get(mutex_name)
{
if mutex.holder:=SID
case mode:
'exclusive':
if mutex.ref_count=0
return TRUE
else
mutex.holder.clear;
reture FALSE
end if
'share':
mutex.ref_count++
mutex.holder.clear
return TRUE
end case
else
reture FALSE
end if
}

Mutex是如何實現序列控制的,實際上它是利用了作業系統的一個原子操作CAS(compare-and-swap)實現的。我們看到函式的開始處:mutex.holder:=SID, 將SID賦值給mutex的Holider Identifer,這裡就是一個原子的CAS操作,首先比較mutex.holder是否為空,如果不為空則賦值session的SID。CAS操作由 OS來保證其原子性,在同一時刻這個操所是序列的。如果這個賦值操作失敗,整個申請過程失敗。賦值成功後,如果是share方式,則 mutex.ref_count加1,並清空mutex.holder,如果是exclusive方式,需要判斷mutex.ref_count是否為零 (是否被pin住),如果大於0,則失敗,並清空mutex.holder,如果等於0,則成功,這時不清空mutex.holder,保持當前 session對mutex的exclusive佔用,直到釋放為止。

Mutex相比latch帶來了以下的好處:

1.更少的資源消耗,mutex與latch不同,它不是獨立存在的,而是在每個記憶體結構中,並隨著記憶體結構建立和釋放,mutex同時也被建立和釋放。mutex暫用的空間比latch小很多,建立和釋放消耗更少的資源。

2.有效降低競爭,因為mutex是每個記憶體結構中的一部分,這樣意味著mutex的數量可以有很多,而不同於latch,一個latch需要管理 很多個記憶體結構,當你訪問同一latch管理的不同記憶體結構時,也會發生競爭,而mutex則不會。另外,因為latch的數量有限,很多時候latch 本身的競爭會很厲害,之前,我們只能增加latch數量或者減少latch持有的時間,而現在,mutex是一個更好的選擇。

3.更快的pin,當block被訪問時,它必須被pin在buffer cache中,當一個cursor執行時,它也必須被pin在library cache中,如果大量併發頻繁執行同一個cursor,library cache pin會耗費大量的CPU資源。而mutex使用reference count來解決併發訪問的問題,只要它大於零,就表示它已經被pin在了記憶體中,不能被交換出去。而且mutex.ref_count++這個操所是非 常快的,只佔用非常少的資源。

Mutex申請的過程和latch類似,同樣需要spin和sleep,不同的是Oracle硬編碼了mutex spin的次數為255次(Latch spin的次數預設為2000,由隱含引數_spin_count控制)。latch sleep會隨著等待次數的逐步增加,每次sleep的時間也會逐步增加。而mutex sleep則比較特別,它有三個選項,分別是yield CPU,sleep或者block other process,允許開發人員來決定採用哪種選項。

由於在某些RISC的作業系統中(HP-UNIX),由於系統不支援CAS操作,Oracle通過建立一個latch pool來模擬了CAS操作,被稱為KGX latch,如果你發現系統中存在這種latch競爭,說明作業系統不支援CAS操作,可以通過_kks_use_mutex_pin關閉mutex。

mutex主要使用在library cache中,用來取代原來的library cache pin和library cache lock,關於library cache中鎖的實現機制,我會在另外一篇文章中說明。

–EOF–

注:有關CAS,可以參考wiki上的說明。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7734298/viewspace-680732/,如需轉載,請註明出處,否則將追究法律責任。

相關文章