中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

什么是CBC latch和buffer pin

發布時間:2021-11-08 15:43:27 來源:億速云 閱讀:251 作者:iii 欄目:關系型數據庫

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

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

當一外部服務向數據庫申請數據的時候,oracle內部進程首先在buffer cache中尋找相關數據,如果buffer cache中沒有相關數據時,就要從相對應的數據文件中找到相對的block,隨后發生物理IO,將其寫入buffer cache中的cache中。這時候,就會出現一個新的問題?buffer cache中有那么多buffer,oracle怎么才能準確的找到自己需要buffer呢?

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

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

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

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

以上都是基于CBC latch處于獨占模式,但是當乙進程也要訪問該latch負責的bucket時,便會進行排隊。這樣就會造成大量的競爭。

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

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

例如

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

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

先討論一下共享狀態下的BH:

甲進程在CBClatch的陪同下,將BH中的buffer pin狀態修改成了S狀態。此時乙進程也在latch的陪同下,也想訪問該BH,但是發現它的狀態是S共享。乙進程會在該BH中留下一個S狀態的buffer pin

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

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广南县| 河曲县| 通辽市| 张家口市| 永嘉县| 板桥市| 越西县| 台前县| 昭苏县| 长沙县| 阳原县| 竹溪县| 金秀| 塔河县| 镇平县| 云安县| 东乡| 通州区| 崇义县| 南平市| 湖北省| 濮阳县| 邵东县| 成武县| 夏邑县| 虎林市| 晋城| 渭源县| 阳西县| 资源县| 定远县| 屏东市| 汕头市| 鄂托克旗| 古交市| 隆昌县| 依安县| 林周县| 崇明县| 韶山市| 新津县|