Bufffer

개발기록·2024년 7월 5일

CS

목록 보기
4/6
post-thumbnail

Storage Access

  • 데이터베이스에서 데이터를 저장하는 단위, 데이터를 전달하는 가장 최소 단위는Block 이라고 한다
  • DBMS는 디스크 I/O를 줄이기 위한 방법들을 사용한다
  • Main Memory에 한 번 읽은 Block을 유지 하면 다음 번에 또 읽을 때 DISK I/O 없이 데이터에 접근 가능 할 것이다.
  • 이 때 Main Memory에 유지하는 Block들을 Buffer 라고 한다.
  • DBMS는 Buffer Manager를 통해 Buffer를 관리한다.

Buffer Manager

  • DBMS에서 Disk의 데이터가 필요할 때 Buffer Manager를 불른다
  • Buffer Manager는 다음과 같이 동작한다.
    • 해당 Block이 Buffer에 이미 있으면 해당 Buffer의 주소를 반환한다
    • 해당 Block이 Buffer에 없으면 Disk에서 데이터를 가져와 Buffer에 할당한다
    • 이 때 Buffer에 자리가 없으면 기존 Block을 버려야하고 기존 Block에 변경 사항이 있으면 Disk에 write해주어야 한다
    • 새롭게 할당 된 Block의 Main Memory 주소를 반환한다
  • Pinned block : 해당 block이 교체되지 않도록 면제권을 받은 block을 의미한다
    • Pin/Unpin : 교체를 원하지 않으면 Pin하고 교체가 되도록 허용하고 싶으면 Unpin을 한다. Pin Count를 두어 여러번 Pin하는 것을 허용 하기도 한다 (Concurrency를 위해)
  • Lock : Concurrency를 보장하기 위해 Locking을 사용한다
    • Shared Lock : Read 연산시 Shared Lock을 사용해야 한다. Shared Lock은 여러 개가 동시에 사용가능 하지만 Exclusive Lock이 있을 경우 기다려야 한다
    • Exclusive Lock : Update 연산시 Exclusive Lock을 사용해야 한다. Exclusive Lock은 딱 한 개만 존재 할 수 있다.

Buffer-Replacement Policies

Buffer Manager에서는 효율적으로 Buffer를 관리하기 위해 Buffer를 교체하는 알고리즘을 사용한다

LRU

  • OS에서 주로 사용하는 LRU (Least Recently Used strategy)는 DB에서는 비효율적이다
    - DB에서는 주로 어떤 값을 찾기 위해 순차적으로 Block에 접근하는 경우가 많다
    - 그렇기 때문에 가장 최근에 사용된 Block은 상대적으로 필요 없는 경우가 많고 가장 최근에 사용되지 않은 block이 오히려 더 필요하다 (JOIN 연산을 생각)
  • 테이블 A와 테이블 B를 JOIN 하려고 할 때, Buffer의 크기가 block 4개라고 가정하고 현재 처리해야 하는 A를 저장한 버퍼와 Result를 저장한 버퍼는 Pin을 한다
  • A-1 block을 먼저 올리고 B의 1,2,3과 JOIN을 먼저 해주어야 한다
  • 그렇다면 B의 1,2는 buffer 교체없이 사용 할 수 있다 그러나 3번째 block은 교체가 필요하다
  • A-1과 결과를 저장하는 block은 Pin되어 있을 것이다 LRU를 사용 한다면 B-1이 교체 되어야 한다
    • 이 경우 A-1과의 JOIN 연산이 끝나고 A-1이 A-2와 교체 되었을 때, B-1이 필요하지만 교체 되어 DISK I/O가 필요하다
    • 그래서 LRU에 의해 B-2가 나가고 B-1이 들어오면 다시 그 다음으로 B-2가 필요하다
    • 계속 다음으로 필요한 block이 교체되는 것을 알 수 있다

MRU

  • MRU (Mst Recently Used)를 사용한다고 생각 하면 B-2 대신 B-3가 교체될 것이다
    • 따라서 B-1은 그대로 Buffer 교체 없이 사용 가능하다
    • 그리고 B-1은 바로 B-3와 교체되어 B-2도 바로 사용 가능하다
  • 단순한 예제이지만 MRU가 더 효율적인 것을 알 수 있다\

Toss Immediate

  • Toss Immediate : 해당 block의 처리가 끝나자 마자 바로 버퍼에서 제거하는 방식
  • 위에는 단순한 예제이고 실제로 Buffer Manager는 통계 정보를 활용하여 버퍼를 관리하기도 한다
    • EX) Data Dictionary의 경우 매우 자주 조회되기 때문에 메모리에서 교체되지 않는다

0개의 댓글