ORACLE鎖存器(LATCH)

gaopengtttt發表於2012-05-09
我的讀書筆記:轉載請註明
 
鎖存器:
    什麼是鎖存器: 鎖存器是存在於ORACLE中用於保證一些記憶體結構一致性的輕量級鎖,為什麼說是輕量級的,應該是鎖存器一般等待的時間較短為了保證不發生死鎖,
    鎖存器的級別:鎖存器分為0-13 14種模式,在willing-to-wait模式下只能獲得更改等級的鎖存器,如果想獲得同等級或者更低 級別的鎖存器,就必須使用no-wait模式進行獲取。如果想檢視鎖存器的等級可以參考v$latch,v$latch_children的LEVEL#欄位。
    鎖存器型別:鎖存器型別包括willing-to-wait和no-wait模式
  willing-to-wait模式:這個模式就是要一直等待直到獲得鎖存器為止,在初次獲得latch失敗的情況下,latch會進入spin,直到達到_spin_count的值。
  (這個引數參考如下:
  _spin_count:willing-to-wait 模式的鎖存器在獲得鎖存器失敗的情況下進行迴圈獲取的次數,如果超過了這個次數就進行睡眠,只有1個CPU的機器上不存在自旋   也就是這個引數為1)
  如果在spin過程中任然不能得到latch,這個時候就進入sleep,表現在v$session_wait中就是latch:***
進入了睡眠過後等待喚醒也有2中方式,
     1、可以在進入超時後喚醒重新進行獲取,如果不能得到任然經理spin,如果還不能再進行睡眠,超時的演算法以1/100秒為單位初次隨眠是1、1、2、2、4、4、8、8、16、16最多為2秒,為神馬引入這樣的機制,因為spin也是相當耗費CPU的,所以引入這樣的機制,避免過多的cpu資源浪費。
      2、另外一種方法就是透過鎖存器列表,使用這樣的方式鎖存器很少,比如shared pool,library cache,這種機制說的是使用一個列表來維護等待的程式,如果latch釋放,然後列表中的程式進行競爭獲得latch,列表本生也不是LRU原則,是競爭原則。
   no-wait模式:如果程式項獲得比當前latch更低或者相同級別的latch就必須用這樣的方式,這種方式是為了避免死鎖,這樣的模式不存在spin和sleep,能獲取就獲取如果不能獲取,就透過willing-to-wait模式重新按順序獲取,比如我當前LATCH為level 1,3 如果某個程式項獲取2 level 的latch,就透過no-wait模式,如果是失敗就透過2,3的順序重新獲取。
  相關檢視:
 透過v$latch,v$latch_children檢視的欄位可以看出
 gets 是willing-to-wait模式下需求的次數
 misses 是willing-to-wait模式下到睡眠之前獲取失敗的次數
 spin_gets 是willing-to-wait模式下透過spin成功獲得latch的次數
 sleeps 是willing-to-wait模式睡眠的次數
 immediate_gets 就是no_wait模式下獲得鎖存器成功的次數
 immediate_misses 就是no_wait模式下獲得鎖存器失敗的次數
 wait_time 以毫秒為單位的等待時間 
如果有誤請大蝦指出。thx

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

相關文章