– 오라클 프로세스가 Free Buffer 를 찾는 과정 –
Database Buffer Cache
최근에 사용된
데이타베이스의 데이타 블록을 저장하고 있는 Database Buffer 영역으로 DBWR(Database Writer Process) 에 의해서 관리된다.
Free
Buffer는 오라클 서버 프로세스에 할당되어 사용되고, 사용 후 Dirty Buffer가 된 Buffer들은 DBWR에 의해 디스크에 쓰여진 후 다시 Free Buffer가 되어
오라클 서버 프로세스에 의해 재사용되는 작업을 반복하게 된다.
Free Buffer 를 찾는 과정
1. 오라클 프로세스가 LRU List에 Lock을 걸고 LRU의 끝부분부터
Free Buffer 블록을 찾기 시작한다. 이를 찾는 중에 Dirty Buffer를 만나면, 이 Dirty Buffer를 LRUW List에 옮긴다.
2. LRU List를 찾을 때도 끝까지 다 찾는 것은 아니고, Kernel에서
지정하는 어느 특정 값만큼 Depth를 정하여 스캔하며, 이
개수(foreground scan depth) 내에서 찾지 못하면 오라클 프로세스는 더 이상 LRU List 는 읽지 않고 , DBWR에게 Dirty Buffer를 모으도록 하는 메시지를 보내는 작업이 수행되고 LRU
Latch는 해제된다.
3. 메시지를 받은 DBWR는 LRU
Latch Lock을 걸고, LRU 꼬리 부분에서
DBWR Scan Depth만큼의 디스크에 쓰여져야 할 Dirty Buffer들을 모으는 Large Batch Write를 수행한다.
4. LRUW에 모인 Dirty Buffer는 DBWR에 의해 디스크로 쓰여지고 나면 이 Buffer는 Free Buffer로 되어 다시 사용될 수 있도록 LRU의 끝부분에
위치하게 된다.
* 오라클 Database Buffer Cache 안의 블록들은
모두가 LRU List / LRUW List 둘중 하나에 속하게 된다.
용어 설명
– LRU(Least Recently Used) List : 최근에 읽혀진 Datafile Block 을 Buffer Cache에 보관하고, 새로운 Block 이 파일에서 읽혀질 필요가 있으면 사용한지 가장 오래된 버퍼들부터 메모리에서 없어지도록 관리하기 위한
Buffer Cache 내의 Block List를 유지관리함.
– Dirty List(LRUW List) : Buffer Cache 안의 Block들은 그 상태에 따라서 다음 세가지 상태를
가진다.
1. Free Buffer : Dirty Buffer가 디스크에 쓰여진 후 Free로 마크되어 사용할 수 있는
상태로 되었거나 처음 Load 된 이후 내용이 변경되지 않아 사용 가능한 Buffer
2. Dirty Buffer : Datafile 에서 Buffer Cache 로 읽혀진 이후 블록에 변경사항이 발생했는데, 다시 Datafile 에
Write 되지 않은 상태의 버퍼
3. Pinned Buffer : 서버프로세스에 의해 사용된 상태의 버퍼
Dirty Buffer들은 오라클 프로세스들이 자신이 사용할 Free Buffer를 찾기 위해 LRU List를 꼬리 부분(LRU)부터 찾아나가다 Dirty Buffer를 만나면 이를 LRUW List에 옮겨놓은
것들로, 이 Buffer들은 결국 DBWR(DB Writer)에 의해 디스크에 쓰여지고 다시 Free로
마크되어 LRU List로 가게 된다.