Buffer Manager

class pf.buffer.PfFrameKey(fid: PfFileId, pid: PfPageId)[소스]

기반 클래스: NamedTuple

buffer에 있는 page frame의 key를 나타내는 클래스입니다.

변수:
fid: PfFileId

file의 ID.

pid: PfPageId

page의 ID.

class pf.buffer.PfBufferManager(page_size: int, capacity: int, cache_policy: PfCachePolicy | None = None)[소스]

기반 클래스: object

buffer manager를 나타내는 클래스입니다.

변수:
  • _page_size (int) – page의 크기.

  • _capacity (int) – buffer의 크기.

  • _cache_policy (PfCachePolicy) – 사용할 cache policy 정책.

  • _cache_hit (int) – cache hit 횟수.

  • _cache_miss (int) – cache miss 횟수.

  • _frames (dict[PfFrameKey, PfPage]) – buffer에 있는 page frame들.

__init__(page_size: int, capacity: int, cache_policy: PfCachePolicy | None = None) None[소스]

buffer manager를 초기화합니다.

매개변수:
  • page_size (int) – page의 크기.

  • capacity (int) – buffer의 크기.

  • cache_policy (PfCachePolicy | None) – 사용할 cache policy. None 이면 PfRandomPolicy 를 사용합니다.

예외 발생:
read_page(file: PfFile, pid: PfPageId) PfPage[소스]

(internal) file에서 page를 read합니다.

매개변수:
  • file (PfFile) – 대상 file.

  • pid (PfPageId) – 대상 page의 ID.

반환:

read한 page.

반환 형식:

PfPage

예외 발생:

PfInvalidPageDataSizeError – page data의 크기가 유효하지 않은 경우.

write_page(file: PfFile, page: PfPage, fsync: bool = False) bool[소스]

(internal) page를 file에 write하고, dirty 상태를 해제합니다.

매개변수:
  • file (PfFile) – 대상 file.

  • page (PfPage) – 대상 page.

  • fsync (bool) – fsync 여부. True 라면 file stream을 flush합니다.

반환:

write가 발생했는지 여부.

반환 형식:

bool

예외 발생:

PfInvalidPageDataSizeError – page data의 크기가 유효하지 않은 경우.

fetch_page(file: PfFile, pid: PfPageId) PfPage[소스]

file에서 page를 가져옵니다.

page가 buffer에 있으면, 그것을 반환합니다. 이때 _cache_hit 를 하나 증가시킵니다.

page가 buffer에 없는 경우, 만약 buffer가 가득 차있으면, 하나를 evict하면서 file에 write해서 빈 공간을 만듭니다. buffer에 빈 공간이 있으면, file에서 page를 read하고, buffer에 추가한 뒤, 반환합니다. buffer에 추가할때는 frame key를 cache policy에도 insert합니다. 이때 _cache_miss 를 하나 증가시킵니다.

매개변수:
  • file (PfFile) – 대상 file.

  • pid (PfPageId) – 대상 page의 ID.

반환:

가져온 page.

반환 형식:

PfPage

예외 발생:

PfNoEvictableFrameError – buffer에 있는 모든 page가 pin 되어있어서 evict할 수 없는 경우.

allocate_page(file: PfFile, pid: PfPageId) PfPage[소스]

file에 새로운 page를 allocate하고, buffer에 추가합니다.

buffer가 가득 차있으면, 하나를 evict하면서 file에 write해서 빈 공간을 만듭니다. buffer에 빈 공간이 있으면, 새로운 page를 생성하고, page header와 data를 초기화한 뒤, buffer에 추가합니다. buffer에 추가할때는 frame key를 cache policy에도 insert합니다.

매개변수:
  • file (PfFile) – 대상 file.

  • pid (PfPageId) – 새로운 page의 ID.

반환:

새로 allocate된 page.

반환 형식:

PfPage

예외 발생:

PfNoEvictableFrameError – buffer에 있는 모든 page가 pin 되어있어서 evict할 수 없는 경우.

touch_page(file: PfFile, pid: PfPageId) None[소스]

buffer에서 page를 가장 최근에 접근한 것으로 표시합니다.

cache policy에서 access를 해줍니다.

매개변수:
  • file (PfFile) – 대상 file.

  • pid (PfPageId) – 대상 page의 ID.

persist_page(file: PfFile, pid: PfPageId) bool[소스]

page를 file에 즉시 write합니다.

즉, fsync 옵션을 True 로 설정한 write_page 메서드를 사용합니다. buffer에 있는 page만 대상으로 한다고 가정합니다.

매개변수:
  • file (PfFile) – 대상 file.

  • pid (PfPageId) – 대상 page의 ID.

반환:

write가 발생했는지 여부.

반환 형식:

bool

flush(file: PfFile) int[소스]

file을 flush 합니다.

buffer에 있는, 해당하는 file의 모든 page를 file에 write하고, buffer에서 제거합니다. cache policy에서도 remove 해줍니다.

반환:

write가 발생한 page의 수.

반환 형식:

int

예외 발생:

PfFlushingPinnedPageError – page가 pin 되어있어서 flush할 수 없는 경우.