Oracle Mutex實現機制(轉帖)
我們都知道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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [轉帖] 銀河麒麟系統安全機制-KYSEC
- [轉帖]SQL Server 鎖機制 悲觀鎖 樂觀鎖 實測解析SQLServer
- ORACLE鎖機制-轉載Oracle
- oracle工作機制(轉)Oracle
- 轉:Oracle SCN機制解析Oracle
- [轉載]Spring AOP的實現機制Spring
- oracle mutexOracleMutex
- 【轉帖】Oracle中的二進位制、八進位制、十進位制、十六進位制相互轉換函式Oracle函式
- 轉載Oracle SCN機制解析Oracle
- 【轉帖】Oracle Audit 學習快餐Oracle
- Oracle 常用 Dump 命令收集(轉帖)Oracle
- 互斥鎖mutex的簡單實現Mutex
- golang 中 sync.Mutex 的實現GolangMutex
- oracle 給的轉換函式實現 十六進位制---->十進位制Oracle函式
- Oracle RAC Failover 詳解[轉帖]OracleAI
- [轉帖]帶你讀懂Spring 事務——事務的傳播機制Spring
- NX實現機制淺析
- 事務機制如何實現
- FreeTextBox實現機制
- Oracle:cursor:mutex XOracleMutex
- Oracle Mutex 等待事件OracleMutex事件
- 轉:oracle的resetlogs機制淺析Oracle
- [轉帖]
- Go 中的鎖原始碼實現:MutexGo原始碼Mutex
- iOS:利用訊息轉發機制實現多播委託iOS
- C++中實現回撥機制的幾種方式[轉]C++
- [轉帖]Oracle9i Standby (Dataguard) 建立Oracle
- Oracle 分析及動態取樣(轉帖)Oracle
- [轉帖]10 Hardware Components of Oracle ExadataOracle
- Js非同步機制的實現JS非同步
- docker 實現 Redis 的哨兵機制DockerRedis
- Spring AOP 的實現機制Spring
- Spring IOC容器實現機制Spring
- imp_implementationWithBlock()的實現機制BloC
- Objective-C block 實現機制ObjectBloC
- NodeJS實現websocket代理機制NodeJSWeb
- HashMap的內部實現機制HashMap
- spring aop的實現機制Spring