오라클은 데이터베이스와 이를 액세스하는 프로세스 사이에 SGA라고 하는 메모리 캐시 영역이 존재한다.

디스크를 경유한 입출력은 물리적으로 액세스 암(Arm)이 움직이면서 헤드를 통해 데이터를 읽고 쓰는 반면 메모리 캐시를 통한 입출력은 전기적 신호에 불가하기에 디스크 I/O와 비교하면 엄청 빠르다.

많은 프로세스가 동시에 데이터를 액세흐하므로 사용자 데이터를 보호하는 Lock은 물론 공유 메모리 영역인 SGA상에 위치한 데이터 구조에 대한 액세스를 직렬화 하기 위한 Lock 매커니즘 (Latch)도 필요하다.

오라클은 블록 단위로 읽고, 변경이 발생한 블록만 찾아 블록 단위로 저장한다.

오라클 백그라운드에서 DBWR과 CKPT 프로세스가 캐시와 데이터파일간 동기화를 주기적으로 수행해준다.

 

오라클에서 디스크에 저장된 데이터 집합(Datafile, Redo Log File, Control File 등)을 데이터베이스라고 부른다. 그리고 SGA 공유 메모리 영역과 이를 액세스하는 프로세스 집합을 합쳐서 인스턴스 라고 한다.

 

오라클 인스턴스

프로세스 집합을 다시 서버 프로세스와 백그라운드 프로세스로 나눌수 있다. 

- 서버 프로세스 : 전면에서 사용자가 던지는 명령 처리

- 백그라운드 프로세스 : 뒤에서 명령을 처리

 

리스너에 연결요청을 하는 순간 하나의 프로세스를 띄우고 PGA 메모리를 할당한다. 이는 비용이 매우 큰 작업이므로, 일련의 SQL문을 수행하기 위해 매번 연결요청을 한다면 결코 성능이 좋지 않다. 오라클에 접속하는 애플리케이션을 구축할때 커넥션 풀 기능이 필요한 이유다.

 

DB 버퍼 캐시

사용자가 입력한 데이터를 데이터파일에 저장하고 이를 다시 읽는 과정에서 거쳐 가는 캐시 영역은 SGA 구성요소 중 하나인 DB버퍼캐시이다.

////

LRU 리스트를 보호하기 위해 사용하는 래치를 cache buffers lru chain 래치하고 한다.

 

버퍼 상태

- Free 버퍼 : 인스턴스 기동 후 아직 데이터가 읽히지 않아 비어있는 상태 (Clean) 이거나 데이터가 담겼지만 데이터파일과 서로 동기화돼 있는 상태여서 언제든지 덮어 써도 무방한 버퍼 블록, 오라클이 데이터 파일로부터 새로운 데이터 블록을 로딩하려면 먼저 Free 버퍼를 확보해야한다. Free 상태인 버퍼에 변경이 발생하면 그 순간 Dirty 버퍼로 상태가 바뀐다.

- Dirty 버퍼 : 버퍼에 캐시된 이후 변경이 발생했지만, 아직 디스크에 기록되지 않아 데이터 파일 블록과 동기화가 필요한 버퍼 블록을 말한다. 이 버퍼 블록들이 다른 데이터 블록을 위해 재사용되려면 디스크에 먼저 기록이 되어야하며, 디스크에 기록되는 순간 Free 버퍼로 상태가 바뀐다.

- Pinned 버퍼 : 읽기 또는 쓰기 작업을 위해 현재 액세스되고 있는 버퍼 블록을 말한다.

+ Recent posts