這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何理解latch,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1.串行化 概述
數(shù)據(jù)庫(kù)系統(tǒng)本身是一個(gè)多用戶并發(fā)處理系統(tǒng),在同一個(gè)時(shí)間點(diǎn)上,可能會(huì)有多個(gè)用戶同時(shí)操作數(shù)據(jù)庫(kù), 多個(gè)用戶同時(shí)在相同的物理位置上寫數(shù)據(jù)時(shí),不能發(fā)生互相覆蓋的情況,這叫做串行化,串行化會(huì)降低系統(tǒng)的并發(fā)性,但這對(duì)于保護(hù)數(shù)據(jù)結(jié)構(gòu)不被破壞來說則是必需的。在Oracle數(shù)據(jù)庫(kù)中,通過閂鎖(latch)和鎖定(lock)來解決這兩個(gè)問題。
閂鎖和鎖定既有相同點(diǎn)又有不同點(diǎn)。相同點(diǎn)在于它們都是用于實(shí)現(xiàn)串行化的資源。而不同點(diǎn)則在于閂鎖(Latch)是一個(gè)低級(jí)別、輕量級(jí)的鎖,獲得和釋放的速度很快,以類似于信號(hào)燈的方式實(shí)現(xiàn)。而鎖定(Lock)則可能持續(xù)的時(shí)間很長(zhǎng),通過使用隊(duì)列,按照先進(jìn)先出的方式實(shí)現(xiàn)。也可以簡(jiǎn)單地理解為閂鎖是微觀領(lǐng)域的,而鎖定則是宏觀領(lǐng)域的。
注意 :latch是用于保護(hù)SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機(jī)制。它不僅僅用于buffer cache, 還用于shared pool以及l(fā)og buffer等。
2.Latch 概述
Oracle數(shù)據(jù)庫(kù)使用閂鎖(latch)來管理SGA內(nèi)存的分配和釋放.Latch是用于保護(hù)SGA區(qū)中共享數(shù)據(jù)結(jié)構(gòu)的一種串行化鎖定機(jī)制。Latch的實(shí)現(xiàn)是與操作系統(tǒng)相關(guān)的,尤其和一個(gè)進(jìn)程是否需要等待一個(gè)latch、需要等待多長(zhǎng)時(shí)間有關(guān)。
Latch是一種能夠極快地被獲取和釋放的鎖,它通常用于保護(hù)描述buffer cache中block的數(shù)據(jù)結(jié)構(gòu)。
3.SPIN與休眠
(1).SPIN
spin 就是一個(gè)進(jìn)程獨(dú)占cpu time,直到運(yùn)行的結(jié)束。這個(gè)期間其他進(jìn)程不能獲得這個(gè)cpu的運(yùn)行時(shí)間。對(duì)于單CPU來說沒有spin概念。
比如數(shù)據(jù)緩存中的某個(gè)塊要被讀取,我們會(huì)獲得這個(gè)塊的 latch,這個(gè)過程叫做spin,另外一個(gè)進(jìn)程恰好要修改這個(gè)塊,他也要spin這個(gè)塊,此時(shí)他必須等待,當(dāng)前一個(gè)進(jìn)程釋放latch后才能spin住,然后修改,如果多個(gè)進(jìn)程同時(shí)請(qǐng)求的話,他們之間將出現(xiàn)競(jìng)爭(zhēng),沒有一個(gè)入隊(duì)機(jī)制,一旦前面進(jìn)程釋放所定,后面的進(jìn)程就蜂擁而上,沒有先來后到的概念,并且這一切都發(fā)生的非常快,因?yàn)長(zhǎng)atch的特點(diǎn)是快而短暫。
(2).休眠
休眠意味著暫時(shí)的放棄CPU,進(jìn)行上下文切換(context switch),這樣CPU要保存當(dāng)前進(jìn)程運(yùn)行時(shí)的一些狀態(tài)信息,比如堆棧,信號(hào)量等數(shù)據(jù)結(jié)構(gòu),然后引入后續(xù)進(jìn)程的狀態(tài)信息,處理完后再切換回原來的進(jìn)程狀態(tài),這個(gè)過程如果頻繁的發(fā)生在一個(gè)高事務(wù),高并發(fā)進(jìn)程的處理系統(tǒng)里面,將是個(gè)很昂貴的資源消耗,所以O(shè)racle選擇了spin,讓進(jìn)程繼續(xù)占有CPU,運(yùn)行一些空指令,之后繼續(xù)請(qǐng)求,繼續(xù)spin,直到達(dá)到_spin_count值,這時(shí)會(huì)放棄CPU,進(jìn)行短暫的休眠,再繼續(xù)剛才的動(dòng)作。初始狀態(tài)下,一個(gè)進(jìn)程會(huì)睡眠0.01秒。然后醒過來,并再次嘗試獲得latch。 進(jìn)程一旦進(jìn)入睡眠狀態(tài),則會(huì)拋出一個(gè)對(duì)應(yīng)的等待事件,并記錄在視圖v$session_wait里,說明當(dāng)前該進(jìn)程正在等待的latch的類型等信息。
4. Latch 的種類
(1).Willing-To-Wait
任何時(shí)候,只有一個(gè)進(jìn)程可以訪問內(nèi)存中的某一個(gè)數(shù)據(jù)塊,如果進(jìn)程因?yàn)閯e的進(jìn)程正占用塊而無(wú)法獲得Latch時(shí),他會(huì)對(duì)CPU進(jìn)行一次spin(旋轉(zhuǎn)),時(shí)間非常的短暫,spin過后繼續(xù)獲取,不成功仍然spin,直到spin次數(shù)到達(dá)閥值限制(這個(gè)由隱含參數(shù)_spin_count指定),此時(shí)進(jìn)程會(huì)停止spin,進(jìn)行短期的休眠,休眠過后會(huì)繼續(xù)剛才的動(dòng)作,直到獲取塊上的Latch為止。
(以下字段反映了 Willing-to-wait 類型請(qǐng)求)
GETS:成功地以 Willing-to-wait 請(qǐng)求類型請(qǐng)求一個(gè) latch 的次數(shù)。
MISSES:初始以 Willing-to-wait 請(qǐng)求類型請(qǐng)求一個(gè) latch 不成功的次數(shù)。
SLEEPS:初始以 Willing-to-wait 請(qǐng)求類型請(qǐng)求一個(gè) latch 不成功后,進(jìn)程等待獲取 latch的次數(shù)。
(2).Immediate
這種類型的latch比較少,對(duì)于這種類型的latch來說,都會(huì)有很多個(gè)可用的latch。當(dāng)一個(gè)進(jìn)程請(qǐng)求其中的一個(gè)latch時(shí),會(huì)以no-wait模式開始請(qǐng)求。如果所請(qǐng)求的latch不可用,則進(jìn)程不會(huì)等待,而是立刻請(qǐng)求另外一個(gè)latch。只有當(dāng)所有的latch都不能獲得時(shí),才會(huì)進(jìn)入等待。
(以下字段反映了 Immediate 類型請(qǐng)求)
IMMEDIATE_GETS:以 Immediate 請(qǐng)求類型成功地獲得一個(gè) latch 的次數(shù)。
IMMEDIATE_MISSES:以 Immediate 請(qǐng)求類型請(qǐng)求一個(gè) latch 不成功的次數(shù)。
5.Latch 獲取過程

6.Latch 和 Lock的區(qū)別
- Latch 的訪問,包括查詢也是互斥的,任何時(shí)候,只能有一個(gè)進(jìn)程能pin住內(nèi)存的某一塊
- latch只作用于內(nèi)存,只能被當(dāng)前實(shí)例訪問,而Lock作用于數(shù)據(jù)庫(kù)對(duì)象
- Latch是瞬間的占用,釋放,Lock的釋放需要等到事務(wù)正確的結(jié)束,他占用的時(shí)間長(zhǎng)短由事務(wù)大小決定
- Latch是非入隊(duì)的,而Lock是入隊(duì)的
- Latch不存在死鎖,而Lock中存在。
7. Latch的cleanup
因異常而長(zhǎng)時(shí)間不能釋放latch的session,pmon每隔3秒會(huì)進(jìn)行清理。
8. Latch的級(jí)別
分為0~14 級(jí)別 , 當(dāng)進(jìn)程占用一個(gè)latch時(shí),只能再請(qǐng)求比它級(jí)別高的latch,如果要請(qǐng)求低級(jí)別的latch,則需要釋放當(dāng)前l(fā)atch。
9. Latch的資源爭(zhēng)用
(1).SQL語(yǔ)句
如果沒有使用綁定變量,很容易造成頻繁讀寫shared pool里的內(nèi)存塊,如果存在大量的SQL被反復(fù)分析,就會(huì)造成很大的Latch爭(zhēng)用和長(zhǎng)時(shí)間的等待, 從而導(dǎo)致與解析SQL相關(guān)的共享池中的Latch爭(zhēng)用 。與 shared pool共享池相關(guān)的latch有Library Cache Latch 和Shared Pool Latch。如果數(shù)據(jù)庫(kù)出現(xiàn)了上述latch的爭(zhēng)用,則有必要檢查下是否有正確使用綁定變量
(2).cache buffer chain
當(dāng)一個(gè)會(huì)話需要去訪問一個(gè)內(nèi)存塊時(shí),它首先要去一個(gè)像鏈表一樣的結(jié)構(gòu)中去搜索這個(gè)數(shù)據(jù)塊是否在內(nèi)存中,當(dāng)會(huì)話訪問這個(gè)鏈表的時(shí)候需要獲得一個(gè)Latch,如果獲取失敗,將會(huì)產(chǎn)生Latch cache buffer chain 等待,導(dǎo)致這個(gè)等待的原因是訪問相同的數(shù)據(jù)塊的會(huì)話太多或者這個(gè)列表太長(zhǎng)(如果讀到內(nèi)存中的數(shù)據(jù)太多,需要管理數(shù)據(jù)塊的hash列表就會(huì)很長(zhǎng),這樣會(huì)話掃描列表的時(shí)間就會(huì)增加,持有chache buffer chain latch的時(shí)間就會(huì)變長(zhǎng),其他會(huì)話獲得這個(gè)Latch的機(jī)會(huì)就會(huì)降低,等待就會(huì)增加)。
(3).Buffer busy waits
當(dāng)一個(gè)會(huì)話需要訪問一個(gè)數(shù)據(jù)塊,而這個(gè)數(shù)據(jù)塊正在被另一個(gè)用戶從磁盤讀取到內(nèi)存中或者這個(gè)數(shù)據(jù)塊正在被另一個(gè)會(huì)話修改時(shí),當(dāng)前的會(huì)話就需要等待,就會(huì)產(chǎn)生一個(gè)buffer busy waits等待。
產(chǎn)生這些Latch爭(zhēng)用的直接原因是太多的會(huì)話去訪問相同的數(shù)據(jù)塊導(dǎo)致熱快問題,造成熱快的原因可能是數(shù)據(jù)庫(kù)設(shè)置導(dǎo)致或者重復(fù)執(zhí)行的SQL 頻繁訪問一些相同的數(shù)據(jù)塊導(dǎo)致。熱塊產(chǎn)生的原因不盡相同,按照數(shù)據(jù)塊的類型,可以分成以下幾種熱塊類型,不同熱塊類型處理的方式都是不同的:表數(shù)據(jù)塊、索引數(shù)據(jù)塊、索引根數(shù)據(jù)塊和文件頭數(shù)據(jù)塊。
上述就是小編為大家分享的如何理解latch了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
分享名稱:如何理解latch-創(chuàng)新互聯(lián)
新聞來源:http://chinadenli.net/article24/dhsdje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、App設(shè)計(jì)、虛擬主機(jī)、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容