什么是CBClatch和bufferpin-創(chuàng)新互聯(lián)

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

在南票等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計制作按需開發(fā)網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,南票網(wǎng)站建設(shè)費(fèi)用合理。

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

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

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

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

例如

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

寫讀:甲進(jìn)程獲得了獨(dú)占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列。克隆出的BH status是沒有值的。此時乙進(jìn)程再次獲得latch,將原BH的status改為CR,也就是CR塊;新克隆的status便為 XCUR,將buffer pin設(shè)置為X獨(dú)占,開始修改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)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)頁名稱:什么是CBClatch和bufferpin-創(chuàng)新互聯(lián)
網(wǎng)頁網(wǎng)址:http://muchs.cn/article22/dhdhcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google網(wǎng)站收錄、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站內(nèi)鏈、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司