기억장치 계층 구조
컴퓨터 시스템에서의 기억장치는 아래의 그림과 같이 계층구조로 구성이 되어있다.▼
이 중에서 CPU(DBMS)가 다루는 데이터는 메인 메모리, 즉 RAM에 해당하는 데이터이다.
"그렇다면 왜 컴퓨터 시스템은 CPU가 다루기 편하지 않게 RAM에 정보를 다 저장하지 않을까?"
메인 메모리에 다 저장하지 않는 이유
비용
첫번째 이유는 비용이다.
같은 용량에 대해 주 기억장치의 비용은 디스크보다 약 100배 정도가 높다. ▼
HDD는 1GB 당 36원인 반면 RAM은 1GB당 4000원 꼴이다.
소멸성
또 다른 이유는 데이터를 유지하기 위함이다.
프로그램이 아무리 오래 돌아가봐야 한 번은 컴퓨터를 종료시키는 때에 같이 종료된다.
그러나 메인 메모리는 소멸성 메모리이기 때문에 프로그램이 종료되는 순간 그동안 연산한 데이터들이 모두 사라지게 된다.
우리는 프로그램이 꺼졌다가 켜져도 해당 데이터의 연속성을 원하기 때문에 비소멸성 메모리인 디스크를 저장장치로 사용한다.
디스크
디스크 구조
- 섹터 (Sector): 디스크의 가장 작은 논리적 단위로, 고정된 크기의 블록으로 구성된다.
- 이 섹터들은 디스크에 연속적으로 배치되어 있으며, 디스크 상의 물리적 위치에 따라 고유한 섹터 번호를 갖는다.
- 트랙 (Track): 디스크 상의 섹터들이 모여 만들어지는 원형의 경로를 의미한다.
- 각 트랙은 동일한 반지름을 가지며, 디스크의 중심을 중심으로 회전한다.
- 실린더 (Cylinder): 디스크 상의 같은 반지름에 있는 모든 트랙의 집합을 의미한다.실제로 있는 물리적인 요소가 아닌 논리적인 요소이다.
- 디스크의 모든 트랙들을 수직으로 나란히 놓았을 때, 같은 위치에 있는 섹터들을 세로로 연결한 형태로 생각할 수 있다.
디스크 용량 계산
Sector 를 512KB라고 하자.
Platter
Track의 개수를 전부 합하면 한 Platter의 용량이 나오게 된다.
Track이 50K ~ 100K개라고 하면, 12.5 ~ 100GB 정도가 나온다.
Track
Sector의 개수를 전부 합하면 한 Track의 용량이 나오게 된다.
Sector가 500 ~ 2000개라고 하면, 256KB ~ 1MB 정도가 나온다.
RAID
RAID는 "Redundant Array of Independent Disks"의 약자로 여러 개의 디스크를 하나의 논리적인 디스크로 구성하여 데이터의 안정성, 성능, 저장 용량 등을 향상시키는 기술이다.
RAID에는 여러 레벨이 있으며, 각 레벨마다 다른 특징이 있다.
RAID 0 : Striping
데이터를 여러 디스크에 나누어 저장하는 방식으로 성능을 향상시키는 RAID 레벨이다.
디스크마다 데이터를 동시에 읽고 쓸 수 있기 때문에 다른 RAID 레벨들 중 입출력 성능이 가장 좋다.
이는 함께 갱신해줘야 할 중복 정보가 없기 때문이다.
하지만, 중복 정보가 없기에 하나의 디스크가 고장나면 전체 데이터가 손실된다는 단점이 있다.
RAID 1 : 미러
디스크에 저장된 데이터를 두 개의 디스크에 동일하게 복사하는 방식으로 안정성을 향상시키는 RAID 레벨이다.
RAID 1은 데이터를 동일하게 복사하여 저장하기에, RAID들 중에서 비용이 가장 많이 드는 방법이라고 할 수 있다.
두 개의 디스크 중 하나가 고장나면 다른 하나의 디스크에서 데이터를 복원할 수 있다는 장점이 있지만, 데이터 데스크의 수와 무관하게 실제 공간 활용도는 항상 50퍼센트라는 단점이 있다.
RAID 2 : 오류 수정 코드
RAID0의 Striping을 bit단위로 적용하고, 해밍 코드(Hamming Code)를 사용하여 에러 수정 기능을 추가한 RAID 레벨이다.
데이터 비트를 여러 디스크에 나누어 저장하고, 각 비트에 대한 패리티 비트를 다른 디스크에 저장하여 에러를 검출하고 수정할 수 있다.
RAID 3
여러 디스크에서 데이터를 분산하여 저장하는 방식으로 성능을 향상시키는 RAID 레벨이다.
모든 디스크에서 데이터를 병렬로 읽고 쓸 수 있다.
하지만, 디스크마다 전용 패리티 디스크가 필요하기 때문에 저장 용량이 낭비된다.
RAID 4
RAID 3과 유사하지만, 데이터를 블록 단위로 분산하여 저장하는 방식으로 성능을 향상시키는 RAID 레벨입니다. 하지만, 디스크마다 전용 패리티 디스크가 필요하기 때문에 저장 용량이 낭비됩니다.
RAID 5
여러 디스크에서 데이터와 패리티 비트를 분산하여 저장하는 방식으로 성능을 향상시키는 RAID 레벨입니다. 하나의 디스크가 고장나도 다른 디스크에서 데이터를 복원할 수 있습니다. 저장 용량의 일부가 패리티 비트로 사용된다.
RAID 6
RAID 5와 유사하지만, 여분의 패리티 정보를 저장하여 두 개의 디스크가 고장나도 데이터 복구가 가능하도록 하는 RAID 레벨입니다. RAID 5와 달리 여분의 패리티 정보를 저장하기 때문에 저장 용량이 더 많이 필요합니다.
디스크 공간 관리기
DBMS 소프트웨어의 가장 낮은 레이어는 디스크 상의 공간을 관리한다.
높은 레벨은 이 레이어를 호출하여 페이지를 할당/해제하거나 페이지를 읽거나 쓰기를 요청한다.
순차적으로 접근되는 경우가 많은 데이터를 저장하기 위해 일련의 페이지들을 연속된 일련의 블록들로 할당하는 것이 종종 유용하기도 하다.
높은 레벨에서는 이것이 어떻게 이루어지는지 또는 빈 공간이 어떻게 관리되는지 알 필요가 없이 요청만 하면 된다.
버퍼 관리기
교체 정책 (replacement policy)
데이터 베이스의 디스크가 100만개의 페이지를 가지고 있고, 그 중에 1000개의 페이지만 담을 수 있는 메모리 공간이 있다고 하자.
100만개의 페이지를 전부 읽으려면 해당 메모리에 있는 페이지들을 계속해서 갈아치워야 한다.
“DBMS가 디스크에서 직접 읽어오면 되는데 왜 그렇게 하죠?”
여기서 핵심은 DBMS는 메인 메모리의 데이터만 가지고 작업을 한다는 것이다.
DBMS가 무언가 작업을 하려면 데이터는 무조건 메인 메모리에 올라와 있어야하고, 100만개의 페이지를 읽는 작업을 하려면 1000개의 페이지를 메인 메모리에 올리고 내리고를 반복해서 읽어야한다.
그리고 이런 메인 메모리에 올라오는 페이지를 결정하는 정책을 교체 정책이라고 한다.
버퍼 관리기의 전체적인 모습
버퍼 관리기는 전체적으로 아래와 같은 모습을 하고 있다.▼
- Buffer Pool그리고 이런 페이지의 집합을 버퍼 풀(Buffer Pool)이라고 한다.
버퍼 관리기는 주 기억장치 공간을 페이지라는 단위들로 분할하여 관리한다. - Free Frame
Buffer Pool 내의 주 기억장치 페이지를 프레임(frame)이라고 하며, 페이지를 담을 수 있는 칸이라고 생각하면 된다. - Disk Page
디스크에서 읽어온 페이지를 말한다. - pin_count, dirty 변수
버퍼 관리기는 관리용 정보와 풀 내의 각 프레임에 대해 pin_count와 dirty라는 두 개의 변수를 유지한다.
페이지 요청
상위 레벨 코드에서 페이지를 요청하게 되면 가장 먼저 버퍼 풀에 상위 레벨 코드에서 요청한 페이지가 있는지를 확인한다.
만약 요청한 페이지가 있다면 해당 프레임의 pin_count 값을 증가시킨다.
만약 페이지가 풀에 없으면 버퍼관리기는 다음과 같은 작업을 통해 해당 페이지를 가져온다.
- 페이지 교체 정책에 따라 교체할 프레임을 선택하고 pin_count 값을 증가시킨다.
- 만약 교체할 프레임의 dirty 비트가 켜져있는 경우에는 그 페이지를 디스크에 기록한다.
- 요청된 페이지를 교체 프레임으로 읽어온다.
위 과정을 거친 후 요청된 페이지를 담고있는 프레임의 주 기억장치 주소를 요청자에게 반환한다.▼
pin_count를 증가시키는 것을 흔히 그 변수가 가리키는 프레임 내의 요청된 페이지를 핀한다.(pinning)
버퍼 교체 정책
LRU (Least Recently Used)
가장 오랫동안 참조되지 않은 페이지(page)를 교체하는 방식이다.
메모리에 제한된 공간이 있을 때, 현재 사용되지 않는 페이지를 제거하여 새로운 페이지를 적재하는 기법이다.
pin_count가 0인 프레임들에 대한 포인터들로 이루어진 큐를 사용하여 버퍼 관리기에서 구현될 수 있다.
LRU와 LRU의 변형 방식인 Clock 교체 방식이 굉장히 효율적으로 보이나, 이는 Sequential Flooding이라는 문제가 일어날 수 있다.
순차적 범람(Sequential Flooding)
순차적 범람은 아래의 예제로 쉽게 이해할 수 있다.
먼저 아래와 같이 6개의 프레임에 1번부터 6번까지의 페이지들을 넣었다고 해보자.▼
그리고 7번 페이지가 필요하다고 하여 7번 페이지를 불러오게 되면, 가장 오래전에 사용된 page1은 사라지고 page 7이 들어오게 된다.▼
그런데 아뿔싸, 순차적으로 페이지를 읽기 때문에 아까 제거했던 page1이 다시 필요해졌다.
그래서 이번에는 가장 오래전에 사용된 page2를 없애고 page1을 불러왔다.▼
그리고 순차적으로 페이지를 읽기에 다음에는 page2가 필요한데, 아까전에 제거했기 때문에 frame에 page2가 없다.
그렇기에 아까와 같이 가장 오래전에 사용된 page인 page3를 지우고 page2를 불러왔다.▼
만약에 이를 계속해서 반복한다면 어떨까?
계속해서 페이지를 지우고 불러오는 오버헤드를 반복하게 될 것이다.
이것이 LRU에서 일어날 수 있는 최악의 경우다.
DBMS 대 OS의 버퍼 관리
운영 체제(OS)도 디스크 공간 및 버퍼 관리를 수행한다.
그렇다면 왜 OS에게 이러한 작업을 관리하게 하지 않을까?
운영 체제(OS)의 지원 차이로 인한 이식성 문제
DBMS는 다양한 운영 체제에서 동작해야 하므로, 운영 체제(OS)에 의존하지 않고 자체적으로 디스크 공간 및 버퍼 관리를 수행함으로써 이식성 문제를 해결할 수 있다.
일부 제한 사항
예를 들어, 운영 체제(OS)에서는 파일이 여러 디스크에 걸쳐 저장될 수 없다.
하지만 DBMS에서는 대용량 데이터의 저장이 필요하므로, 파일을 여러 디스크에 걸쳐 저장하는 기능이 필요하다.
페이지를 버퍼 풀에 고정하고, 페이지를 강제로 디스크에 저장할 수 있는 기능
이는 데이터의 일관성 유지와 복구를 위해 중요하다.
또한 교체 정책을 조정하고, 일반적인 DB 작업에서 액세스 패턴에 기반하여 페이지를 사전에 가져와야하다.
이러한 기능은 DBMS에서 직접 구현해야 한다.
따라서 DBMS는 자체적으로 디스크 공간 및 버퍼 관리를 수행함으로써 이식성 문제를 해결하고, DBMS의 요구 사항에 맞는 디스크 공간 및 버퍼 관리를 구현할 수 있다.
레코드 파일
레코드 포맷
'CS > 데이터베이스' 카테고리의 다른 글
인터넷 응용프로그램의 보안 (0) | 2024.03.08 |
---|---|
파일 구성과 인덱싱 (0) | 2024.03.01 |
B+ Tree (0) | 2024.03.01 |
B Tree (0) | 2024.02.20 |
인덱싱개론 (0) | 2024.02.19 |