什麼是enqueue
本文簡單描述了一下enqueue的基本概念,結構和一些相關的引數,希望對於加深enqueue的理解有點幫助。
什麼是enqueue
enqueue可以做名詞,也可以做動詞來解釋。做名詞時,指的的是一種鎖的型別,比如Txenqueue。做動詞時,則是指將鎖請求放入到請求佇列的操作。
我們知道,lock是一種需要排隊的鎖實現機制,這和latch是不一樣的,latch是一種輕量級的鎖,是不需要排隊得。Enqueue就是lock的排隊機制的實現。
lock是用來實現對於共享資源的併發訪問的。如果兩個session請求的lock是相容的,則可以同時鎖定資源,如果兩個session請求的lock是不相容的,則其中一個session必須等待另外一個session釋放其持有的lock後,才能獲得對共享資源的鎖定。這時,等待的session的lock請求就需要進入到一個佇列當中,這就是enqueue等待。
Enqueue的模式
enqueue(lock)一共有六種模式:
1 NULL
2 SS
3 SX
4 S
5 SSX
6 X
什麼是enqueue resource
Lock有三種可能的狀態:已獲得,轉換或者等待。對於某一個lock,可能一些session已經獲得該lock,某些session請求轉換,也有某些session在請求持有但無法成功而導致等待。所以,對於一個lock,需要三個佇列來描述這些session的狀態。這個三個佇列,分別稱為Owner,waiter和convert佇列,由一個結構來管理,就是enqueue resource。
enqueue是有名字的,其名字就是對應的lock的型別加上ID1,ID2引數構成,形如
通過v$resource檢視可以檢視當前系統中的enqueue。
由於系統中有很多型別的lock同時存在,那麼enqueue resource結構實際上是一個陣列,其長度由隱含引數_enqueue_resources控制,也就是說,該引數控制了系統中可同時存在的lock的數量。如果超過,則會報以下錯誤:
ORA-00052: "maximum number of enqueue resources exceeded"
通過v$resource_limit檢視可以檢視系統中各種資源的利用情況。
什麼是enqueue lock
enqueue lock就是lock本身。oracle使用了和enqueue reouserce分離的另外一個陣列來管理enqueue lock,這個陣列的長度由隱含引數_enqueue_locks控制。
通過檢視v$enqueue_lock可以檢視該陣列中的具體內容。
什麼是enqueue hash
通過上面關於enqueue resource的描述,我們可以知道,oracle查詢一個lock時,需要先在enqueue resource數上查詢到該lock的位置。
如果每次都在陣列上順序查詢,顯然效率較低。我們知道hash是一種高效的查詢演算法,所以oracle對於enqueue resource的查詢也採用了hash方式,引入了一個hash陣列,其大小由隱含引數_enqueue_hash控制。
通過對enqueue的名字
相應的,為了保護這個hash陣列,需要引入一個latch:enqueue hash chain。該latch有若干個子latch,由隱含引數_enqueue_hash_chain_latches控制
什麼是enqueue freelist
同樣的,對於enqueue resource陣列中的空閒位置,需要通過一個freelist列表來管理,這樣每次在請求新的位置時,不至於要掃描整個陣列。enqueue freelist由enqueues latch的保護。
實際上,enqueue resource的Hash管理方式,和buffer cache/library cache的管理方式非常的相像。如果想更深入的瞭解enqueue hash,resource和lock,可以dump出具體的結果看看:
alter session set events ’immediate trace name enqueues level 3’;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11990065/viewspace-702616/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Enqueue WaitsOracleENQAI
- oracle enqueue(zt)OracleENQ
- oracle enqueue typeOracleENQ
- 什麼是cookie,什麼是sessionCookieSession
- 這是什麼這是什麼
- 什麼是分而治之?什麼是WBS?
- 什麼是DNS,什麼是HostsDNS
- 什麼是WebAuthn、FIDO 是什麼?Web
- What is the "WF - Contention'' Enqueue ?ENQ
- ###什麼是Linux核心###什麼是MMULinux
- ITIL是什麼意思?ITIL是什麼?
- SNP全稱是什麼? SNP是什麼公司? SNP是什麼意思?
- 人是什麼?人生是什麼?人為什麼會變?
- ftp是什麼,ftp是什麼東西?FTP
- 什麼是正向代理?什麼是反向代理?
- NLA是什麼?NLA的原理是什麼?
- Java是什麼_Java是做什麼的?Java
- 什麼是this
- 為什麼要有 Servlet ,什麼是 Servlet 容器,什麼是 Web 容器?ServletWeb
- 什麼是框架?為什麼說 Angular 是框架?框架Angular
- IDFA、IMEI、OAID 是什麼,區別是什麼AI
- GNU是什麼?和Linux是什麼關係?Linux
- 什麼是SSRF攻擊?SSRF用途是什麼?
- 什麼是API介面,具體是什麼意思?API
- DRBD是什麼意思?優缺點是什麼?
- 什麼是塊元素?什麼是行內元素?
- 什麼是Tornado?它的特點是什麼?
- nginx 是什麼,能幹什麼?Nginx
- 什麼是zoom?它有什麼作用?OOM
- 什麼是NLA,它有什麼用?
- 什麼是Django?有什麼用途?Django
- AI三重問:什麼是AI?什麼是AI模型?什麼是AI大模型?AI大模型
- 什麼是重繪repaint?什麼是迴流reflow?AI
- DHCP是什麼?DHCP伺服器是什麼意思?伺服器
- 什麼是eval()?eval是用來幹什麼的?
- 域名是什麼?申請域名的流程是什麼?
- 什麼是CDN?CDN的技術原理是什麼?
- 什麼是樂觀鎖,什麼是悲觀鎖
- 車上HOLD是什麼意思,AUTO HOLD是什麼功能,有什麼作用?