Hard Disk Drives

박정빈·2024년 6월 9일

운영체제

목록 보기
25/25

하드디스크 드라이브에 대해 알아보자. 이 드라이브는 수십년 동안 컴퓨터 시스템이서 지속적인 데이터 저장의 주요 형태로 사용되어 왔으며, 파일 시스템 기술의 발전 중 많은 부분이 이 드라이브의 동작에 기반하고 있다. 따라서, 파일 시스템 소프트웨어를 구축하기 전에 디스크의 작동 방식을 이해하는 것이 중요하다.

현대 하드디스크 드라이브는 데이터를 어떻게 저장하는지, 인터페이스는 무엇이고, 데이터는 실제로 어떻게 배치되고 접근되는지에 대해 알아보자

The Interface 인터페이스

현대 디스크 드라이브의 인터페이스를 이해하는 것부터 시작해보자 드라이브는 많은 섹터(512 바이트 블록)로 구성되어 있으며, 각각은 읽기,쓰기가 가능하다. 디스크의 총 섹터는 n이며, 섹터는 0부터 n-1까지 번호가 매겨져있다. 따라서 디스크를 섹터의 배열로 볼 수 있으며, 0부터 n-1까지가 드라이브의 주소 공간이 된다.

멀티 섹터 작업이 가능하며, 실제로 많은 파일 시스템이 한 번에 4KB 또는 그 이상의 데이터를 읽거나 쓴다. 그러나 디스크를 업데이트할 때, 드라이브 제조업체가 보장하는 유일한 사항은 단일 512바이트 쓰기 작업이 원자적이라는 것이다. (즉, 모두 완료되거나 모두 완료되지 않음) 따라서, 예기치 않은 전원 손실이 발생하면, 더 큰 쓰기 작업의 일부만 완료될 수 있다. (이것을 torn write라고 한다.)

디스크 드라이브의 대부분의 클라이언트가 하는 몇 가지 가정이 있지만, 인터페이스에 직접 명시되어 있지는 않는다. Schlosser와 Ganger는 이것을 디스크 드라이브의 "암묵적인 계약"이라고 불렀다.
구체적으로,
1. 드라이브의 주소 공간 내에서 서로 가까운 두 블록에 접근 하는 것이 서로 먼 두 블록에 접근하는 것보다 더 빠를 것이라고 가정할 수 있다.
2. 연속적인 청크로 블록에 접근하는 것이 가장 빠른 접근 모드이다.

Basic Geometry 구성요소

디스크의 구성요소를 이해해보자 먼저 플래터(platter)부터 시작한다.
플래터는 데이터를 지속적으로 저장하기 위해 자기 변화를 유도하여 데이터를 저장하는 원형의 단단한 표면이다. 디스크에는 하나 이상의 플래터가 있을 수 있으며, 각 플래터는 2개의 면을 가지고 있다.(앞,뒤) 플래터들은 보통 알루미늄과 같은 단단한 재질로 만들어지며, 얇은 자기 층으로 코팅되어 들라이브가 전원이 꺼져 있어도 비트를 지속적으로 저장할 수 있게 한다.

플래터들은 모두 스핀들(spindle) 주위에 묶여 있으며, 스핀들은 모터에 연결되어 드라이브가 켜져 있는 동안 플래터들을 일정한 속도로 회전시킨다. 회전 속도는 보통 분당 회전수(RPM)으로 측정되며, 일반적인 값은 7,200RPM ~ 15,000RPM 이다. 만약 10,000RPM으로 회전하는 드라이브는 한 회전에 약 6ms가 걸린다.

데이터는 플래터의 각 표면에 동심원의 섹터로 인코딩된다. 이 동심원은 트랙(track)이라고 부른다. 표면에는 수천,수만개의 트랙이 촘촘하게 밀집되어 있으며, 수백개의 트랙이 머리카락에 들어갈 수 있을 정도로 작다.

표면에 데이터를 읽고 쓰기 위해서는 디스크의 자기 패턴을 감지(읽기)하거나 변화를 유도(쓰기)할 수 있는 메커니즘이 필요하다. 이 읽기 및 쓰기 과정은 디스크 헤드(disk head)에 의해 수행된다. 드라이브의 각 표면에는 하나의 헤드가 있다.디스크 헤드는 단일 디스크 암(disk arm)에 부착되어 있으며, 원하는 트랙위에 헤드를 위치시키기 위해 표면을 가로질러 움직인다.

A Simple Disk Drive

디스크의 작동을 이해하기 위해 트랙을 하나씩 모델링 해보자. 단일 트랙을 가진 간단한 디스크를 가정해보겠다.

이 트랙에는 12개의 섹터가 있으며, 각 섹터의 크기는 512바이트이고, 0부터 11까지 번호가 매겨진다. 물론, 스핀들과 디스크 헤드, 디스크 암도 있으며, 플래터는 반시계 방향으로 회전하고 있다.

회전 지연

만약 블록 0을 읽으라는 요청이 들어온다면, 원하는 섹터가 디스크 헤드 아래로 회전하기를 기다린다. 이 기다림을 회전지연(rotational delay)이라고 한다. 예를 들어 전체 회전 지연이 RR이라면, 디스크는 6에서 0까지 R2\frac{R}{2}의 회전 지연을 겪어야한다.

탐색 시간

이번에는 세개의 트랙이 있는 플래터를 생각해보자 헤드는 가장 안쪽 트랙에 위치하고 있다.
만약 섹터 11을 읽으라는 요청이 들어온다면, 디스크암을 올바른 트랙(가장 바깥쪽 트랙)으로 이동해야한다. 이 과정을 탐색(seek)이라고 한다. 탐색은 회전과 함께 가장 비용이 많이 드는 디스크 작업이다.

탐색에는 여러 단계가 있다.
1. 디스크 암이 움직이기 시작할 때 가속 단계
2. 암이 최대 속도로 이동하는 동안의 유지 단계
3. 암이 느려지는 감속 단계
4. 헤드가 올바른 트랙 위에 정확히 위치하도록 하는 정착(settling) 단계
정착 시간(settling time)은 매우 중요하고 0.5~2ms정도 걸린다.

섹터 11이 디스크 헤드 아래로 지나갈 때, I/O의 마지막 단계가 진행된다. 이 단계는 전송(transfer)이라고 하며, 데이터가 표면에서 읽히거나 쓰여진다.

이렇게 해서 I/O의 과정을 살펴보았다. 탐색, 회전 지연 대기, 전송 순으로 이루어진다.

기타 세부 사항

  1. 많은 드라이브는 트랙 경계를 넘나들 때 순차적 읽기(sequential reads)를 제대로 처리할 수 있도록 트랙 스큐(track skew)를 사용한다.

섹터는 종종 스큐 처리된다. 트랙 간 전환 시 디스크는 헤드를 재배치 하는데 시간이 필요하기 때문이다. 스큐 없이 헤드를 다음 트랙으로 이동시키면 원하는 다음 블록이 이미 헤드 아래로 회전하여 드라이브가 다음 블록에 접근하기 위해 거의 전체 회전 지연을 기다려야한다.
트랙 스큐
만약 회색으로 처리된 24,25,34와 12,23,22를 읽고 싶다면 사진에서는 12를 읽은 후 34로 넘어가면 되지만, 회색 부분이 붙어있다면, 한 트랙을 읽고 또, 한바퀴 기다린 다음 다른 트랙을 읽어야할 것이다. 스큐를 사용하면 바로 넘어갈 수 있다.

  1. 바깥쪽 트랙은 안쪽 트랙보다 더 많은 섹터를 갖는다. 원의 바깥쪽이 더 많은 공간이 있기 때문이다. 이러한 트랙은 다중 구역 디스크 드라이브(multi-zoned disk drives)라고 한다. 디스크는 여러 구역(zone)으로 조직화되어있고, 또, 구역은 연속적인 트랙들의 집합이다. 각 구역은 투랙 당 동일 수의 섹터를 가지며, 바깥쪽 구역은 안쪽 구역보다 더 많은 섹터를 갖는다.

  2. 디스크 드라이브에서 중요한 부분은 캐시(cache)이며 트랙 버퍼(track buffer)라고 불린다. 이 캐시는 드라이브가 디스크에서 읽거나 쓰는 데이터를 보유할 수 있는 작은 메모리이다. 예를 들어 디스크에서 섹터를 읽을때 드라이브는 해당 트랙의 모든 섹터를 읽어 메모리에 캐시해서 다음 요청에 빠르게 응답할 수 있다.

  3. 쓰기 작업을 할 때, 드라이브는 선택을 할 수 있따.
    데이터를 메모리에 저장했을 떄, 쓰기가 완료되었음을 인정할지,
    아니면 실제로 디스크에 쓰여졌을때 인정할지
    전자는 쓰기 후 캐싱(write back caching) 또는 즉시 보고(immediate reporting)라고 하며, 후자는 쓰기 통과(write through)라고 한다.
    쓰기 후 캐싱은 드라이브가 더 빠른것 처럼 할 수 있지만 위험할 수도 있다. 파일 시스템이나 애플리케이션이 데이터가 특정 순서대로 디스크에 쓰여져야 정확성을 보장하는 경우, 쓰기 후 캐싱은 문제를 일으킬 수 있다.

I/O Time

I/O시간을 세가지 구성요소의 합으로 나타낼 수 있다.
TI/O=Tseek+Trotation+TtransferT_{I/O}=T_{seek}+T_{rotation}+T_{transfer}

I/O속도(RI/OR_{I/O})는 드라이브 간 비교에 사용되곤 한다.
RI/O=SizeTransferTI/OR_{I/O}=\frac{Size_{Transfer}}{T_{I/O}}

두 가지 workload가 있다고 가정해보자
첫 번째는 랜덤random workload로, 디스크 임의위치에 작은(4KB)읽기 요청을 수행한다. 이것은 DBMSS등 어플리케이션에서 흔히 발생한다.
두 번째는 순차적sequancial workload로, 디스크에서 섹터를 연속적으로 읽으며 이리저리 이동하지 않는다. 이것도 매우 흔하고 중요하다.

두 workload 간의 성능 차이를 이해하기 위해 디스크 드라이브에 대한 가정을 하자 Seagate의 두 가지 디스크로 생각해보겠다.

두 드라이브는 두 가지 중요한 구성 요소를 요약한다.
첫 번째는 고성능 드라이브 시장으로 빠른 회전,낮은 탐색 시간, 빠른 전송을 할 수 있다.
두 번째는 용량 시장으로 바이트당 비용이 가장 중요한 측면이다. 느리지만 많은 비트를 저장할 수 있다.

이제 두 workload와 두 디스크로 비교를해보자

random workload 에서

평균 탐색 시간(4ms)는 제조업체가 보고한 평균 시간으로 표면의 한 끝에서 다른 끝 까지의 전체 탐색은 2,3배 더 오래 걸릴 수 있다. 15000RPM은 초당 250회 회전에 해당ㅎ하며, 각 회전은 4ms가 걸린다. 평균적으로 디스크는 반바퀴를 수행하며, 평균 시간은 2ms이다.
전송 시간은 전송 크기를 최대 전송 속도로 나눈 값이다. 여기서는 매우 작아서 무시할 만하다. (30microsecs)

공식에서 Cheetah의 TI/OT_{I/O}는 대략 6ms이다. I/O 속도를 계산하려면 전송 크기를 평균 시간으로 나누기만 하면 되므로, 랜덤 워크로드에서 Cheetah의 RI/OR_{I/O}는 약 0.66MB/s이다.

동일한 계산을 Barracuda에 적용하면 TI/OT_{I/O}는 약 13.2ms로 두 배 이상 느리며, 속도는 약 0.31MB/s이다.

sequantial workload 에서 매우 긴 전송 이전에 단일 탐색과 회전이 있다고 가정할 수 있다. 간단학 전송 크기를 100MB로 가정한다. Cheetah와 Barracuda의 TI/OT_{I/O}는 약800ms와 950ms이다. I/O속도는 125MB/s와 105MB/s이다.
 Disk Drive Performance: SCSI Versus SATA

workload간에 드라이브 성능에서 큰 차이가 있으며 Cheetah는 약 200배, Barracuda는 300배 이상의 차이가 있다.

그리고 고급 "성능" 드라이브와 저급 "용량" 드라이브 간에 큰 성능 차이가 있다

디스크 스케줄링

I/O 비용이 높기 때문에, OS는 디스크에 발행되는 I/O의 순서를 결정하는 역할을 해왔다. 디스크 스케줄링은 디스크 요청이 얼마나 걸릴지 예측할 수 있다. 요청의 탐색 시간과 회전 지연 시간을 추정하여 스케줄러는 가장 짧은 시간 안에 처리할 수 있는 요청을 먼저 선택한다. 따라서 디스크 스케줄러는 운영시 SJF (Shortest Job First)의 원칙을 따르려고 한다.

SSTF: Shortest Seek Time First

SSTF는 트랙별로 I/O요청 큐를 정렬하여 가장 가까운 트랙의 요청을 먼저 처리한다.

예를 들어 21번 섹터와 2번 섹터에 대한 요청이 있을 때, 21번 요청을 먼저 처리한다.
하지만 여기서 몇가지 문제가 있다.
1. drive geometry가 호스트 OS에 제공되지 않는다. 대신 OS는 블록 배열을 보게된다. 이것은 SSTF 대신 가장 가까운 블록 주소의 요청을 스케줄링하는 NBF(Nearest-Block-First)로 해결할 수 있다.
2. Starvation이 발생한다. 안쪽 트랙의 요청이 계속 들어온다면, 바깥쪽 트랙에 대핸 요청은 무시될 것이다.

Elevator (a.k.a. SCAN or C-SCAN)

SCAN 알고리즘은 디스크를 가로질로 트랙 순서대로 요청을 처리하는 방식이다. 다스크를 한 번 가로지르는 동작은 스윕(sweep)이라고 부른다. 따라서, 현재 스윕에서 이미 처리된 트랙에 대한 블록 요청이 들어오면 즉시 처리되지 않고 다음 스윕(반대 방향)까지 대기열에 남게된다.

SCAN에는 여러 변형이 있다.
F-SCAN은 스윕동안 들어오는 요청을 나중에 서비스할 대기열에 넣어 멀리 떨어진 요청의 starvation을 방지한다.
C-SCAN은 Circular SCAN의 약자로 디스크를 양방향으로 스윕하는 대신 외부에서 내부로만 스윕하고, 외부 트랙에서 다시 시작한다. 이렇게 하면 중간 트랙이 많이 탐색되던것이 사라지고 끝쪽 트랙에게 공정하게 작동한다.

하지만 SCAN들은 최고의 스케줄링 기술이 아니다. 특히 SCAN은 SJF 원칙을 따르지 않는다. 특히, 회전을 무시한다.

SPTF: Shortest Positioning Time First


섹터 30의 암은 다음으로 섹터 16으로 가야할지, 섹터 8로 가야할지 정해야한다. 어느것을 먼저 처리해야 할까? 답은 '그때 그때 달라요' 이다. 회전이 탐색보다 빠르다면 가까운 트랙으로 가는 것(SSTF)이 좋다. 하지만 탐색이 회전보다 빠르다면 멀리 이동한 후 회전을 기자리는 것이 더 빠를 것이다.
현대 드라이브에서는 탐색과 회전이 거의 동등하다. 따라서 SPTF는 유용하다. 하지만 회전에 대한 OS의 정확한 정보가 없으므로 OS에서 구현하기가 어렵다 따라서 SPTF는 보통 드라이브 내부에서 수행된다.

Other Scheduling Issues

과거 시스템에서는 OS가 모든 스케줄링을 수행했다. 현대 시스템에서는 디스크 내부에 정교한 내부 스케줄러가 있다. (디스크 컨트롤러내에서는 관련 정보를 사용할 수 있으으로 SPTF를 구현할 수 있다!)

디스크 스케줄러가 수행하는 다른 중요한 작업은 I/O병합이다. 연속된 블록에 대한 요청이 들어오면 연속적으로 처리할 수 있으므로 이를 병합하여 처리하는 것이 효율적이다. 디스크로 보내는 요청 수를 줄이고 이로 인한 오버헤드를 낮출 수 있으므로 OS에 아주 중요하다.

디스크에 I/O를 얼마나 오랫동안 발행해야할까? I/O요청이 있을 때마다 드라이브에 발행하고 반납할 수 있지만, 연구에 따르면 디스크에서 잠깐 기다리는 것이 다음 요청을 바로 수행할 수 있어서 효율성이 증가한다고 한다.

0개의 댓글