Buffer Cache에 필요로 하는 block이 존재하면 disk access를 하지 않음
(1) 블록단위 I/O
I/O는 블록 단위로 이루어짐
데이터 파일에서 버퍼 캐시로 블록을 적재할 때, 인덱스를 경유한 테이블 엑세스 시에는 한번에 한블록씩 읽어들이지만(singleblock read), Full Scan 시에는 성능 향상을 위해 한번에 여러개의 블록을 읽어들임(multiblock read)
DBWR: 버퍼 캐시로부터 변경된 블록(Dirty 버퍼 블록)을 주기적으로 데이터파일에 기록
(2) 버퍼 캐시 구조
Free 버퍼 : 사용되지 않았거나 변경된 내용이 Disk에 내려쓰기가 완료됨
Dirty 버퍼 : 버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록
Pinned 버퍼 : 읽기 또는 쓰기 작업을 위해 현재 액세스 되고 있는 버퍼
해시 테이블 구조로 관리
데이터 블록 주소 (DBA, Data Block Area) : DB 버퍼 캐시 내에서 데이터 블록을 해싱하기 위해 사용되는 키 값
해시 함수에 데이터 블록 주소를 입력해 리턴받은 해시값이 같은 블록들을 같은 해시 버킷에 연결 리스트 구조로 연결
각각의 연결 리스트를 해시 체인이라고 함
버퍼 헤더(Buffer Header)만 해시 체인에 연결되며, 실제의 데이터 값이 필요해지면 버퍼헤더에 있는 포인터를 이용해 다시 버퍼 블록을 찾아가는 구조
(3) 캐시 버퍼 체인
각 해시 체인은 래치(Latch)에 의해 보호됨
DB 버퍼 캐시는 공유 메모리 영역인 SGA 내에 존재하므로 여러 프로세스에 의한 동시 액세스가 일어날 가능성이 큼. 따아서 같은 리소스에 대한 액세스를 반드시 직렬화해야 함. 이를 위해 구현된 일종의 Lock 매커니즘을 래치라고 함
래치를 획득한 프로그램만이 그 래치에 의해 보호되는 자료구조로의 진입 허용
두 개 이상의 프로세스가 같은 해시 체인으로 진입해 새로운 버퍼 블록을 연결하고 해제하는 작업을 동시에 진행할 시 문제가 발생할 수 있으므로, 이를 방지하기 위해 Cache buffer chain 래치 사용
하나의 cache buffer chain 래치가 여러 개 해시 체인을 동시에 관리
해시 체인을 스캔하거나 거기에 블록을 추가 , 제거할 때 래치가 요구됨
(4) 캐시 버퍼 LRU 체인
DB 버퍼 캐시는 한번 읽은 데이터 블록을 캐싱해 두는 메모리 공간이지만 메모리는 유한한 자원이어서 모든 데이터를 캐싱할 수 없음. 버퍼 캐시가 사용빈도가 높은 데이터 블록들 위주로 구성될 수 있도록 LRU(least recently used) 알고리즘을 사용해 관리 됨.
모든 버퍼 블록 해더를 LRU 체인에 연결해 사용빈도 순으로 위치를 옮겨가다, Free 버퍼가 필요해질 때마다 액세스 빈도가 낮은 데이터 블록들을 우선하여 밀어냄으로써 자주 액세스되는 블록들이 캐시에 더 오래 남아 있도록 관리
Dirty 리스트 : 캐시 내에서 변경됐지만, 아직 디스크에 기록되지 않은 Dirty 버퍼 블록들을 관리, LRUW(LRU Write)리스트라고 함
LRU 리스트 : 아직 Dirty 리스트로 옮겨지지 않은 나머지 ㅣ버퍼 블록들을 관리
LRU 리스트를 보호하기 위해 사용하는 래치를 cache buffer lru chain 래치라고 함