문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
study:oracle:adv_owi_10g:latch_and_lock [2009/07/29 08:28] starlits |
study:oracle:adv_owi_10g:latch_and_lock [2009/07/29 09:29] (현재) starlits |
||
---|---|---|---|
줄 9: | 줄 9: | ||
^ 분류 ^ 래치(latch) ^ 락(lock) ^ | ^ 분류 ^ 래치(latch) ^ 락(lock) ^ | ||
- | ^ 목적 | | | | + | ^ 목적 | 메모리구조에 대한 베터적인 접근 |
- | ^ 사용범위 | | | | + | ^ 사용범위 | SGA내부구조 |
- | ^ 획득방식 | | | | + | ^ 획득방식 | 2가지 모드 |
- | ^ 범위 | | | | + | ^ 범위 | SGA 내부 |
- | ^ 복잡도 | | | | + | ^ 복잡도 | 단순 |
- | ^ 지속기간 | | | | + | ^ 지속기간 | 아주 짧은 순간 \\ (microsecond 단위) |
- | ^ 큐(Queue) | | | | + | ^ 큐(Queue) | Queue로 관리 안함 |
- | ^ DeadLock | | | | + | ^ DeadLock | 발생안함 |
줄 32: | 줄 32: | ||
- Latch가 보호하는 Resource : **SGA** | - Latch가 보호하는 Resource : **SGA** | ||
+ | - SGA의 특정영역을 탐색하거나 변경하고자 하는 프로세스는 반드시 해당 영역을 관장하는 latch를 획득해야 한다. | ||
+ | - Latch를 통해서 Oracle의 SGA자원을 보호한다. | ||
- Shared Pool 래치 | - Shared Pool 래치 | ||
줄 38: | 줄 40: | ||
- Cache Buffers Chains 래치 | - Cache Buffers Chains 래치 | ||
- Select 문을 통해서 특정 datablock을 읽기 위해서 \\ datablock의 DBA(Data Block Address)와 Class에 해당하는 Hash Chain에 접근하고자 하는 모든 프로세스는 \\ 반드시 해당 해시 체인을 관장하는 cache buffers chains 래치를 획득한다. | - Select 문을 통해서 특정 datablock을 읽기 위해서 \\ datablock의 DBA(Data Block Address)와 Class에 해당하는 Hash Chain에 접근하고자 하는 모든 프로세스는 \\ 반드시 해당 해시 체인을 관장하는 cache buffers chains 래치를 획득한다. | ||
+ | - redo copy 래치 | ||
+ | - DML을 통해서 데이터를 변경한 모든 프로세스는 PGA영역에 Redo 데이터를 생성하는데, | ||
+ | |||
+ | === latch 분류 === | ||
+ | |||
+ | ^ 분류기준 ^ 설명 ^ 조회 뷰 ^ | ||
+ | ^ Parent latch(부모래치) | 여러 개의 자식래치를 거느리는 래치 | V$LATCH_PARENT | | ||
+ | ^ Solitary latch(독립래치) | 전체 인스턴스에 단 하나만 존재하는 래치 | | | ||
+ | ^ Child latch(자식래치) | 부모래치에 속한 래치 | V$LATCH_CHILD | | ||
==== Latch 동작 매커니즘 ==== | ==== 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은 래치복구영역에 기록된 정보를 이용해서 공유메모리영역을 원래상태로 복구하고, | ||
+ | |||
==== Latch 관련 Dynamic Views ==== | ==== Latch 관련 Dynamic Views ==== | ||
+ | |||
+ | ^ V$LATCH | ||
+ | ^ V$LATCH_MSSES | ||
+ | |||
==== 일반적인 Latch 관련 대기이벤트들 ==== | ==== 일반적인 Latch 관련 대기이벤트들 ==== | ||
+ | |||
+ | ^ latch: cache buffers chains | ||
+ | ^ latch: cache buffers lru chains | ||
+ | ^ latch: shared pool | Shared Pool의 Heap 영역에서 새로운 Chunk를 할당받고자 하는 프로세스가 획득 | | ||
+ | ^ latch: library cache | **Library Cache 영역(TABLE, | ||
+ | ^ latch: redo copy | DML에 의한 변동사항을 Redo buffer에 기록하고자 하는 프로세스가 작업하는 동안 획득 | | ||
+ | |||
+ | - 그 외 래치정보는 V$LATCHNAME 뷰에서 조회가 가능한다. | ||
===== Lock ===== | ===== Lock ===== | ||
==== Lock의 분류 ==== | ==== Lock의 분류 ==== | ||
+ | - Enqueue 락 | ||
+ | - User Type Lock : | ||
+ | - System Type Lock : | ||
+ | - 일반 락 | ||
+ | - row cache lock | ||
+ | - library cache lock | ||
+ | - library cache pin | ||
+ | - buffer locok | ||
+ | |||
==== Lock이 보호하는 Resource ==== | ==== Lock이 보호하는 Resource ==== | ||
+ | |||
+ | ^ latch | SGA 보호 | | ||
+ | ^ lock | 데이터베이스 전체 보호 | | ||
+ | |||
+ | ^ Enqueue 락 | V$LOCK | | ||
+ | ^ 일반 락 | V$SESSION_WAIT | | ||
+ | |||
==== Lock 동작 매커니즘 ==== | ==== 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 | < | ||
+ | ^ S | O | O | < | ||
+ | ^ SSX | O | O | X | X | X | X | | ||
+ | ^ X | O | X | X | X | X | X | | ||
+ | |||
+ | |||
+ | === lock 획득 === | ||
+ | |||
==== Lock 관련 Dynamic Views ==== | ==== Lock 관련 Dynamic Views ==== | ||
- | ==== 일반적인 Lock 관련 대기이벤트들 ==== | ||
+ | ^ 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 |