본문 바로가기

CS

하드 디스크 드라이브

파일 시스템 기술들이 거의 대부분 하드 디스크 드라이브의 동작에 기반을 두고 개발되었기 때문에 하드 디스크 드라이브에 대해 알아보자. 디스크에 있는 데이터를 어떻게 저장하고 접근할까?? 

모든 현대 드라이브의 기본적인 인터페이스는 단순하다. 드라이브는 읽고 쓸 수 있는 매우 많은 수의 섹터(512byte)들로 이루어져 있다. 디스크 위의 n개의 섹터들은 0부터 n-1까지의 이름이 붙어 있다. 따라서 디스크를 섹터들의 배열로 볼 수 있고 0부터 n-1이 드라이브의 주소가 된다. 많은 파일 시스템들이 한 번에 4KB를 읽거나 쓴다. 하지만 드라이브 제조사는 하나의 512byte 쓰기만 원자적이라고 보장한다. 그래서 갑자기 전력이 나가면 대량의 쓰기 중에 일부만 완료될 수 있다. 이런 현상을 torn write라고 한다.  드라이브는 당연히 멀리 있는 블록보다 가까이 있는 블록을 접근하는 게 빠르다. 또한 연속적인 청크가 랜덤 블록 접근보다 빠르다.

디스크의 기본 구조를 알아보자 (이미지 출처: https://ko.wikipedia.org/wiki/%ED%95%98%EB%93%9C_%EB%94%94%EC%8A%A4%ED%81%AC_%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B8%8C)

먼저 플래터는 자기적 성질을 변형하여 데이터를 지속시킨다. 플래터는 회전축이라는 것으로 고정되어 있는데, 회전속도는 분당 회전 수 (RPM)로 측정된다. 각 표면에 동심원을 따라 배치되어 있는 섹터들 위에 데이터가 부호화된다. 이때 동심원 하나를 트랙이라고 한다. 표면 위를 읽거나 쓸 때에는 디스크의 자기적 패턴을 감지하거나 변형을 유도하는 기계적 장치가 필요한데 이걸 디스크 헤드가 한다. 다음은 디스크가 어떻게 동작하는지 알아보자.

우리가 사용하는 간단한 디스크의 경우 그렇게 많은 일을 할 필요가 없다. 디스크 헤드 아래에 원하는 섹터가 위치하기를 기다리면 된다. 이러한 기다림을 회전형 지연, 회전 지연이라고 한다.  이제 트랙이 여러개 있는 디스크를 생각해 보자. 디스크가 원하는 섹터로 이동하려면 그 섹터가 포함된 트랙으로 이동해야 하는데, 이 트랙을 찾는 과정을 탐색이라고 한다. 회전과 더불어 탐색은 가장 비용이 큰 동작이다. 트랙을 찾고 원하는 섹터를 찾았다면 확실히 하기 위해 안정화 시간이라는 시간도 걸린다. 그 외 세부사항으로 track skew라는 기술을 채용하여 트랙의 경계를 지나서 순차적으로 존재하는 섹터들을 올바르게 읽게 한다. 또한 현실에서 바깥 측 공간이 안쪽보다 많다는 구조적인 이유로 바깥쪽이 섹터를 더 많이 갖고 있다. 이러한 트랙들은 흔히 멀티 구역 디스크 드라이브라 불린다. 마지막으로 디스크 드라이브의 가장 중요한 부분은 캐시로서 트랙 버퍼라고도 부른다. 캐시는 작은 메모리로 디스크에서 읽거나 쓴 데이터를 보관 하는 데 사용한다. 예를 들어, 디스크에서 하나의 섹터를 읽을 때 드라이브가 그 트랙 위의 모든 섹터를 다 읽어서 캐시에 저장할 수도 있다. 이렇게 하면 같은 트랙 섹터에 대한 요청이 있을 때 빠르게 응답 가능하다. 쓰기의 경우에는 드라이브는  메모리 데이터가 기록된 시점에 쓰기가 완료되었다고 할지 디스크에 실제로 기록되었을 때 완료가 되었다고 할지를 정할 수 있다. 전자는 write-back이라 하고 후자는 write-through 라 한다. 전자가 더 빨라 보이지만 위험 할 수 있다.

다음으로 스케줄링에 대해 알아보자. 각 작업의 길이가 얼마나 될지 알 수 없는 작업 스케줄링과 다르게 디스크 스케줄링의 경우 디스크 요청 작업이 얼마나 길지를 꽤 정확히 예측할 수 있다. 요청의 탐색과 회전 지연의 정도를 예측하면 각 요청이 얼마나 오래 걸릴지 디스크 스케줄러가 알 수 있기 때문에 처리할 수 있는 가장 빠른 요청을 선택할 수 있다. 이와 같이 디스크 스케줄러는 SJF의 원칙을 따르려고 노력한다.

SSTF: 최단 탐색 시간 우선 

이 방법은 가장 가까운 블럭을 우선적으로 사용한다. 문제는 starvation이 일어난다. 계속 가까운 요청만 처리하게 된다. 따라서 다른 방식 나옴 SCAN 또는 엘리베이터라고 한다. 디스크가 한 방향 혹은 왔다 갔다 할 때 번 스위프에 지나간 트랙에 대해 요청이 들어오면 바로 처리 안 하고 다음번 스위프(반대방향)에 처리되도록 큐에서 대기한다. 하지만 이러한 방식도 최고의 성능을 내지 않는다. 왜냐하면 이 기법들은 회전을 무시하기 때문이다. 그래서 나온 게 SPTF 최단 위치 잡기 우선이다.  만약 탐색이 회전보다 훨씬 빠르다면  이전 방식들이 잘 동작한다. 하지만 보통 탐색과 회전이 비슷하기 때문에  SPTF가 유용하다. SPTF는 상황마다 다르기 때문에 이걸 구하려면 디스크 드라이브 내에서 실행되어야 한다.

그래서 요즘 스케줄러들은  디스크에서 동작한다. 디스크 스케줄러가 수행하는 중요한 또 다른 관련 작업은 I/O 병합이다. 예를 들어 가까운 블럭 요청들과 먼 요청이 들어오면 가까운 요청을 병합해서 처리하기 위해 스케줄러가 해당 요청들을 재배치한다. 마지막 문제로 요청이 올 때마다 처리를 해야 하는가 아니면 기다렸다가 효율적으로 처리해야 하는 문제다.  work-conserving이 디스크가 유휴 상태가 되지 않도록 하는 방식이고, non-work-conserving 방식이 후자이다.

'CS' 카테고리의 다른 글

파일 시스템 구현  (0) 2021.10.26
RAID  (0) 2021.10.26
입/출력 장치 개념  (2) 2021.10.25
Threads  (0) 2021.10.22
Pintos Project3: Virtual Memory  (0) 2021.10.21