本篇內(nèi)容介紹了“什么是CBC latch和buffer pin”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)絡(luò)空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,IDC機(jī)房托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國大陸、港澳臺(tái)以及歐美等多個(gè)國家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。
CBC 全稱cache buffer chain 。要了解CBClatch和buffer pin之前,首先我們要了解的是當(dāng)一個(gè)進(jìn)程想要查詢或者修改數(shù)據(jù)時(shí),oracle都做了一些什么工作。
當(dāng)一外部服務(wù)向數(shù)據(jù)庫申請數(shù)據(jù)的時(shí)候,oracle內(nèi)部進(jìn)程首先在buffer cache中尋找相關(guān)數(shù)據(jù),如果buffer cache中沒有相關(guān)數(shù)據(jù)時(shí),就要從相對應(yīng)的數(shù)據(jù)文件中找到相對的block,隨后發(fā)生物理IO,將其寫入buffer cache中的cache中。這時(shí)候,就會(huì)出現(xiàn)一個(gè)新的問題?buffer cache中有那么多buffer,oracle怎么才能準(zhǔn)確的找到自己需要buffer呢?
hash算法中有個(gè)重要的概念 bucket,例如oracle想要讀取1號(hào)文件第23塊數(shù)據(jù)的時(shí)候,它將根據(jù)文件號(hào)和塊號(hào)計(jì)算出hash值為x,然后根據(jù)hash值x直接定位到bucketx,然后oracle便可以讀取該bucket的內(nèi)容。為了避免hash沖突,這個(gè)bucket后面一定是一個(gè)鏈表,所以在bucket中存在的一定是cbc鏈表頭。當(dāng)進(jìn)程根據(jù)文件號(hào)和塊號(hào)找到bucketx后,進(jìn)行遍歷,在每個(gè)bh中尋到ba,然后就可以準(zhǔn)確的找到相對的buffer了。
了解以上的知識(shí)后,當(dāng)一個(gè)進(jìn)程訪問buffer時(shí),由于sga是公共內(nèi)存,所以一定要有鎖機(jī)制對sga進(jìn)行保護(hù)。上述進(jìn)程對BH,Bucket訪問時(shí),就會(huì)有相對應(yīng)的鎖進(jìn)行保護(hù),這個(gè)latch就是CBC latch。當(dāng)甲進(jìn)程找到了bucketx后,甲進(jìn)程必須申請latch,才可以獲得對于BH的訪問權(quán)。由于latch也是占用空間的,所以每個(gè)latch管理多個(gè)bucket,并不是簡單的1對1的關(guān)系。
當(dāng)甲進(jìn)程獲得了這個(gè)latch之后,它就可以對BH進(jìn)行訪問或者修改,當(dāng)對BH進(jìn)行修改時(shí),此時(shí)會(huì)在BH中加上一道buffer pin的鎖。buffer pin 常用的狀態(tài)有兩種:共享S和獨(dú)占X,簡單來說,當(dāng)你進(jìn)行邏輯讀時(shí)狀態(tài)便是S,進(jìn)行DML操作時(shí),便是X狀態(tài)。當(dāng)無人訪問的時(shí)候,buffer pin 默認(rèn)的狀態(tài)是0,當(dāng)該狀態(tài)被修改時(shí),CBC latch的使命便達(dá)成了。甲進(jìn)程這個(gè)時(shí)候就可以釋放掉該CBC latch,轉(zhuǎn)而由 buffer pin鎖陪同進(jìn)行下一步的操作。當(dāng)甲進(jìn)程對buffer操作完成之后,在釋放該buffer pin時(shí),這個(gè)時(shí)候CBC latch會(huì)陪同甲進(jìn)程走完最后的行程。
我們要了解CBC latch的兩種模式,一種獨(dú)占模式一種共享模式。因?yàn)镃BC latch保護(hù)的是BH和鏈表。如果沒有對相關(guān)的BH和鏈表進(jìn)行修改,便可以以共享模式申請CBC latch。如果對BH中的buffer pin狀態(tài)進(jìn)行修改的話,便會(huì)使用獨(dú)占模式。在修改好相關(guān)狀態(tài)時(shí),便會(huì)將CBC latch釋放
以上都是基于CBC latch處于獨(dú)占模式,但是當(dāng)乙進(jìn)程也要訪問該latch負(fù)責(zé)的bucket時(shí),便會(huì)進(jìn)行排隊(duì)。這樣就會(huì)造成大量的競爭。
當(dāng)CBC latch處于共享模式的時(shí)候,該latch便會(huì)一直陪甲進(jìn)程直到釋放buffer pin后,自己才會(huì)釋放。這樣便是增加了latch加載時(shí)間來解決大量競爭的問題。
對于buffer pin來說。我們都知道讀會(huì)獲得共享的bufferpin 鎖,寫會(huì)獲得獨(dú)占的buffer pin 鎖。對于buffer pin鎖的阻塞來說。只要有獨(dú)占鎖的時(shí)候,便會(huì)出現(xiàn)堵塞。
例如
寫寫:甲進(jìn)程獲得了獨(dú)占buffer pin鎖,乙進(jìn)程此時(shí)也想進(jìn)行寫操作,這時(shí)候只能等待甲進(jìn)程釋放
寫讀:甲進(jìn)程獲得了獨(dú)占buffer pin鎖,乙進(jìn)程此時(shí)想進(jìn)行讀操作,這時(shí)候需要等待甲進(jìn)程釋放鎖
先討論一下共享狀態(tài)下的BH:
甲進(jìn)程在CBClatch的陪同下,將BH中的buffer pin狀態(tài)修改成了S狀態(tài)。此時(shí)乙進(jìn)程也在latch的陪同下,也想訪問該BH,但是發(fā)現(xiàn)它的狀態(tài)是S共享。乙進(jìn)程會(huì)在該BH中留下一個(gè)S狀態(tài)的buffer pin
,在該buffer pin狀態(tài)下,將buffer復(fù)制到另一個(gè)buffer中,同時(shí)生成一個(gè)新的BH指向該buffer,完成后釋放CBC latch。此時(shí)buffer中多出來一個(gè)相同的buffer,但是原buffer的BH中會(huì)多出一個(gè)status=XCUR列??寺〕龅腂H status是沒有值的。此時(shí)乙進(jìn)程再次獲得latch,將原BH的status改為CR,也就是CR塊;新克隆的status便為 XCUR,將buffer pin設(shè)置為X獨(dú)占,開始修改buffer。所以這就是讀不會(huì)堵塞寫的原因。
如果此時(shí)又有一個(gè)丙進(jìn)程想要讀該buffer,但是buffer pin是狀態(tài)是x,所以丙進(jìn)程只能等待,也就是常見的buffer busy waits。
“什么是CBC latch和buffer pin”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!