Buffer Manage - KimJangHyeon/MyDBMS GitHub Wiki
Structure
전체적인 구조의 관한 그림이다. table manager를 제외한 나머지 manager는 계층구조를 하고 있고 table은 open_table과 close_table은 가장 상위 레이어에 있지만 tid를 fd로 translate해주는 과정에서 buffer manager와 disk manager사이에 필요하기 때문에 완전한 계층구조를 지니기는 힘들다.
TABLE
TablePool
- tids
- tids는 동일한 tid를 2이상 반환하지 않도록 하기 위한 구조체이다. NTID 보다 1많은 배열이다. (tid가 0일 수는 없기 때문)
- count
- 현재 들어있는 table의 갯수를 저장한다. (빠른 search를 위함)
- tables
- table을 저장한다.
get_tid
- ACT
- tids 배열에서 값이 0인 index를 출력한다. 이 값이 tid가 된다. 이때, index 0는 출력하지 않는다.
- 값이 0인 index가 없는 경우, table이 모두 차있는 경우 이므로 TIDFULLL을 출력한다.
rm_tid
- ACT
- 해당 tid를 tids에서 지운다.
tid_exist
- ACT
- tid 존재 여부를 체크한다.
open_table
- CALLING FUNC
- init_table, open_disk, close_disk, disk_size
- ACT
- 해당 path에 + 'datas/'를 붙여서 경로를 설정한 후, 이를 tablepool에서 binary seach로 tables에서 같은 이름이 있는지 찾아본다. 없다면, 이를 경로로 지정하여 파일을 연다. 오픈한 해당 파일의 파일 사이즈가(disk_size) 0이면 init_table을 통해 테이블을 새로 만들어 준다. 있거나, 더이상 오픈이 불가능하다면, 에러를 반환한다.
close_table
- CALLING FUNC
- evict_tid_buffer
- ACT
- 인자로 받은 tid에 대하여 tid가 tids에 없으면 에러를 출력하고 아닌 경우
buffers를 돌면서 해당 tid에 맞는 페이지를 pin이 0인 경우에 대하여 내린다. 이때, isAllClean라는 변수를 사용하여 버퍼에 해당 tid가 존재하지 않을 때에도 한번 더 buffers를 확인하여 close_table되어도 페이지가 남아있는 경우도 방지가 가능하다.
close_tables
- CALLING FUNC
- close_table
- ACT
- tids배열을 보면서 tids가 1인 경우에 대하여 모두 close_table을 실행해준다.
BUFFER
BufferPool
- state
- EMPTY: 현재 버퍼가 비어 있는 상태이다.
- PREPARE: 현재 버퍼가 LOAD를 준비하는 단계이다. (올라올 tid, offset으로 바꿔주는 단계)
- LOAD: 현재 버퍼가 다른 버퍼를 올리고 있는 단계이다. 이때, tid, offset은 올라올 페이지의 tid와 offset을 가르키고 있다.
- RUNNING: 현재 올라와 있는 단계이다.
- CLEAN: 버퍼를 비우고 EMPTY로 만들 단계이다.
lru의 최근 index와 victim index를 buffer pool에 저장하여 접근하는 시간을 최소화 할 수 있다.
read_buffer
-
CALLING FUNC:
-
access_buffer
-
STATE CHANGE:
-
RUNNING -> Cleaning -> Empty(by. evict_buffer) -> Prepare -> Loading -> Running(by. access_buffer)
|| EMPTY -> Prepare -> Loading -> Running(by. access_buffer)
-
ACT
-
버퍼에서 해당 tid, off를 찾아보고 없다면 lru list팔러시(링킹!!!!!!!!!!!!!!!!!)에 맞게 찾아서 해당 페이지를 버퍼에 올린 후, 작업한다.
pin 1증가 -> 페이지 복사 -> pin 1감소
write_buffer
-
CALLING FUNC:
-
access_buffer
-
STATE CHANGE:
-
RUNNING -> Cleaning -> Empty(by. evict_buffer) -> Prepare -> Loading -> Running(by. access_buffer)
|| EMPTY -> Prepare -> Loading -> Running(by. access_buffer)
-
ACT
-
버퍼에서 해당 tid, off를 찾아보고 없다면 lru list팔러시에 맞게 찾아서 해당 페이지를 버퍼에 올린 후, 작업한다.
pin 1증가 -> isDirty 를 1로 세팅 -> 페이지 수정 -> pin 1감소
dealloc_buffer
-
CALLING FUNC:
-
try_empty_buffer, dealloc_page, enqueue_index
-
STATE CHANGE:
-
RUNNING -> Cleaning -> Empty(by. try_empty_buffer)
|| NULL
-
ACT
- 해당 tid와 off에 대하여 buffer에 prepare와 running중 맞는 것을 찾고 있다면 버퍼에서 내린다. 만약 없다면 단지 파일에서만 내린다. (freepage로 전환 하는 과정이기 때문에 굳이 버퍼에 올릴 필요가 없다)
shutdown_db
-
CALLING FUNC:
-
close_tables
-
ACT
- close_tables를 호출한다.
LRU LIST
lru_change
- CALLED FUNC
- access_buffer
- ACT
- 새로운 페이지를 디스크에서 불러오는 경우 victim page가 내려가고 새로운 페이지가 올라올 때, victim의 양 옆 페이지의 lru를 조정해주고 예외 처리를 해주는 함수이다.
lru_clean
- CALLED FUNC
- evict_try_buffer, try_empty_buffer
- ACT
- state가 EMPTY로 가고 enqueue로 들어갈 때, 일어난다. 양 옆 페이지의 lru를 조정해주고 만약 이 페이지가 latest_index or victim_index이면 예외처리를 해준다.