1. Physical Disk Structure

Disk는 얇은 금속 Platter로 구성되며, 그 위를 Read/Write head가 지나다니며 데이터를 읽고 쓴다.

1.1 디스크 구성 요소

구성 요소설명
Platter데이터가 기록되는 금속 원판 (양면 사용 가능)
SpindlePlatter를 회전시키는 축
Read/Write Head각 Platter 표면 위에 위치하여 데이터를 읽고 씀
TrackPlatter 표면 위의 동심원 형태의 데이터 경로
SectorTrack을 나눈 최소 단위 영역
Cylinder모든 Platter에서 같은 위치에 있는 Track의 집합

1.2 디스크 읽기에 필요한 정보

디스크에서 데이터를 읽으려면 다음을 지정해야 한다:

  1. Cylinder # (어떤 실린더인지)
  2. Surface # (어떤 표면인지)
  3. Sector # (어떤 섹터인지)
  4. Transfer size (전송할 데이터 크기)
  5. Memory address (데이터를 저장할 메모리 주소)

1.3 Transfer Time 구성

Transfer Time = Seek Time + Rotational Delay + Data Transfer Time
구성 요소설명
Seek TimeHead를 원하는 Cylinder로 이동시키는 시간
Rotational Delay (Latency)원하는 Sector가 Head 아래로 회전해 올 때까지의 대기 시간
Data Transfer Time실제 데이터를 읽거나 쓰는 시간

2. Disk Structure (논리적 구조)

  • Disk drive는 Logical block의 큰 1차원 배열로 주소가 지정됨
  • Logical block은 전송의 최소 단위
  • 이 1차원 배열은 Disk의 Sector로 매핑됨

2.1 매핑 순서

  1. Sector 0: 가장 바깥쪽 Cylinder의 첫 번째 Track의 첫 번째 Sector
  2. 해당 Track의 나머지 Sector를 순서대로 매핑
  3. 같은 Cylinder의 나머지 Track을 순서대로 매핑
  4. 바깥쪽에서 안쪽으로 나머지 Cylinder를 순서대로 매핑

실제 제품마다 매핑 방식은 크게 다를 수 있다.

3. Disk Scheduling

3.1 Access Time의 구성

구성 요소설명
Seek timeHead를 원하는 Sector가 있는 Cylinder로 이동시키는 시간
Rotational latencyDisk가 회전하여 원하는 Sector가 Head 아래에 도달하기까지의 추가 대기 시간
  • Seek time 최소화가 Disk scheduling의 핵심 목표
  • Seek time은 Seek distance에 비례

3.2 Disk Bandwidth

Disk Bandwidth = 전송된 총 바이트 수 / (요청 ~ 완료까지의 총 시간)

3.3 Seek Time 모델

Seek Time = a + b * sqrt(d)
  • a, b: 상수
  • d: 이동해야 할 Cylinder 수 (distance)

4. Disk Scheduling Algorithms

다양한 Disk I/O 요청 스케줄링 알고리즘이 존재한다.

예제 공통 조건

  • Cylinder 범위: 0 ~ 199
  • Request queue: 98, 183, 37, 122, 14, 124, 65, 67
  • 현재 Head 위치: 53

4.1 FCFS (First-Come, First-Served)

  • 요청이 들어온 순서대로 처리
  • 구현이 가장 단순
  • 총 Head 이동량: 640 cylinders

처리 순서: 53 98 183 37 122 14 124 65 67

이동량 계산:
|53-98| + |98-183| + |183-37| + |37-122| + |122-14| + |14-124| + |124-65| + |65-67|
= 45 + 85 + 146 + 85 + 108 + 110 + 59 + 2
= 640

4.2 SSTF (Shortest Seek Time First)

  • 현재 Head 위치에서 Seek time이 가장 짧은 (가장 가까운) 요청을 먼저 처리
  • SJF (Shortest Job First) scheduling의 Disk 버전
  • 총 Head 이동량: 236 cylinders

특징:

  • 성능이 FCFS보다 좋지만, Starvation 발생 가능
  • 예측 불가능한 성능 (Unpredictable performance)
  • 먼 위치의 요청이 계속 뒤로 밀릴 수 있음

처리 순서: 53 65 67 37 14 98 122 124 183

4.3 SCAN (Elevator Algorithm)

  • Disk arm이 디스크의 한쪽 끝에서 다른 쪽 끝까지 이동하면서 지나가는 요청을 처리
  • 끝에 도달하면 방향을 반전하여 반대 방향으로 이동하면서 처리
  • 엘리베이터 알고리즘이라고도 불림
  • 총 Head 이동량: 208 cylinders

동작 방식:

  1. 한쪽 방향(예: 증가 방향)으로 이동하면서 모든 요청 처리
  2. 끝에 도달하면 방향 전환
  3. 반대 방향으로 이동하면서 나머지 요청 처리

문제점:

  • 안쪽 Track은 바깥쪽 Track에 비해 2배 자주 서비스
  • 대기 시간이 불균등 (Unfair wait time)

4.4 C-SCAN (Circular SCAN)

  • SCAN보다 균일한 대기 시간을 제공
  • Head가 한쪽 끝에서 다른 쪽 끝까지 이동하면서 요청을 처리
  • 끝에 도달하면 요청을 처리하지 않고 즉시 반대쪽 시작점으로 복귀
  • Cylinder를 원형 리스트(Circular list)로 취급 (마지막 처음으로 연결)

문제점:

  • 해당 방향에 더 이상 처리할 요청이 없어도 끝까지 이동

4.5 C-LOOK

  • C-SCAN의 개선 버전
  • “Look-for-Request before continuing” 방식
  • Arm이 각 방향에서 마지막 요청이 있는 위치까지만 이동
  • 더 이상 요청이 없으면 즉시 방향을 전환
  • 디스크 끝까지 불필요하게 이동하지 않음

4.6 알고리즘 비교 요약

알고리즘Head 이동량 (예제)Starvation대기 시간 균등성특징
FCFS640없음보통가장 단순, 성능 낮음
SSTF236있음낮음SJF와 유사, 성능 좋으나 불공정
SCAN208없음보통Elevator 알고리즘, 안쪽 편향
C-SCAN-없음높음균일한 대기 시간
C-LOOK-없음높음C-SCAN 개선, 불필요한 이동 제거

5. Arm Stickiness Problem

  • SCAN, C-SCAN, SSTF 모두 이 문제에 취약
  • 하나 또는 소수의 프로세스가 특정 Track에 높은 빈도로 접근하는 경우 발생
  • 해당 Track에 대한 요청을 반복하여 디스크 장치 전체를 독점할 수 있음

예시:

요청 큐: 15, 15, 6, 15, 15, 15, 15, 15, 15, 15, ...
-> Track 15에 대한 요청이 계속 들어오면 Track 6의 요청은 처리되지 못함

6. Disk Management

6.1 Physical Formatting (Low-level Formatting)

  • 디스크를 Disk controller가 읽고 쓸 수 있는 Sector로 분할
  • 각 Sector의 구조:
[ Header | Data (일반적으로 512 Bytes) | Trailer ]
영역내용
HeaderSector number
TrailerECC (Error-Correcting Code) - Controller가 사용
Spare sectors각 Cylinder에 Bad block 대체용으로 예약

6.2 OS의 디스크 사용 준비

디스크를 파일 저장에 사용하려면 OS가 자체 데이터 구조를 기록해야 한다:

  1. Partitioning: 디스크를 하나 이상의 Cylinder 그룹으로 분할
    • OS는 각 Partition을 독립적인 디스크로 취급
  2. Logical Formatting (“making a file system”): OS가 사용할 파일 시스템 데이터 구조를 초기화

6.3 부팅 과정 (Power-up)

ROM의 Small Bootstrap Loader
    -> Sector 0 (Boot block) 로드
        -> Full Bootstrap Loader Program 실행
            -> OS를 디스크에서 로드
  1. ROM에 있는 Small bootstrap loader 실행 (유일한 역할: Boot block 로드)
  2. Boot disk의 Sector 0 (Boot block) 을 읽어옴
  3. Boot block에 있는 Full bootstrap loader program 실행
  4. OS를 디스크에서 메모리로 로드

7. RAID (Redundant Array of Inexpensive/Independent Disks)

RAID는 대량의 디스크를 관리하는 기술로, 단일 디스크처럼 보이는 뷰를 제공한다.

7.1 RAID의 목표

목표방법
높은 용량 & 높은 속도여러 디스크를 병렬로 사용
높은 신뢰성데이터를 중복 저장하여 디스크 장애 시에도 복구 가능

7.2 디스크 고장 확률

  • N개의 디스크 중 하나라도 고장날 확률은 단일 디스크 고장 확률보다 훨씬 높음
  • 예: 100개 디스크, 각각 MTTF 100,000시간 (약 11년)
    • 시스템 MTTF = 1,000시간 (약 41일)
  • 대규모 디스크 환경에서는 Redundancy 기법이 필수적

8. Redundancy를 통한 신뢰성 향상

8.1 Mirroring (Shadowing)

  • 모든 디스크를 이중화 (Logical disk = 2개의 Physical disk)
  • 모든 Write는 양쪽 디스크 모두에 수행
  • Read는 어느 쪽이든 가능
  • 한쪽 디스크가 고장나도 다른 쪽에서 데이터 접근 가능

데이터 손실 조건:

  • 한 디스크가 고장나고, 수리가 완료되기 전에 Mirror 디스크도 고장
  • 이 확률은 매우 낮음 (종속적 장애 모드 제외: 화재, 건물 붕괴, 전력 서지 등)

8.2 Mean Time to Data Loss 계산

MTTF = 100,000시간, 평균 수리 시간 = 10시간일 때

Mean Time to Data Loss = 500 x 10^6 시간 (약 57,000년)
(Mirrored pair 기준, 종속적 장애 모드 무시)

9. Parallelism을 통한 성능 향상

9.1 병렬화의 두 가지 목표

  1. Load balancing: 다수의 작은 접근 요청을 분산하여 Throughput 증가
  2. 대용량 접근 병렬화: 여러 디스크에 걸쳐 데이터를 분산하여 Response time 감소 (Transfer rate 향상)

9.2 Bit-level Striping

  • 각 Byte의 비트를 여러 디스크에 분산
  • 예: 8개 디스크 배열에서 각 Byte의 Bit i를 Disk i에 저장
  • 각 접근이 단일 디스크의 8배 속도로 데이터를 읽을 수 있음
  • 하지만 Seek/Access time은 단일 디스크보다 나쁨
  • 현재는 거의 사용되지 않음

9.3 Block-level Striping

  • n개의 디스크가 있을 때, 파일의 Block iDisk (i mod n) + 1에 저장
  • 서로 다른 Block에 대한 요청이 서로 다른 디스크에 있으면 병렬 처리 가능
  • 긴 연속 Block 요청 시 모든 디스크를 병렬로 활용 가능

10. RAID Levels

Redundancy를 낮은 비용으로 제공하기 위해 Disk striping과 Parity bit를 조합한 다양한 구성 방식이 있다. 각 RAID level은 비용, 성능, 신뢰성이 서로 다르다.

10.1 RAID Level 0 - Block Striping, Non-redundancy

  • Block-level striping만 사용, Redundancy 없음
  • 데이터 손실이 크리티컬하지 않은 고성능 애플리케이션에 사용

10.2 RAID Level 1 - Mirrored Disks with Block Striping

  • Block striping + 디스크 미러링
  • 최고의 Write 성능 제공
  • 데이터베이스 시스템의 Log 파일 저장 등에 사용

10.3 RAID Level 2 - Bit-level Striping with ECC Disks

  • Bit-level striping + 별도의 ECC (Error-Correcting Code) 디스크
  • Data disk와 ECC disk로 구성
  • 현재는 거의 사용되지 않음

10.4 RAID Level 3 - Byte-level Striping with Dedicated Parity Disk

  • Byte-level striping + 전용 Parity disk 1개
  • Data disk 3개 + Parity disk 1개 구성 예시
  • 현재는 거의 사용되지 않음

10.5 RAID Level 4 - Block-interleaved Parity

  • Block-level striping + 별도 디스크에 Parity block 저장
  • N개의 다른 디스크에서 대응하는 Block들의 Parity block을 별도 디스크에 보관

동작:

  • 데이터 Block 쓰기 시 대응하는 Parity block도 재계산하여 기록
  • 손상된 Block 복구: 나머지 Block들(Parity block 포함)의 XOR 연산으로 값 산출

문제점:

  • 모든 Block write가 Parity disk에도 기록되므로 Parity disk가 Bottleneck이 됨

10.6 RAID Level 5 - Block-interleaved Distributed Parity

  • Block-level striping + Parity를 모든 N+1개 디스크에 분산
  • RAID 4의 Parity bottleneck 문제를 해결
  • 예: 5개 디스크에서 n번째 Block 세트의 Parity block은 Disk (n mod 5) + 1에 저장
  • 나머지 데이터 Block은 다른 4개 디스크에 저장

분산 Parity 예시 (5개 디스크):

Disk 0Disk 1Disk 2Disk 3Disk 4
P00123
4P1567
89P21011
121314P315
16171819P4

11. RAID Level 선택 기준

11.1 고려 요소

요소설명
비용 (Monetary cost)추가 디스크 비용
정상 운영 시 성능IOPS (초당 I/O 수), Bandwidth
장애 시 성능디스크 고장 상태에서의 성능 저하
복구 시 성능고장 디스크 Rebuild 중 성능

11.2 실제 사용 현황

RAID Level현황이유
RAID 0데이터 안전이 중요하지 않을 때만 사용다른 소스에서 빠르게 복구 가능한 경우
RAID 2, 3더 이상 사용하지 않음Bit/Byte striping은 단일 Block 읽기 시에도 모든 디스크를 접근해야 함 Disk arm 이동 낭비
RAID 4사용하지 않음RAID 5에 의해 완전히 대체됨
RAID 1고빈도 Update 환경에서 선호Log disk 등
RAID 5낮은 Update 빈도 + 대용량 데이터에 선호

11.3 RAID 1 vs RAID 5 상세 비교

비교 항목RAID 1RAID 5
단일 Block Write2번의 Block write최소 2번의 Block read + 2번의 Block write
Write 성능훨씬 우수상대적으로 느림
저장 비용높음 (100% 오버헤드)낮음 (1/N 오버헤드)
적합한 용도고빈도 Update (Log disk 등)낮은 Update + 대용량 데이터

현실적 고려:

  • 디스크 용량 증가 속도: 매년 약 50%
  • 디스크 접근 시간 감소 속도: 10년에 약 3배 (용량 증가보다 훨씬 느림)
  • I/O 요구량 크게 증가 (예: Web server)
  • 필요한 I/O 성능을 충족하기 위해 구매한 디스크들이 종종 여유 저장 용량을 가짐
  • 따라서 RAID 1의 추가 비용이 실질적으로 0인 경우가 많음

12. 핵심 정리

Disk Scheduling 알고리즘 선택 가이드

단순 구현 필요          -> FCFS
최적 Seek time 필요     -> SSTF (but Starvation 주의)
균일한 대기 시간 필요   -> C-SCAN 또는 C-LOOK
실용적 최적             -> C-LOOK (C-SCAN의 불필요한 이동 제거)

RAID 선택 가이드

데이터 안전 불필요 + 최고 성능  -> RAID 0
고빈도 Write + 높은 신뢰성     -> RAID 1
대용량 + 낮은 Update 빈도      -> RAID 5

중요 공식

Transfer Time = Seek Time + Rotational Delay + Data Transfer Time

Seek Time = a + b * sqrt(d)     (d: distance in # of cylinders)

Disk Bandwidth = Total Bytes Transferred / Total Time

MTTF(시스템) = MTTF(단일 디스크) / N    (N: 디스크 수)