溫馨提示×

溫馨提示×

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

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

如何理解latch

發(fā)布時間:2021-11-12 16:24:38 來源:億速云 閱讀:208 作者:柒染 欄目:關(guān)系型數(shù)據(jù)庫

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)如何理解latch,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1.串行化 概述 
數(shù)據(jù)庫系統(tǒng)本身是一個多用戶并發(fā)處理系統(tǒng),在同一個時間點上,可能會有多個用戶同時操作數(shù)據(jù)庫, 多個用戶同時在相同的物理位置上寫數(shù)據(jù)時,不能發(fā)生互相覆蓋的情況,這叫做串行化,串行化會降低系統(tǒng)的并發(fā)性,但這對于保護數(shù)據(jù)結(jié)構(gòu)不被破壞來說則是必需的。在Oracle數(shù)據(jù)庫中,通過閂鎖(latch)和鎖定(lock)來解決這兩個問題。
閂鎖和鎖定既有相同點又有不同點。相同點在于它們都是用于實現(xiàn)串行化的資源。而不同點則在于閂鎖(Latch)是一個低級別、輕量級的鎖,獲得和釋放的速度很快,以類似于信號燈的方式實現(xiàn)。而鎖定(Lock)則可能持續(xù)的時間很長,通過使用隊列,按照先進先出的方式實現(xiàn)。也可以簡單地理解為閂鎖是微觀領(lǐng)域的,而鎖定則是宏觀領(lǐng)域的。
注意 :latch是用于保護SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機制。它不僅僅用于buffer cache, 還用于shared pool以及l(fā)og buffer等。 

2.Latch 概述

Oracle數(shù)據(jù)庫使用閂鎖(latch)來管理SGA內(nèi)存的分配和釋放.Latch是用于保護SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機制。Latch的實現(xiàn)是與操作系統(tǒng)相關(guān)的,尤其和一個進程是否需要等待一個latch、需要等待多長時間有關(guān)。
Latch是一種能夠極快地被獲取和釋放的鎖,它通常用于保護描述buffer cache中block的數(shù)據(jù)結(jié)構(gòu)。

3.SPIN與休眠

(1).SPIN 

spin 就是一個進程獨占cpu time,直到運行的結(jié)束。這個期間其他進程不能獲得這個cpu的運行時間。對于單CPU來說沒有spin概念。
比如數(shù)據(jù)緩存中的某個塊要被讀取,我們會獲得這個塊的 latch,這個過程叫做spin,另外一個進程恰好要修改這個塊,他也要spin這個塊,此時他必須等待,當前一個進程釋放latch后才能spin住,然后修改,如果多個進程同時請求的話,他們之間將出現(xiàn)競爭,沒有一個入隊機制,一旦前面進程釋放所定,后面的進程就蜂擁而上,沒有先來后到的概念,并且這一切都發(fā)生的非???,因為Latch的特點是快而短暫。

(2).休眠
休眠意味著暫時的放棄CPU,進行上下文切換(context switch),這樣CPU要保存當前進程運行時的一些狀態(tài)信息,比如堆棧,信號量等數(shù)據(jù)結(jié)構(gòu),然后引入后續(xù)進程的狀態(tài)信息,處理完后再切換回原來的進程狀態(tài),這個過程如果頻繁的發(fā)生在一個高事務(wù),高并發(fā)進程的處理系統(tǒng)里面,將是個很昂貴的資源消耗,所以O(shè)racle選擇了spin,讓進程繼續(xù)占有CPU,運行一些空指令,之后繼續(xù)請求,繼續(xù)spin,直到達到_spin_count值,這時會放棄CPU,進行短暫的休眠,再繼續(xù)剛才的動作。初始狀態(tài)下,一個進程會睡眠0.01秒。然后醒過來,并再次嘗試獲得latch。 進程一旦進入睡眠狀態(tài),則會拋出一個對應(yīng)的等待事件,并記錄在視圖v$session_wait里,說明當前該進程正在等待的latch的類型等信息。

4. Latch 的種類

(1).Willing-To-Wait

任何時候,只有一個進程可以訪問內(nèi)存中的某一個數(shù)據(jù)塊,如果進程因為別的進程正占用塊而無法獲得Latch時,他會對CPU進行一次spin(旋轉(zhuǎn)),時間非常的短暫,spin過后繼續(xù)獲取,不成功仍然spin,直到spin次數(shù)到達閥值限制(這個由隱含參數(shù)_spin_count指定),此時進程會停止spin,進行短期的休眠,休眠過后會繼續(xù)剛才的動作,直到獲取塊上的Latch為止。

(以下字段反映了 Willing-to-wait 類型請求)
GETS:成功地以 Willing-to-wait 請求類型請求一個 latch 的次數(shù)。
MISSES:初始以 Willing-to-wait 請求類型請求一個 latch 不成功的次數(shù)。

SLEEPS:初始以 Willing-to-wait 請求類型請求一個 latch 不成功后,進程等待獲取 latch的次數(shù)。

(2).Immediate

這種類型的latch比較少,對于這種類型的latch來說,都會有很多個可用的latch。當一個進程請求其中的一個latch時,會以no-wait模式開始請求。如果所請求的latch不可用,則進程不會等待,而是立刻請求另外一個latch。只有當所有的latch都不能獲得時,才會進入等待。

(以下字段反映了 Immediate 類型請求)
IMMEDIATE_GETS:以 Immediate 請求類型成功地獲得一個 latch 的次數(shù)。

IMMEDIATE_MISSES:以 Immediate 請求類型請求一個 latch 不成功的次數(shù)。

5.Latch 獲取過程

如何理解latch

6.Latch 和 Lock的區(qū)別

- Latch 的訪問,包括查詢也是互斥的,任何時候,只能有一個進程能pin住內(nèi)存的某一塊

- latch只作用于內(nèi)存,只能被當前實例訪問,而Lock作用于數(shù)據(jù)庫對象

- Latch是瞬間的占用,釋放,Lock的釋放需要等到事務(wù)正確的結(jié)束,他占用的時間長短由事務(wù)大小決定

- Latch是非入隊的,而Lock是入隊的
- Latch不存在死鎖,而Lock中存在。 

7. Latch的cleanup

因異常而長時間不能釋放latch的session,pmon每隔3秒會進行清理。

8. Latch的級別

分為0~14 級別 , 當進程占用一個latch時,只能再請求比它級別高的latch,如果要請求低級別的latch,則需要釋放當前l(fā)atch。

9. Latch的資源爭用

(1).SQL語句

 如果沒有使用綁定變量,很容易造成頻繁讀寫shared pool里的內(nèi)存塊,如果存在大量的SQL被反復分析,就會造成很大的Latch爭用和長時間的等待, 從而導致與解析SQL相關(guān)的共享池中的Latch爭用 。與 shared pool共享池相關(guān)的latch有Library Cache Latch 和Shared Pool Latch。如果數(shù)據(jù)庫出現(xiàn)了上述latch的爭用,則有必要檢查下是否有正確使用綁定變量

(2).cache buffer chain

當一個會話需要去訪問一個內(nèi)存塊時,它首先要去一個像鏈表一樣的結(jié)構(gòu)中去搜索這個數(shù)據(jù)塊是否在內(nèi)存中,當會話訪問這個鏈表的時候需要獲得一個Latch,如果獲取失敗,將會產(chǎn)生Latch cache buffer chain 等待,導致這個等待的原因是訪問相同的數(shù)據(jù)塊的會話太多或者這個列表太長(如果讀到內(nèi)存中的數(shù)據(jù)太多,需要管理數(shù)據(jù)塊的hash列表就會很長,這樣會話掃描列表的時間就會增加,持有chache buffer chain latch的時間就會變長,其他會話獲得這個Latch的機會就會降低,等待就會增加)。

(3).Buffer busy waits

當一個會話需要訪問一個數(shù)據(jù)塊,而這個數(shù)據(jù)塊正在被另一個用戶從磁盤讀取到內(nèi)存中或者這個數(shù)據(jù)塊正在被另一個會話修改時,當前的會話就需要等待,就會產(chǎn)生一個buffer busy waits等待。
產(chǎn)生這些Latch爭用的直接原因是太多的會話去訪問相同的數(shù)據(jù)塊導致熱快問題,造成熱快的原因可能是數(shù)據(jù)庫設(shè)置導致或者重復執(zhí)行的SQL 頻繁訪問一些相同的數(shù)據(jù)塊導致。熱塊產(chǎn)生的原因不盡相同,按照數(shù)據(jù)塊的類型,可以分成以下幾種熱塊類型,不同熱塊類型處理的方式都是不同的:表數(shù)據(jù)塊、索引數(shù)據(jù)塊、索引根數(shù)據(jù)塊和文件頭數(shù)據(jù)塊。

上述就是小編為大家分享的如何理解latch了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

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

AI