본문 바로가기

카테고리 없음

Latch - 래치

Latch 래치

- SGA에 공유되어 있는 것들을 보호할 목적으로 사용된다.

- 따라서 SGA에 접근하는 모든 프로세스는 반드시 해당 영역의 래치를 획득해야만 접근 가능!

- 물리적으로는 Shared Pool 영역에 존재

- 래치 획득의 순서는 보장되지 않음 (Lock을 순서가 보장됨)

- 래치 획득에 실패한 프로세스는 래치를 획득할 수 있을 때까지 특정 대기 이벤트를 기다림

이 대기 이벤트를 9i까지는 항상 latch free 이벤트였지만

10g 이후부터는 중요한 래치들에 대해서는 별도의 대기 이벤트를 사용, 나머지 쩌리들은 latch free 이벤트




독립 래치와 복수개의 래치

메모리의 구조와 알고리즘이 여러개의 래치를 통해 관리할 수 있다면 복수개의 자식 래치를 사용해 관리 될수 있다.


Parent Latch 부모래치: 여러개의 자식 래치를 거느리고 있음, V$LATCH_PARENT 로 조회 가능

Child Latch 자식래치: 부모래치에 속한 여러개의 래치, V$LATCH_CHILDREN 뷰로 조회 가능

eg) cache buffers chains latch


Solitary Latch 전체 인스턴스에 단 하남나 존재하는 래치, V$LATCH_PARENT 로 조회 가능

eg) shared pool latch (9i부터는 shared pool을 여러개로 분할 사용 가능함, 이 경우는 북수개의 latch 사용 가능)




래치 레벨

여러 프로세스가 동시에 래치를 획득하는 과정에서 데드락 현상이 일어 날 수있음.

데드락 현상 DeadLock은 쉽게 말해 두개의 프로세스가 각각 보유하고 있는 래치를 서로 요구, 양보는 안하는 케이스

쉽게말해 웬수가 외나무 다리 반대편에서 서로 만나서 안비켜주는 상태

래치 획득 과정에서는 데드락을 원천적으로 방지하기 위해 

모든 래치에 레빌을 부여

0~13까지 총 14가지의 레벨이 존재 (오라클 버전마다 다를 수 있음)


자식 래치는 항상 부모 래치와 레벨값이 같다

래치를 보유한 상태에서 또다른 래치를 획득하고자 할 때

프로세스는 반드시 가장 최근에 획득한 래치보다 높은! 레벨의 래치만을 획득할 수 있음

낮거나 같은 레벨의 래치를 획득하려면 No-wait 모드로 획득해야하고, 실패시 래치 해지 후 낮은 레벨부터 다시 획득 시도




래치 모드

기본적으로는 exclusive 모드 -> 한순간에 하나의 프로세스만 래치 보유 가능

읽기 작업인 경우는 shared 모드를 사용



래치 획득 방법

1) Willing-to-wait

- 기본값

- 래치를 획득할 수 있을 때까지 대기

- 래치 획득 실패 -> _SPIN_COUNT 파라미터(기본값은 2초=MAX값) 만큼 다시 시도한다, SPIN한다고도 함 

   ->