久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

什么是CBC latch和buffer pin

157次閱讀
沒有評論

共計 2092 個字符,預計需要花費 6 分鐘才能閱讀完成。

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

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”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注丸趣 TV 網站,丸趣 TV 小編將為大家輸出更多高質量的實用文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-26發表,共計2092字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 雅江县| 巫溪县| 安陆市| 阳春市| 大埔县| 金塔县| 遂昌县| 枝江市| 长阳| 蓬安县| 瑞金市| 阿巴嘎旗| 湟源县| 新巴尔虎右旗| 永昌县| 门源| 资兴市| 车致| 宝鸡市| 蒲江县| 乌恰县| 曲阜市| 门头沟区| 左云县| 博白县| 游戏| 南昌市| 报价| 林西县| 长乐市| 遂平县| 南澳县| 天全县| 尼勒克县| 高雄市| 个旧市| 高淳县| 梁山县| 汝南县| 高阳县| 祁门县|