락과래치

오라클은 경합에 의해 공유 자원이 손상되지 않도록 4개의 메커니즘을 제공
queue방식긴시간동안획득오브젝트를보호
  • 래치
순서와무관짧은순간만획득공유메모리를보호
queue방식긴시간동안획득
  • 뮤텍스
순서와무관일부긴시간동안획득획득방식은 래치와 유사(락과래치의중간)

자료구조

  • 래치의 정의와 동작원리를 살펴보기 전에, 배열, 포인터, 링크드 리스트 및 해시 테이블에 대한 이해가 선행되어야함
1)배열
  • 동일한 형태와 크기를 갖는 오브젝트들의 목록
  • ex) x$ksuse(v$session 뷰의 기반구조)
  • 오라클은 배열의 시작위치만을 기록하며, 이를 이용하여 배열내의 특정 레코드의 위치를 계산할 수 있다.
  • 경우에따라 segmented 배열을 사용하기도 한다.
    배열을 생성하는 시점에는 고정된 레코드 개수를 위한 메모리 청크를 할당한 후, 필요할 경우 동적으로 메모리 청크를 할당하는 구조
    ex)x$ktatl(v$resource_limit뷰 내의 temporary_table_locks)
2)포인터
  • 포인터는 메모리 주소를 가리킨다.
    ex)x$ksmfsv구조 (fixed SGA변수들의 배열을 나타내는 구조)

  ADDR     INDX INST_ID KSMFSNAM KSMFSTYP KSMFSADR KSMFSSIZ
  -------- ---- ------- -------- -------- -------- --------
  035004BO 3923 1       kcbllsb  ksqeq *  03D3C818 4       
  

-- 0x035004BO위치에는 0x03D3C818값이 저장
-- 길이는 4bytes
-- ksqeq유형
-- 0x03D3C818주소의 내용을 덤프하면,x$ksqeq구조에 저장된 첫 번째 레코드 주소 확인 가능

3)링크드리스트
  • 오라클에 의해 사용되는 대부분의 리스트는 이중(doubly)링크드 리스트이다.
  • 이중링크드리스트는 리스트내 다음 항목 뿐 아니라 이전 항목까지도 가리킨다.
    (3장의 언두세그먼터 헤더내의 트랜잭션 테이블(그리고 트랜잭션 컨트롤)에서 링크드 리스트 예제 확인

TRN CTL: : seq: OxOb02 chd: Ox0011 ctl: Ox001c inc : Oxoooooooo nfb: Ox0001

TRN TBL:                                                                   
	index  state  cflags  wrap#    uel        scn      dba                                        
  --------------------------------------------------------------
...
  Ox11     9    OxOO    Ox2d25 Ox001b OxOOOO.041c818a Ox00805805                       
...
  Ox19     9    OxOO    Ox2d24 Ox002e OxOOOO.041c8ld1 Ox00805cOb                         
...
  Oxlb     9    OxOO    Ox2d23 Ox0019 OxOOOO.041c81ce Ox00805c09
  Oxlc     9    OxOO    Ox2d24 Oxffff OxOOOO.041c907c Ox00805cOd  
...
  Ox27     9    OxOO    Ox2d25 OxOOlc OxOOOO.041c9072 Ox00805cOd
...
  Ox2e     9    OxOO    Ox2dlf OxOOla OxOOOO.041c81d2 Ox00805806


-- 트랜잭션 컨트롤 영역에서 리스트의 헤드(chd)는 0x0011이고 꼬리(ctl)는 0x001c
-- 리스트의 헤드인 0x11(index 칼럼 값)의 uel칼럼 값은 0x001b를 가리키고
– 0x1b는 0x0019 ,0x19는 0x002e, 0x2e는 0x001a ... 0x27은 0x001c(리스트의꼬리인 ctl)
– 0x1c는 0xffff를 가리킴으로써 링크드 리스트는 끝내게 된다.

  • 현재 항목은 다음 번으로 사용할 항목을 가리키고 있으므로, 다음번 항목을 찾기 쉽다.(FIFO)
    freelist space management를 위해서는 LIFO링크드 리스트를 사용하기도 한다.
  • 대량의 index range스캔을 수행한다면, 인덱스 브랜치 블록을 경유하지 않고 현재 리프블록에서 다음블록으로 편리하게이동하도록 해주는
    forward 포인터가 사용된다.
    오라클은 desending index range 스캔을 허용하므로, 이를 위해 backward 포인터도 사용된다.
4)해시테이블
  • 배열은 고정된 항목을 처리하기에 효율적
  • 링크드리스트는 연관된 항목을 처리히기에 효율적
  • 하지만 원하는 항목을 찾기위해서는 배열 또는 리스트 전체를 검색해야함
# 해시의 개념
  • 버킷의 개수를 결정한 후 해시 알고리즘을 선택하면 된다.
    예)친구들을 10개의 버킷에 분산 => 핸드폰번호의 마지막자리(N)를 이용
    친구들을 16개의 버킷에 분산 => 친구의 자식의수를 16으로 나눈 나머지값(N)을 이용
# 해시알고리즘 목표
  • 균등하게 데이터를 분산
  • 유용한 알고리즘
  • 하나의 버킷에 속한 항목의 최소화
# 버킷이란무엇인가? 동일한 버킷 내에 있는 두개의 SQL문을 어떻게 처리하는가?
  • 버킷은 단지 segmented 배열 내의 하나의 항목이며, 이중 링크드 리스트의 end point 로써 동작한다.
{panel:title=그림 4-1 매우 작은 라이브러리 캐시 구조borderStyle=dashedbgColor=#FFFFFFtitleBGColor=#F0F0F0}!1.pngvspace=4!{panel}
새로운 오브젝트를 라이브러리 캐시에 적재하기 위해, 우라클은 오브젝트가 속할 버킷을 결정하는
간단한 연산을 수행한 후, 적절한 리스트 내에 오브젝트를 연결한다.
{panel:title=그림4-2 이중 링크드 리스트에 항목 추가
borderStyle=dashedbgColor=#FFFFFFtitleBGColor=#F0F0F0}!4-2-4.jpgvspace=4!{panel}
오브젝트들 사이에 새로운 오브젝트가 위치하게 되면, 새로운 오브젝트의 forward,backword포인터는 각각 신규 오브젝트를 가리키게 된다.
링크드 리스트 내에 새로운 오브젝트를 추가하는 것은 기존에 존재한 두개의 오브젝트에 대한forward,backward 변경을 필요로한다.
라이브러리 캐시 내에 새로운 오브젝트를 생성하기 위한 충분한 메모리가 존재하지 않는다면, 오라클은
해시 체인으로부터 분리할 수 있는 "임의의"오브젝트를 선택하기 위해 LRU알고리즘을 사용한다.