래치란 무엇인가?
래치란 빠르고 가볍게 특정 리소스에 대한 동기화를 구현하기 위한 객체(object)이다.
특징 |
1. 래치는 물리적으로 Shared Pool 영역에 존재하는 일종의 메모리 구조체이다. |
2. 래치는 매우간단하고 작은 메모리 영역을 사용하며, 래치를 획득(get)하고 해제(release)하는 작업들 또한 하드웨어에 맞게 최적화 되어있다. |
3. 일반적으로 하드웨어 칩셋이 제공하는 TEST-AND-SET, COMPARE-AND-SWAP와 같은 명령을 사용하므로 래치를 획득하고 해제하는 행위는 원자성(Atomicity)이 보장된다. |
4. 래치를 보호하기 위해 별도의 소프트웨어적인 동기화 장치가 필요없다 |
래치가 보호하는 리소스?
래치가 보호하는 리소스는 SGA다. SGA에 접근하는 모든 프로세스는 반드시 해당 영역을 관장하는 래치를 획득 한 후에만 접근이 허용하기 때문이다.
분석
SQL문을 실행하고자 하는 프로세서는 해당 SQL을 Share Pool의 library cache 영역에 올려야 한다. 이 때 필요한 힙(HEEP)-익스턴트 개념- 메모리 영역을 할당 받기 위해서는 반드시 Shared pool latch를 획득해야한다.
1. shared pool래치는 보통 전체 인스턴스에 하나만 존재한다.
2. 한번에 하나의 프로세스만이 힙으로 부터 **청크(chunk)**를 할당 받을 수 있다.
3. select 문을 통해서 특정 데이터 블록을 읽기 위해 해시 체인(Hash chain)에 접근하고자 하는 모든 프로세스는 반드시
해당 체인을 관장하는 cache buffer chains 래치를 획득해야한다.
5. DML을 통해서 데이터를 변경한 모든 프로세스는 PGA영역에 redo데이터를 생성. 이 리두 데이터를 리두 버퍼(redo buffer)
로 복사하기 위해 먼저 redo copy 래치를 획득해야 한다.
이렇듯 SGA의 특정영역을 탐색하거나 변경하고자 하는 프로세스는 반드시 해당 영역을 관장하는 래치를 획득해야한다. 이를 통해 SGA의 자원을 보호한다.
청크!! HEEP 구조!! library cache구조!!
Shared Pool Memory의 구조
~ 물리적인 관점에서 shared pool의 메모리는 그래뉼을 추가로 쌓는 형식으로 할당되기 때문에
힙(Heap)이라는 용어를 사용한다. 이때 하나의 그래뉼이 하나의 extent가 된다.
~ Extent는 다양한 크기의 chunk로 나누어질 수 있다. chunk의 상태는 free, recreatable, freeable,
permanent로 나누어지며 free와 recreatable(현재 사용중이지 않으면서 재생성 가능) chunk만
재사용할 수 있다.
Shared Pool의 Heap 구조
~ Memory 공간 요청시 Chunk 단위로 할당
~ Freelist : Free Chunk의 목록
~ LRU List : 현재 사용중이지 않은 재생성 가능 Chunk 목록(Unpinned Recreatable Chunk)
~ Reserved Freelist : 최상위 Heap에만 존재, Shared Pool의 예약 영역에 대한 Freelist
~ Freelist에서 원하는 크기의 chunk 검색 -> LRU List 검색
-> 특정 크기 이상이면 Reserved list 검색 -> 모두 실패하면 ORA-4031에러
Library Cache 구조
~ Shared Pool에서 가장 중요한 부분 중의 하나인 Library Cache 영역은 SQL문의 수행과 관련된
모든 정보들을 관리하는 영역이다. Library Cache 메모리는 Library Cache Manager(KGL, Kernel
Generic Library Cache)에 의해 관리되는데, KGL은 KGH를 이용해서 필요한 메모리 청크를
할당 받는다.
~ Library Cache 메모리는 [해시 테이블 -> 버킷 -> 체인 -> 핸들 -> 오브젝트]의 구조로 되어 있다.
~ 오라클은 객체 이름(가령 SQL 텍스트)에 해시함수를 적용해 생성된 해시값을 이용해 적절한
해시 버킷(Hash Bucket)을 할당하며, 같은 해시값을 지니는 객체들은 체인(리스트)으로 관리된다.
~ 하나의 Library Cache 핸들(이하 핸들)은 하나의 Library Cache Object(이하 LCO)를 관리한다.
핸들은 실제 LCO에 대한 메타정보 및 포인터 역할을 하며 LCO가 실제 정보를 담고 있다.
~ LCO가 포함하는 정보 중 중요한 것들은 다음과 같다.
- Dependency Table
- Child Table
- Data Blocks
Shred Pool 관련 latch
참고 : Practical OWI in Oracle 10g(그림으로 명쾌하게 풀어쓴)
출처 : http://blog.naver.com/gseducation?Redirect=Log&logNo=20099683486
(주)엑셈
한민호님
'Database > Oracle' 카테고리의 다른 글
[펌] cardinality 란? (0) | 2012.03.18 |
---|---|
[펌] Lock 과 Latch 분류표 (0) | 2012.03.18 |
[펌] Lock 개요 (0) | 2012.03.18 |
[펌] Cursor 란?? (0) | 2012.03.18 |
[펌] Chunk 란? (0) | 2012.03.18 |