溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是CBC latch和buffer pin

發(fā)布時間:2021-11-08 15:43:27 來源:億速云 閱讀:244 作者:iii 欄目:關(guān)系型數(shù)據(jù)庫

本篇內(nèi)容介紹了“什么是CBC latch和buffer pin”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

CBC 全稱cache buffer chain 。要了解CBClatch和buffer pin之前,首先我們要了解的是當(dāng)一個進(jìn)程想要查詢或者修改數(shù)據(jù)時,oracle都做了一些什么工作。

當(dāng)一外部服務(wù)向數(shù)據(jù)庫申請數(shù)據(jù)的時候,oracle內(nèi)部進(jìn)程首先在buffer cache中尋找相關(guān)數(shù)據(jù),如果buffer cache中沒有相關(guān)數(shù)據(jù)時,就要從相對應(yīng)的數(shù)據(jù)文件中找到相對的block,隨后發(fā)生物理IO,將其寫入buffer cache中的cache中。這時候,就會出現(xiàn)一個新的問題?buffer cache中有那么多buffer,oracle怎么才能準(zhǔn)確的找到自己需要buffer呢?

hash算法中有個重要的概念 bucket,例如oracle想要讀取1號文件第23塊數(shù)據(jù)的時候,它將根據(jù)文件號和塊號計算出hash值為x,然后根據(jù)hash值x直接定位到bucketx,然后oracle便可以讀取該bucket的內(nèi)容。為了避免hash沖突,這個bucket后面一定是一個鏈表,所以在bucket中存在的一定是cbc鏈表頭。當(dāng)進(jìn)程根據(jù)文件號和塊號找到bucketx后,進(jìn)行遍歷,在每個bh中尋到ba,然后就可以準(zhǔn)確的找到相對的buffer了。

了解以上的知識后,當(dāng)一個進(jìn)程訪問buffer時,由于sga是公共內(nèi)存,所以一定要有鎖機(jī)制對sga進(jìn)行保護(hù)。上述進(jìn)程對BH,Bucket訪問時,就會有相對應(yīng)的鎖進(jìn)行保護(hù),這個latch就是CBC latch。當(dāng)甲進(jìn)程找到了bucketx后,甲進(jìn)程必須申請latch,才可以獲得對于BH的訪問權(quán)。由于latch也是占用空間的,所以每個latch管理多個bucket,并不是簡單的1對1的關(guān)系。

當(dāng)甲進(jìn)程獲得了這個latch之后,它就可以對BH進(jìn)行訪問或者修改,當(dāng)對BH進(jìn)行修改時,此時會在BH中加上一道buffer pin的鎖。buffer pin 常用的狀態(tài)有兩種:共享S和獨占X,簡單來說,當(dāng)你進(jìn)行邏輯讀時狀態(tài)便是S,進(jìn)行DML操作時,便是X狀態(tài)。當(dāng)無人訪問的時候,buffer pin 默認(rèn)的狀態(tài)是0,當(dāng)該狀態(tài)被修改時,CBC latch的使命便達(dá)成了。甲進(jìn)程這個時候就可以釋放掉該CBC latch,轉(zhuǎn)而由 buffer pin鎖陪同進(jìn)行下一步的操作。當(dāng)甲進(jìn)程對buffer操作完成之后,在釋放該buffer pin時,這個時候CBC latch會陪同甲進(jìn)程走完最后的行程。

我們要了解CBC latch的兩種模式,一種獨占模式一種共享模式。因為CBC latch保護(hù)的是BH和鏈表。如果沒有對相關(guān)的BH和鏈表進(jìn)行修改,便可以以共享模式申請CBC latch。如果對BH中的buffer pin狀態(tài)進(jìn)行修改的話,便會使用獨占模式。在修改好相關(guān)狀態(tài)時,便會將CBC latch釋放

以上都是基于CBC latch處于獨占模式,但是當(dāng)乙進(jìn)程也要訪問該latch負(fù)責(zé)的bucket時,便會進(jìn)行排隊。這樣就會造成大量的競爭。

當(dāng)CBC latch處于共享模式的時候,該latch便會一直陪甲進(jìn)程直到釋放buffer pin后,自己才會釋放。這樣便是增加了latch加載時間來解決大量競爭的問題。

對于buffer pin來說。我們都知道讀會獲得共享的bufferpin 鎖,寫會獲得獨占的buffer pin 鎖。對于buffer pin鎖的阻塞來說。只要有獨占鎖的時候,便會出現(xiàn)堵塞。

例如

寫寫:甲進(jìn)程獲得了獨占buffer pin鎖,乙進(jìn)程此時也想進(jìn)行寫操作,這時候只能等待甲進(jìn)程釋放

寫讀:甲進(jìn)程獲得了獨占buffer pin鎖,乙進(jìn)程此時想進(jìn)行讀操作,這時候需要等待甲進(jìn)程釋放鎖

先討論一下共享狀態(tài)下的BH:

甲進(jìn)程在CBClatch的陪同下,將BH中的buffer pin狀態(tài)修改成了S狀態(tài)。此時乙進(jìn)程也在latch的陪同下,也想訪問該BH,但是發(fā)現(xiàn)它的狀態(tài)是S共享。乙進(jìn)程會在該BH中留下一個S狀態(tài)的buffer pin

,在該buffer pin狀態(tài)下,將buffer復(fù)制到另一個buffer中,同時生成一個新的BH指向該buffer,完成后釋放CBC latch。此時buffer中多出來一個相同的buffer,但是原buffer的BH中會多出一個status=XCUR列??寺〕龅腂H status是沒有值的。此時乙進(jìn)程再次獲得latch,將原BH的status改為CR,也就是CR塊;新克隆的status便為 XCUR,將buffer pin設(shè)置為X獨占,開始修改buffer。所以這就是讀不會堵塞寫的原因。

如果此時又有一個丙進(jìn)程想要讀該buffer,但是buffer pin是狀態(tài)是x,所以丙進(jìn)程只能等待,也就是常見的buffer busy waits。

“什么是CBC latch和buffer pin”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI