레코드를 저장하는데는 먼저 다음 두 방식이 사용됩니다.
- Spanning 방식
- Non - Spanning 방식
먼저 Spanning 방식은 레코드를 저장할 때, 두 섹터에 걸쳐서 저장합니다. 따라서, 내부단편화가 발생하지 않지만 레코드를 읽을 때 두 개의 섹터를 접근해야하는 상황이 생길 수 있어 I/O 시간이 늘어날 수 있습니다.
Non - Spanning 방식은 한 섹터에 레코드를 저장하고 빈 공간은 사용하지 않는 방식입니다. Spanning 방식과는 다르게 두 섹터에 걸쳐서 저장하지 않으므로 내부 단편화가 발생합니다. 대신 Spanning 방식에서 발생했던 I/O 시간 문제는 일어나지 않습니다.
앞선 포스팅에서 언급했던 익스텐트를 사용하게 될경우 너무 작은 크기의 빈 익스텐트가 발생합니다. 즉, 외부단편화의 문제를 가지고 있습니다.
다음은 트랙이 구성되는 방식입니다. 크게 다음 두가지 방식이 있습니다.
- 섹터 방식
- 블록 방식
섹터 방식의 경우 말 그대로 섹터에 저장하는 것이므로 크기가 섹터 크기에 고정됩니다.
다음으로 블록이 구성되는 방식입니다.
블록 방식의 경우 사용자가 임의로 정의한 크기로 저장하는 방식입니다. 이때 임의의 크기를 블록킹 계수 (Blocking Factor)로 지정합니다. 블록킹 계수는 파일 내 각 블록에 들어갈 고정된 레코드 수를 의미합니다.
블록 주소 방식도 있는데, 이는 각 블록의 앞에 데이터 블록의 크기를 포함하는 여러개의 서브블록을 생성하는 방식으로, 데이터 블록의 크기를 포함하는 계수 서브 블록과 데이터 블록의 마지막 레코드의 키에 대한 정보를 포함하는 키 서브 블록이 있습니다. 키 서브 블록의 경우 키 값으로 검색을 빨리하게 끔 합니다.
다음으로 Nondata Overhead에 대해서 서술하겠습니다.
섹터 주소 방식에서 Nondata Overhead란, 섹터 주소, 트랙 주소, 파일의 정보 등의 논리적 정보나 트랙, 섹터 사이의 간격(Gap)을 주로 Nondata Overhead로 취급합니다.
블록 구성 방식에서는 서브 블록이나 데이터 블록 사이의 간격을 Nondata Overhead로 취급합니다.
블록 구성 방식에서 앞서 설명한 블록킹 계수를 증가시켜 저장 효율을 향상 시킬 수 있습니다. (Nondata Overhead의 감소)
하지만, 너무 늘리게 될 경우 내부 단편화와 대용량 메모리 버퍼 공간을 요구하므로, 적당히 유지하는게 바람직합니다.
다음으로 디스크 접근 시간을 구하기 위한 내용입니다.
먼저 탐색 시간 (Seek Time) 입니다. 탐색시간은 지정된 실린더 까지 헤드가 이동하기 위한 시간으로 최악의 경우 가장 바깥 실린더에서 가장 안쪽 실린더로 이동하는 경우까지 소요됩니다.
다음으로 회전 지연 시간 (Rotational Delay) 입니다. 회전 지연 시간은 지정된 섹터가 헤드 밑에 올 때 까지 회전하는 시간을 의미합니다. 이것도 마찬가지로 최악의 경우 금방 지나가버린 섹터가 지정될 경우 섹터가 1바퀴를 더 돌아야하는 시간이 소요됩니다. 회전 지연 시간은 디스크에 주어진 RPM (Rotation per Minute)을 통해 구하는데 다음 식을 참고하면 됩니다. EX) 5000 rpm의 경우, 60 / 5000 = 12 msec / rotation
마지막으로 전송 시간 (Transfer Time) 입니다. 전송 시간은 헤드 아래에 위치한 데이터를 메모리 버퍼로 이동하는데 걸리는 시간으로, 트랙 전체 크기의 전송시간은 디스크 1회전 시간과 같습니다. 식은 아래와 같습니다.
전송 될 바이트 크기 / 트랙 당 바이트 크기 * 1회전 시간 = 전송 시간
위 3가지를 통해 순차 읽기와 임의 읽기의 시간을 구할 수 있습니다.
먼저 순차 읽기의 경우, Average Seek Time + Average Rotational Delay + Transfer Time 으로 구할 수 있습니다.
EX) Seek Time이 16msec, Rotational Delay가 6msec, Transfer Time이 6msec 일때, 8 + 3 + 6 = 17 msec / track
result = 읽고자 하는 트랙 수(여기선 100으로 가정) * 17 msec = 1700 msec = 1.7초
레코드 임의 읽기는 Average Seek Time + Average Rotational Delay + Cluster Transfer Time 으로 구할 수 있습니다.
EX) Seek Time이 16msec, Rotational Delay가 6msec, 21.25 Cluster / track, Transfer Time이 6msec 일때,
8 + 3 + (1 / 21.25 * 6msec) = 11.28 msec
result = 레코드 수(34000으로 가정) * 11.28 msec = 383,520 msec = 383초
블록 (클러스터)를 사용함으로써 한 클러스터 안에서는 물리적으로 연속되는 장점을 얻을 수 있으나, 블록의 크기가 작게될 경우 빈번한 탐색으로 Seek Time의 증가, 반대로 블록이 크게 되면 내부 단편화가 발생하는 단점을 가집니다. 즉 이 또한 적당히 유지하는것이 좋습니다. (블록킹 계수와 동일)
디스크로 인한 병목 현상을 해소하는데 있어서 여러 방법이 있습니다.
먼저 Multi Programming을 통해서 해소하는 방법인데, 이 방법의 경우 Disk Bound 프로세스에겐 해결되지만, Cpu Bound 프로세스에겐 의미가 없습니다.
다음으로, Striping입니다. 이 방법은 여러개의 디스크에 파일의 블록들을 병렬로 저장 및 접근 하는 방법입니다. 이 방법을 사용하면 디스크의 개수 배만큼 빨라지므로 병목 현상의 해결책으로 사용됩니다. (EX) RAID
마지막으로 Memory Hierachy를 이용하여 디스크의 페이지 일부를 램의 버퍼에 저장하여 데이터가 디스크 캐시 영역에 저장되어 있다면 Disk I/O를 수행하지 않음으로써 병목 현상을 해소합니다. 이 방법을 디스크 캐싱 혹은 버퍼링이라고 부릅니다.
'Computer Science > 파일처리' 카테고리의 다른 글
레코드와 필드 (1) | 2024.03.08 |
---|---|
UNIX Kernel (0) | 2024.03.08 |
Write (0) | 2024.03.07 |
테이프와 CD-ROM (0) | 2024.03.07 |
파일 구조 (1) | 2024.01.24 |