oracle buffer cache管理機制之lruw_dbwr

wisdomone1發表於2013-04-01

oracle buffer cache的髒資料塊如何被dbwr寫入到資料檔案中;
髒資料塊如何管理,即用lruw進行管理

何為lruw

1,從8i以後,LRUW連結串列同樣包含兩個子連結串列:輔助LRUW連結串列和主LRUW連結串列。那麼LRUW連結串列是如何產生buffer header的呢
2,把lru buffer cache移動到lruw中


/*****摘錄lruw機制如下****/
我們還是接著上面圖五所示的例子來說明。假設這個時候,前臺使用者發出DML語句,要求修改BH2所指向的記憶體資料塊。這時,按順序發生下面的動作:
1) oracle會將BH2從輔助LRU連結串列上摘下,同時插入主LRU連結串列的中間,也就是插入BH1和BH4中間,同時增加BH2的touch的數量。

2) 將該BH2的標記設定為釘住(ping)。/********更改前先ping住***/

3) 更新BH2對應的記憶體資料塊的內容。

4) 更新完以後,取消釘住的標記。/***更改完取消ping**/

5) 將BH2從主LRU連結串列轉移到主LRUW連結串列上。/***從lru移動到主lruw連結串列***是更新完***/

6) 如果這個時候又有程式發出更新BH2所對應的記憶體資料塊的內容,則BH2再次被釘住,更新,取消釘住。

7) DBWR啟動以後,在掃描主LRUW連結串列時會將BH2轉移到輔助LRUW連結串列上。/***dbwr程式先掃描,不是一上來就寫lruw中的髒資料到data file***,先把主lruw移動到輔助lruw連結串列***/

8) DBWR將輔助LRUW連結串列上的BH2對應的資料塊寫入資料檔案。/**dbwr然後才把lruw輔助連結串列的髒資料寫入到datafile&*****/

9) 確認成功寫入資料檔案以後,將BH2從輔助LRUW連結串列上轉移到輔助LRU連結串列上。/*****確認把髒資料從輔助lruw寫完了,然後把輔助連結串列又移動回原來的輔助lru連結串列上***這樣資料還是在記憶體中***/

  從上面的描述中,我們可以看到,
  主LRUW連結串列上包含的buffer header要麼是
   1,已經更新完了的資料塊,
   2,要麼是被釘住正在更新的資料塊。
  而當DBWR程式啟動以後,
  它會掃描主LRUW連結串列,並跳過正在被釘住更新的buffer header,而將已經更新完了的buffer header從主LRUW連結串列上摘除,並轉移到輔助LRUW連結串列上去。
  掃描完主LRUW連結串列,或掃描的buffer header的個數達到一定限度時,DBWR會轉到輔助LRUW上,將上面的buffer header所對應的資料塊寫入資料檔案。
  所以說,對於輔助連結串列上的buffer header來說,要麼是正在等待被寫入的;要麼就是已經發出寫入請求,正在寫入而還沒寫完的。這裡要注意的是,
  buffer header進入LRUW連結串列,是從尾端進入;而DBWR掃描LRUW連結串列時,則是從首端開始。

  順帶提一句,這裡將主LRUW連結串列和輔助LRUW連結串列分開,主要就是為了提高DBWR在主LRUW連結串列上掃描的效率。如果只有主LRUW連結串列而沒有輔助LRUW連結串列的話,
  勢必造成三種型別buffer header交織在LRUW連結串列上:
  1)正在被釘住更新的buffer header;
  2)已經更新完,而正在等待被寫入資料檔案的buffer header;
  3)已經發出寫請求,正在寫而尚未寫完的buffer header。在這種情況下,必然造成DBWR為了找到第二種型別的buffer header而需要掃描不該掃描的第三種型別的buffer header。

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

相關文章