study:oracle:adv_owi_10g:latch_and_lock
Latch and Lock
오라클은 latch 와 lock 이라는 Synchronization(동기화) 매커니즘을 이용하여 리소스를 보호한다.
latch 와 lock 를 둘 다 동시작업으로부터 자원을 보호하는 것이다.
OWI를 이용하면 latch와 lock에 의한 경합현상을 직관적으로 파악할 수 있다.
latch와 lock의 차이점
분류 | 래치(latch) | 락(lock) |
목적 | 메모리구조에 대한 베터적인 접근 | 1. 동일리소스 공유(호환O)
2. 배타적인 접근(호환X) |
사용범위 | SGA내부구조 | 데이타베이스 데이타
메타데이터 접근제어
트랜젝션 단위 |
획득방식 | 2가지 모드 | 6가지 모드 |
범위 | SGA 내부 | 데이터베이스 내부 |
복잡도 | 단순 | 복잡 |
지속기간 | 아주 짧은 순간
(microsecond 단위) | 일정시간 동안 지속
(트랜잭션 단위) |
큐(Queue) | Queue로 관리 안함 | Queue로 관리 |
DeadLock | 발생안함 | 발생함 |
Latch
Latch 정의
가벼운 락(Lock)
오라클 메뉴얼에서 분류하는 방법
아주 빠른 속도로 작동하게끔 구현된 경량화된 락
일반적으로는 Latch와 Lock 을 전혀 다른 객체로 분류
물리적으로 Shared Pool 영역에 존재하는 일종의 메모리 구조체
매우 간단하고 작은 메모리영역 사용
Latch가 보호하는 Resource
Latch가 보호하는 Resource : SGA
SGA의 특정영역을 탐색하거나 변경하고자 하는 프로세스는 반드시 해당 영역을 관장하는 latch를 획득해야 한다.
Latch를 통해서 Oracle의 SGA자원을 보호한다.
Shared Pool 래치
새로운 SQL문을 실행하고자하는 프로세스는 해당 SQL을 Shared Pool의 library cache 영역에 올린다.
이 때 필요한 Heap Memory 영역을 할당받기 위해 획득하는 래치이다.
Shared Pool 래치는 보통 전체 인스턴스에 하나만 존재하므로
한번에 하나의 프로세스만이 Heap으로부터 Chunk를 할당 받을 수 있다.
Cache Buffers Chains 래치
Select 문을 통해서 특정 datablock을 읽기 위해서
datablock의 DBA(Data Block Address)와 Class에 해당하는 Hash Chain에 접근하고자 하는 모든 프로세스는
반드시 해당 해시 체인을 관장하는 cache buffers chains 래치를 획득한다.
redo copy 래치
DML을 통해서 데이터를 변경한 모든 프로세스는 PGA영역에 Redo 데이터를 생성하는데,
이 리두 데이터를 Redo buffer로 복사하기 위해서 획득하는 래치이다.
latch 분류
분류기준 | 설명 | 조회 뷰 |
Parent latch(부모래치) | 여러 개의 자식래치를 거느리는 래치 | V$LATCH_PARENT |
Solitary latch(독립래치) | 전체 인스턴스에 단 하나만 존재하는 래치 | |
Child latch(자식래치) | 부모래치에 속한 래치 | V$LATCH_CHILD |
Latch 동작 매커니즘
latch level(래치레벨)
래치 획득과정에서 데드락을 원천적으로 방지하기 위해 모든 래치에 레벨을 부여
레벨을 14가지 ( 0 ~ 13 )
자식래치들은 부모래치와 동일한 레벨값을 갖는다.
latch mode
기본적으로 Exclusive 모드 (한 순간에 하나의 프로세스만이 래치를 보유)
그러나, cache buffers chains 래치는 읽기작업의 경우 Shared 모드를 사용한다.
latch 획득
Willing-to-wait 모드의 래치 획득
기본모드(Willing-to-wait 모드)
래치를 획득할 수 있을 때까지 대기한다.
최초 래치 획득 실패시 곧바로 SLEEP 하지 않고 SPIN을 수행하는 이유 2가지 ? (ㅋㅋ)
스핀을 시도하고도 래치를 획득하는데 실패한 프로스세스는 SLLEP 상태로 바뀐다.
SLEEP 상태의 프로세스가 깨어나는 방법 2가지 ?
-
latch wait posting
조회 뷰 : V$LATCH
컬럼 : GETS, MISSES, SPIN_GETS SLEEPS
No-wait 모드의 래치 획득
다음과 같은 특수한 경우에 No-wait 모드를 획득
현재 다른 래치들을 보유하고 있는 프로세스가 현재 보유한 래치 중 가장 최근에 획득한 래치보다 더 낮거나 같은 레벨의 래치를 획득하고자 할때
redo copy 래치와 같은 특수한 래치
latch Cleanup
Shared Memory 훼손(매우 심각한 문제)로 래치를 Cleanup하는 메커니즘
프로세스가 래치를 보유한 채로 종료되면 PMON은 각 래치마다 구현되어 있는 Cleanup function을 호출한다.
각 래치의 Cleanup function은 래치복구영역에 기록된 정보를 이용해서 공유메모리영역을 원래상태로 복구하고,
이 작업이 끝나면 PMON은 래치를 해지한다.
Latch 관련 Dynamic Views
V$LATCH | 모든 래치들의 통계에 대한 합계치 정보 |
V$LATCH_MSSES | 래치 MISS가 발생한 커널코드의 영역에 대한 정보 |
일반적인 Latch 관련 대기이벤트들
latch: cache buffers chains | buffer cache 에서 특정 블록을 탐색하고자 하는 프로세스가 획득 |
latch: cache buffers lru chains | buffer cache 에서 free buffer와 dirty buffer 를 탐색하고자 하는 프로세스가 획득 |
latch: shared pool | Shared Pool의 Heap 영역에서 새로운 Chunk를 할당받고자 하는 프로세스가 획득 |
latch: library cache | Library Cache 영역(TABLE,VIEW 등 SQL문수행관련모든정보 보관)을 탐색하고자 하는 프로세스가 획득 |
latch: redo copy | DML에 의한 변동사항을 Redo buffer에 기록하고자 하는 프로세스가 작업하는 동안 획득 |
그 외 래치정보는 V$LATCHNAME 뷰에서 조회가 가능한다.
Lock
Lock의 분류
Enqueue 락
User Type Lock :
System Type Lock :
일반 락
row cache lock
library cache lock
library cache pin
buffer locok
Lock이 보호하는 Resource
latch | SGA 보호 |
lock | 데이터베이스 전체 보호 |
Enqueue 락 | V$LOCK |
일반 락 | V$SESSION_WAIT |
Lock 동작 매커니즘
lock mode
락모드(0~6)
모드 | 설명 |
0 | None |
1 | NULL(N) |
2 | Sub-Shared(SS)
Row-Shared(RS) |
3 | Sub-Exclusive(SX)
Row-Exclusive(RX) |
4 | Shared(S) |
5 | Shared-Sub-Exclusive(SSX)
Shared-Row-Exclusive(SRX) |
6 | Exclusive(X) |
락모드호환성
| N | SS | SX | S | SSX | X |
N | O | O | O | O | O | O |
SS | O | O | O | O | O | X |
SX | O | O | O | O | X | X |
S | O | O | O | O | X | X |
SSX | O | O | X | X | X | X |
X | O | X | X | X | X | X |
lock 획득
Lock 관련 Dynamic Views
V$LOCK |
V$LOCKED_OBJECT |
V$ENQUEUE_LOCK |
DBA_WAITERS |
일반적인 Lock 관련 대기이벤트들
row cache lock |
buffer busy waits |
read by other session |
library cache lock |
library cache pin |
DFS lock handle |
study/oracle/adv_owi_10g/latch_and_lock.txt · 마지막으로 수정됨: 2009/07/29 09:29 저자 starlits