Oracle Latch & Lock

tolywang發表於2007-08-18

QQ討論摘錄


三國之西蜀 11:11:19

latchlock不同之處是lock是佇列機制

在路上 11:12:47

latch不是防止資料寫出到磁碟裡面嗎?

小熊 11:13:05

lock是佇列機制是因為其功能決定的。

三國之西蜀 11:13:59

是的

在路上 11:14:29

具體怎麼來實現的?

小熊 11:14:31

比如在獲取一個lock的時候,如果lock已經被其它程式獲取,程式就進行排隊以獲取這個LOCK。同時程式進入睡眠

小熊 11:15:37

既然是排隊,肯定是有輪到他的時候(不考慮超時問題),輪到了就叫醒這個程式,這個程式可以繼續處理

下里巴人() 11:16:15

lock相對比latch時間要長 .

小熊 11:16:37

latch相對非常簡單,就是一個test / set的指令。

下里巴人() 11:18:33

就是一個test / set的指令 , 解釋一下

小熊 11:19:36

這個latch就是一個標誌(令牌)。比如初始值為0,表示沒有程式獲取。有一個程式想使用共享記憶體時,test其值為0,就將其set1。另一個程式也要使用時,發現已經被其它程式設為1(test),所以不能獲取這個latch

小熊 11:20:16

最後一句話應該說為:因為這個標誌被其它程式設為了1,因此就不能訪問這個共享記憶體了

小熊 11:20:46

這個程式然後會進行spin狀態。

小熊 11:22:05

當然spin是在多CPU的情況下才會有的(我個人理解,沒有確認過)

小熊 11:23:43

spin就是空轉。就是類似於我們程式中一個迴圈。但在這個迴圈裡面什麼事情都不幹。

小熊 11:24:52

空轉的時候,實際上是程式佔著CPU什麼事情都不幹。

下里巴人() 11:26:00

還要佔用cpu

小熊 11:26:26

因為latch是輕量級的,在多CPU的情況下,這個latch的佔有者程式很可能是用的其它CPU在跑。

小熊 11:27:10

因為latch是輕量級的,因此佔有那個程式很可能會很快就釋放了

下里巴人() 11:27:47

小熊 11:27:39

LATCH是針對共享記憶體的呀,記憶體操作一般都非常快。

小熊 11:28:27

spin完了之後,再去看看latch釋放沒有,沒有就spin。一直達到spin_count這個引數。還沒得到就進入睡眠了

小熊 11:29:14

因為進入睡眠,程式讓出CPUOS對程式進行上下文切換,這個過程也是比較慢的。所以ORACLE選擇了空轉。 以避免進入睡眠狀態

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

相關文章