91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何理解latch

發布時間:2021-11-12 16:24:38 來源:億速云 閱讀:216 作者:柒染 欄目:關系型數據庫

這期內容當中小編將會給大家帶來有關如何理解latch,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

2.Latch 概述

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

3.SPIN與休眠

(1).SPIN 

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

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

4. Latch 的種類

(1).Willing-To-Wait

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

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

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

(2).Immediate

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

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

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

5.Latch 獲取過程

如何理解latch

6.Latch 和 Lock的區別

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

- latch只作用于內存,只能被當前實例訪問,而Lock作用于數據庫對象

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

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

7. Latch的cleanup

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

8. Latch的級別

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

9. Latch的資源爭用

(1).SQL語句

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

(2).cache buffer chain

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

(3).Buffer busy waits

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

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

向AI問一下細節

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

AI

涡阳县| 金山区| 黎平县| 明溪县| 沁源县| 德江县| 平阳县| 泾源县| 鹤峰县| 达尔| 鱼台县| 厦门市| 桃源县| 普兰店市| 汝阳县| 梓潼县| 永宁县| 宜兴市| 蒙城县| 平原县| 霍邱县| 栾城县| 华安县| 安福县| 桐乡市| 陵水| 都江堰市| 凤冈县| 金湖县| 蒙山县| 黑龙江省| 毕节市| 石嘴山市| 巨野县| 色达县| 交城县| 平罗县| 军事| 桐城市| 临潭县| 响水县|