오라클 SGA 캐시 탐색 메커니즘 정리

Direct Path I/O를 제외한 모든 블록 I/O는 메모리 버퍼캐시를 경유한다.


버퍼캐시의 구조는 해시 구조로 관리된다. 해시 함수를 통해서 나온 결과를 사용하여 해시체인(Bucket)을 찾고 그 해시체인에 연결되어 있는 버퍼 정보를 사용하여 버퍼 캐시 정보를 찾아 갈 수 있다.




만약 해시체인을 찾아주는 해시 알고리즘이 mod(x, 5)라고 할 때, 25번째 블록을 찾고 싶은 경우 해시함수를 사용해서 5로 나누고 나온 나머지 0이 해시체인 0번째를 의미한다. 그 해시체인에는 버퍼 헤더들이 들어있다. 25라는 버퍼헤더를 찾고 그 버퍼헤더가 가리키고 있는 버퍼 블록을 접근하여 데이터를 탐색하면 된다.


만약 27번째 블록을 읽으려고 해시함수를 거쳐서 2번째 해시체인에 갔으나, 버퍼 헤더 27이 없다면?? 다른 해시 체인을 뒤져야 하는가?


그럴 필요 없이 해시체인에 27번째 블록을 디스크에서 읽어서 연결해주면 된다.



정리하면 버퍼캐시에서 블록을 찾을 때 해시 알고리즘으로 버퍼 헤더를 찾고 거기서 포인터로 버퍼 블록을 액세스 하는 방식이다.


여기서 사용되는 해시 구조의 특징은 다음과 같다.



버퍼캐시의 해시구조 특징

  • 같은 입력 값은 항상 동일한 체인(버킷)에 연결 됨

  • 다른 입력값이 동일한 체인(버킷)에 연결될 수 있음

-> 6, 11의 경우 1번 해시체인에 연결될 수 있음

  • 해시 체인 내에는 정력이 보장되지 않는다.


버퍼캐시는 SGA의 구성요소이므로 버퍼캐시에 캐싱된 버퍼블록은 공유자원이다. 말 그대로 공유자원이기 때문에 누군나 접근이 가능하고 동시접근이 이루어질수도 있다.


그럴경우에 순차적으로 접근하도록 도와주는 매커니즘이 있는데 이를 직렬화(serialization) 메커니즘이다. 이 직렬화 메커니즘을 사용하면 해당 블록을 사용하는 프로세스가 있으면 그 프로세스만 사용이 가능한 방식이다. 쓰레드에서 동기화와 같은 원리인 것 같다.


댓글()