문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
study:oracle:adv_owi_10g:latch_and_lock [2009/07/29 08:39] 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 | 발생안함 |
줄 53: | 줄 53: | ||
=== latch level(래치레벨) === | === latch level(래치레벨) === | ||
+ | - 래치 획득과정에서 데드락을 원천적으로 방지하기 위해 모든 래치에 레벨을 부여 | ||
+ | - 레벨을 14가지 ( 0 ~ 13 ) | ||
+ | - 자식래치들은 부모래치와 동일한 레벨값을 갖는다. | ||
=== latch mode === | === latch mode === | ||
+ | - 기본적으로 **Exclusive 모드** (한 순간에 하나의 프로세스만이 래치를 보유) | ||
+ | - 그러나, cache buffers chains 래치는 읽기작업의 경우 **Shared 모드**를 사용한다. | ||
=== latch 획득 === | === latch 획득 === | ||
+ | |||
== Willing-to-wait 모드의 래치 획득 == | == 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 모드의 래치 획득 == | ||
+ | |||
+ | - ** 다음과 같은 특수한 경우에 No-wait 모드를 획득 ** | ||
+ | - 현재 다른 래치들을 보유하고 있는 프로세스가 현재 보유한 래치 중 가장 최근에 획득한 래치보다 더 낮거나 같은 레벨의 래치를 획득하고자 할때 | ||
+ | - redo copy 래치와 같은 특수한 래치 | ||
=== latch Cleanup === | === 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 |