

하드 디스크 드라이브(HDD)는 여러 개의 물리적 부품으로 구성되어 있습니다.
데이터가 저장되는 원형의 금속 또는 유리 디스크입니다. 양면에 자성 물질이 코팅되어 있어 자기적으로 데이터를 기록합니다. 하나의 하드 디스크에는 보통 여러 장의 플래터가 겹쳐서 들어 있습니다. 플래터는 고속으로 회전하며, 일반적인 회전 속도는 5,400 RPM, 7,200 RPM, 10,000 RPM, 15,000 RPM 등이 있습니다.
플래터의 중심을 관통하는 축(shaft)입니다. 모터에 연결되어 있어 플래터를 일정한 속도로 회전시킵니다. 회전 속도가 빠를수록 데이터 접근 속도가 빨라지지만, 발열과 소음이 증가합니다.
플래터 표면 위의 동심원 모양의 경로입니다. 데이터는 트랙을 따라 기록됩니다. 하나의 플래터 표면에는 수만 개의 트랙이 있습니다. 바깥쪽 트랙이 안쪽 트랙보다 둘레가 크므로 더 많은 데이터를 저장할 수 있습니다.
트랙을 일정 크기로 나눈 조각으로, 디스크의 최소 전송 단위입니다. 전통적으로 하나의 섹터는 512바이트이며, 최근의 Advanced Format 디스크에서는 4,096바이트(4KB)를 사용합니다. 운영체제가 데이터를 읽거나 쓸 때 최소한 하나의 섹터 단위로 작업합니다.
여러 플래터에서 같은 반지름 위치에 있는 트랙들의 집합입니다. 예를 들어 플래터가 3장이고 양면을 사용하면 6개의 표면이 있는데, 이 6개 표면에서 같은 위치의 트랙 6개를 묶어 하나의 실린더라고 합니다. 실린더 개념이 중요한 이유는, 디스크 헤드를 이동하지 않고(seek 없이) 같은 실린더 내의 모든 트랙에 접근할 수 있기 때문입니다.
플래터 표면 바로 위를 떠다니면서 자기적으로 데이터를 읽고 쓰는 장치입니다. 각 플래터의 표면마다 하나의 헤드가 있으므로, 플래터가 3장이면 헤드는 최대 6개입니다. 헤드와 플래터 표면 사이의 간격은 약 수 나노미터 수준으로 매우 좁습니다.
헤드를 지탱하고 있는 팔 모양의 구조물입니다. 모든 헤드는 하나의 암 어셈블리에 연결되어 있어 함께 움직입니다. 즉 하나의 헤드가 실린더 100번으로 이동하면, 다른 모든 헤드도 실린더 100번 위치로 이동합니다. 이것이 "실린더" 개념이 의미있는 이유입니다.
디스크가 회전을 멈출 때 헤드가 안전하게 착지하는 영역입니다. 현대 HDD 플래터의 안쪽 가장자리에 위치하며 (과거에는 HDD 플레터의 바깥쪽 가장자리에 위치하기도 했다) , 데이터가 기록되지 않는 영역입니다. 디스크가 켜지면 헤드가 로딩 존에서 떠올라 플래터 위를 이동하고, 꺼지면 다시 로딩 존으로 돌아옵니다.

Disk Access Time = Positioning Time + Transfer Time
= (Seek Time + Rotational Time) + Transfer Time
디스크 암(arm)을 현재 위치에서 원하는 실린더(트랙)로 이동시키는 데 걸리는 시간입니다. 디스크 접근 시간에서 가장 큰 비중을 차지하며, 일반적으로 3~15ms 정도입니다. 디스크 스케줄링 알고리즘의 주된 목적이 바로 이 seek time을 최소화하는 것입니다.
헤드가 원하는 트랙에 도착한 후, 플래터가 회전하여 원하는 섹터가 헤드 아래로 올 때까지 기다리는 시간입니다. 평균적으로 디스크가 반 바퀴 회전하는 시간과 같습니다.
7,200 RPM 디스크의 경우:
원하는 섹터가 헤드 아래를 지나가면서 실제로 데이터가 읽히는 시간입니다. 섹터 크기와 디스크 회전 속도에 따라 결정되며, 보통 매우 짧습니다(수십 마이크로초 수준).
7,200 RPM 디스크에서 seek time 9ms, 1섹터를 읽는 경우:
Total = 9ms (seek) + 4.17ms (rotation) + 0.01ms (transfer) ≈ 13.18ms
이 중 seek time이 약 68%를 차지합니다. 그래서 디스크 스케줄링의 핵심은 seek time을 줄이는 것입니다.
디스크 플래터 표면에는 얇은 보호막이 코팅되어 있습니다. 정상적으로는 헤드가 표면 위를 떠다니지만, 외부 충격이나 결함으로 인해 헤드가 플래터 표면에 직접 접촉하면 자성 표면이 손상됩니다. 이를 head crash라고 하며, 해당 영역의 데이터가 영구적으로 파괴될 수 있습니다. 이것이 HDD를 사용할 때 물리적 충격에 주의해야 하는 이유입니다.

현대의 디스크 드라이브는 물리적인 구조(실린더, 트랙, 섹터)를 추상화하여 1차원 배열(one-dimensional array)로 표현합니다. 운영체제는 논리적인 섹터 번호만 사용하고, 디스크 컨트롤러가 이를 실제 물리적 위치(실린더 번호 → 트랙 번호 → 섹터 번호)로 변환합니다.
논리적 관점: [ 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... | N ]
↕ 디스크 컨트롤러가 매핑
물리적 관점: Cylinder 0, Track 0, Sector 0 → 논리 섹터 0
Cylinder 0, Track 0, Sector 1 → 논리 섹터 1
...
Cylinder 0, Track 1, Sector 0 → 논리 섹터 K
...
Cylinder 1, Track 0, Sector 0 → 논리 섹터 M
슬라이드의 예시를 보면, 실린더 0에 Track 0과 Track 1이 있고, 실린더 1에도 Track 0과 Track 1이 있어서 전체 섹터가 0부터 22까지 순서대로 번호가 매겨져 있습니다.
디스크 컨트롤러는 CPU와 하드 디스크 사이의 통신을 중개하는 회로입니다.
주요 역할:
인터페이스 종류:

트랙당 비트 밀도가 균일한 방식입니다. 바깥쪽 트랙은 둘레가 더 크므로 더 많은 섹터를 담을 수 있습니다. 헤드가 바깥쪽 트랙에서 안쪽 트랙으로 이동하면 트랙당 섹터 수가 줄어듭니다.
데이터 전송 속도를 일정하게 유지하기 위해, 디스크의 회전 속도를 바깥쪽에서는 느리게, 안쪽에서는 빠르게 조절합니다.
사용 예: CD-ROM, DVD-ROM
디스크가 일정한 속도로 회전하는 방식입니다. 데이터 전송 속도를 일정하게 유지하기 위해, 안쪽 트랙에서 바깥쪽 트랙으로 갈수록 비트 밀도가 낮아집니다. 즉 바깥쪽 트랙의 섹터 간 간격이 더 넓습니다.
사용 예: 표준 하드 디스크, 플로피 디스크
| 항목 | CLV | CAV |
|---|---|---|
| 회전 속도 | 변동 (바깥 느리게, 안쪽 빠르게) | 일정 |
| 비트 밀도 | 균일 | 변동 (안쪽 높고, 바깥쪽 낮음) |
| 트랙당 섹터 수 | 바깥쪽이 더 많음 | 모든 트랙 동일 (또는 존 단위 다름) |
| 사용 | CD/DVD | HDD, 플로피 |
디스크 제조사(Seagate, Maxtor 등)가 디스크 용량을 늘리는 두 가지 방법:
1. 트랙당 섹터 수 증가 — 비트 밀도를 높여 같은 트랙에 더 많은 섹터를 넣음
2. 디스크당 실린더 수 증가 — 트랙 간 간격을 좁혀 더 많은 트랙을 넣음

디스크를 많이 사용하는 애플리케이션에서는 디스크가 바쁠 수 있습니다. 디스크가 바쁘면 새로운 I/O 요청은 대기 큐(pending request queue)에 들어갑니다. 이때 요청을 처리하는 순서에 따라 평균 디스크 접근 시간이 크게 달라집니다.
애플리케이션
│ System call (read/write)
▼
File system (파일 시스템)
│ 논리 블록 → 물리 섹터 변환
▼
Buffer cache (버퍼 캐시)
│ 캐시에 없으면 디스크 요청
▼
Disk driver (디스크 드라이버)
│ 요청을 큐에 넣고 스케줄링
▼
Queue: [B0, B3, B2, B4, ...]
│ 스케줄링 알고리즘이 순서 결정
▼
Disk (물리적 디스크)

Seek time을 최소화하는 것이 핵심입니다. Rotational time은 디스크 회전 속도에 의해 결정되므로 소프트웨어로 제어할 수 없지만, seek time은 요청 처리 순서를 바꿈으로써 줄일 수 있습니다.

가장 단순한 방식으로, 요청이 도착한 순서대로 처리합니다.
헤드 이동 순서: 53 → 98 → 183 → 37 → 122 → 14 → 124 → 65 → 67
이동 거리 계산:
|53-98| = 45
|98-183| = 85
|183-37| = 146
|37-122| = 85
|122-14| = 108
|14-124| = 110
|124-65| = 59
|65-67| = 2
─────────────
총 이동 거리 = 640 실린더
122 → 14 → 124 처럼 헤드가 한쪽 끝에서 반대쪽 끝으로 왔다갔다 하는 wild swing(격렬한 진동)이 발생합니다. 122번에서 14번으로 갔다가 바로 124번으로 되돌아오면, 122와 124는 거의 같은 위치인데 불필요하게 왕복한 셈입니다.
| 장점 | 단점 |
|---|---|
| 구현이 매우 단순 | seek time이 매우 비효율적 |
| 공정함 (starvation 없음) | wild swing으로 헤드 이동 거리가 김 |
| 예측 가능 | 요청 수가 많으면 성능 급락 |

현재 헤드 위치에서 가장 가까운 요청을 먼저 처리합니다.
현재: 53
큐: {98, 183, 37, 122, 14, 124, 65, 67}
53에서 가장 가까운 것: 65 (거리 12)
65에서 가장 가까운 것: 67 (거리 2)
67에서 가장 가까운 것: 37 (거리 30)
37에서 가장 가까운 것: 14 (거리 23)
14에서 가장 가까운 것: 98 (거리 84)
98에서 가장 가까운 것: 122 (거리 24)
122에서 가장 가까운 것: 124 (거리 2)
124에서 가장 가까운 것: 183 (거리 59)
이동 순서: 53 → 65 → 67 → 37 → 14 → 98 → 122 → 124 → 183
총 이동 거리 = 12 + 2 + 30 + 23 + 84 + 24 + 2 + 59 = 236 실린더
FCFS의 640에 비해 훨씬 적은 이동 거리(236)입니다.
SSTF의 치명적 문제는 특정 요청이 영원히 처리되지 않을 수 있다는 것입니다.
예시 시나리오:
현재 헤드: 14번 근처
큐에 있는 요청: 14번 근처, 186번
14번 근처 요청 처리 중...
→ 14번 근처에 새 요청 도착 → 이것부터 처리
→ 또 14번 근처에 새 요청 도착 → 이것부터 처리
→ 186번 요청은 계속 대기...
→ 또 14번 근처에 새 요청 도착 → 또 이것부터 처리
→ 186번: 무한 대기 (starvation!)
현재 헤드 근처에 계속 새 요청이 들어오면, 멀리 있는 요청은 영원히 처리되지 않습니다. 이는 SJF(Shortest Job First) CPU 스케줄링에서 긴 프로세스가 기아 상태에 빠지는 것과 같은 원리입니다.
| 장점 | 단점 |
|---|---|
| FCFS보다 훨씬 적은 seek time | Starvation 가능성 |
| 전체 처리량(throughput) 높음 | 최적해를 보장하지 않음 |

디스크 암이 한쪽 끝에서 반대쪽 끝까지 이동하면서 경로 위의 요청을 처리하고, 끝에 도달하면 방향을 반전합니다. 엘리베이터가 위아래로 이동하면서 각 층의 승객을 태우는 것과 비슷하여 "엘리베이터 알고리즘"이라고도 부릅니다.
헤드 시작: 53, 왼쪽(감소 방향)으로 이동 중
왼쪽으로 이동하면서 처리:
53 → 37 → 14 → 0 (디스크 끝)
방향 반전 (오른쪽/증가 방향):
0 → 65 → 67 → 98 → 122 → 124 → 183
이동 순서: 53 → 37 → 14 → 0 → 65 → 67 → 98 → 122 → 124 → 183
이동 거리:
|53-37| = 16
|37-14| = 23
|14-0| = 14
|0-65| = 65
|65-67| = 2
|67-98| = 31
|98-122| = 24
|122-124| = 2
|124-183| = 59
총 = 236 실린더
| 장점 | 단점 |
|---|---|
| Starvation 없음 | 끝에 도달할 때까지 불필요한 이동 |
| 균일한 대기 시간 | 방향 전환 직후의 요청이 가장 오래 기다림 |
| 예측 가능한 성능 |

SCAN의 변형으로, 헤드가 한쪽 끝에 도달하면 서비스하지 않고 즉시 반대쪽 끝으로 점프합니다. 서비스는 항상 한 방향으로만 합니다. (자이드롭 ??)
헤드 시작: 53, 오른쪽(증가 방향)으로 이동
오른쪽으로 이동하면서 처리:
53 → 65 → 67 → 98 → 122 → 124 → 183 → 199 (디스크 끝)
서비스 없이 즉시 0번으로 점프:
199 → 0
다시 오른쪽으로 이동하면서 처리:
0 → 14 → 37
이동 순서: 53 → 65 → 67 → 98 → 122 → 124 → 183 → 199 → 0 → 14 → 37
SCAN에서는 헤드가 반전하여 되돌아올 때도 요청을 처리하므로, 방향 전환 직전/직후의 요청 간에 대기 시간의 불공정이 발생합니다. 예를 들어 헤드가 0에서 199로 갔다가 돌아오는 중이면, 0번 근처의 요청은 방금 처리되었지만 199번 근처의 요청은 다시 한참 기다려야 합니다.
C-SCAN은 서비스를 한 방향으로만 하므로, 모든 요청의 대기 시간이 더 균일합니다. 디스크를 원형(circular)으로 취급하여 199 다음이 0인 것처럼 동작합니다.
| 장점 | 단점 |
|---|---|
| 대기 시간이 더 균일 (SCAN보다 공정) | 되돌아가는 동안 시간 소비 (서비스 안 하므로) |
| Starvation 없음 | 총 이동 거리가 SCAN보다 길 수 있음 |

SCAN과 C-SCAN의 실용적 구현입니다. SCAN/C-SCAN은 디스크의 물리적 끝(0 또는 199)까지 이동하지만, LOOK/C-LOOK은 해당 방향의 마지막 요청까지만 이동하고 즉시 방향을 전환합니다.
"LOOK"이라는 이름은 헤드가 이동하기 전에 그 방향에 요청이 있는지 "미리 본다(look ahead)"는 의미입니다.
헤드 시작: 53, 오른쪽으로 이동
오른쪽으로 이동하면서 처리:
53 → 65 → 67 → 98 → 122 → 124 → 183
(199까지 가지 않음! 183이 오른쪽 마지막 요청이므로 여기서 점프)
서비스 없이 왼쪽 끝 요청으로 점프:
183 → 14
(0까지 가지 않음! 14가 왼쪽 첫 요청이므로 여기로 점프)
다시 오른쪽으로 이동하면서 처리:
14 → 37
이동 순서: 53 → 65 → 67 → 98 → 122 → 124 → 183 → 14 → 37
SCAN: 53 → 37 → 14 → [0] → 65 → 67 → ...
↑ 디스크 끝까지 감 (불필요한 이동)
LOOK: 53 → 37 → 14 → [방향 전환] → 65 → 67 → ...
↑ 마지막 요청(14)에서 바로 전환
LOOK에서 14 → 65는 헤드가 실제로 물리적으로 이동하면서 서비스하는 것이므로 |14 - 65| = 51이 seek distance에 포함됩니다.
C-LOOK에서도 14 → 65 구간의 이동 거리는 포함되지만, 차이는 서비스 방향입니다.
Look
53 → 37 → 14 → (반전) → 65 → 67 → 98 → 122 → 124 → 183
←←←←←←←← →→→→→→→→→→→→→→→→→→→→→→→
왼쪽으로 서비스 오른쪽으로 서비스
C-Look
53 → 65 → 67 → 98 → 122 → 124 → 183 → (점프) → 14 → 37
→→→→→→→→→→→→→→→→→→→→ ←점프→ →→→→→
오른쪽으로 서비스 오른쪽으로 서비스
| 알고리즘 | 어디까지 가는가 |
|---|---|
| SCAN | 디스크 끝(0 또는 199)까지 |
| LOOK | 해당 방향의 마지막 요청까지만 |
| C-SCAN | 디스크 끝까지 간 후 반대쪽 끝으로 점프 |
| C-LOOK | 마지막 요청까지만 간 후 반대쪽 첫 요청으로 점프 |
| 알고리즘 | 이동 순서 | 총 이동 거리 |
|---|---|---|
| FCFS | 53→98→183→37→122→14→124→65→67 | 640 |
| SSTF | 53→65→67→37→14→98→122→124→183 | 236 |
| SCAN | 53→37→14→0→65→67→98→122→124→183 | 236 |
| C-SCAN | 53→65→67→98→122→124→183→199→0→14→37 | 약 382 |
| LOOK | 53→37→14→65→67→98→122→124→183 | 208 |
| C-LOOK | 53→65→67→98→122→124→183→14→37 | 약 322 |
| 알고리즘 | Starvation | 이동 효율 | 대기 균일성 | 구현 복잡도 | 실용성 |
|---|---|---|---|---|---|
| FCFS | 없음 | 나쁨 | 보통 | 매우 간단 | 낮음 |
| SSTF | 있음 | 좋음 | 나쁨 | 보통 | 보통 |
| SCAN | 없음 | 좋음 | 보통 | 보통 | 좋음 |
| C-SCAN | 없음 | 보통 | 좋음 | 보통 | 좋음 |
| LOOK | 없음 | 매우 좋음 | 보통 | 보통 | 매우 좋음 |
| C-LOOK | 없음 | 좋음 | 좋음 | 보통 | 매우 좋음 |
가장 많이 사용되는 것은 LOOK 또는 C-LOOK입니다. SCAN/C-SCAN의 개념을 기반으로 하면서 불필요한 끝까지의 이동을 제거한 실용적 버전입니다.

디스크를 디스크 컨트롤러가 읽고 쓸 수 있는 섹터 단위로 나누는 과정입니다. 공장에서 출하될 때 수행됩니다.
각 섹터의 구조:
┌──────────┬──────────────────┬──────────┐
│ Header │ Data (512B) │ Trailer │
└──────────┴──────────────────┴──────────┘
ECC 덕분에 일부 비트가 손상되어도 데이터를 복구할 수 있습니다. 디스크 컨트롤러가 데이터를 읽을 때마다 ECC를 계산하여 저장된 ECC와 비교합니다.
디스크를 여러 그룹의 실린더로 분할하는 과정입니다. 각 파티션은 독립적인 논리 디스크로 취급됩니다. 예를 들어 1TB 디스크를 C: 드라이브(500GB)와 D: 드라이브(500GB)로 나누는 것입니다.
운영체제가 파티션 위에 파일 시스템의 초기 데이터 구조를 기록하는 과정입니다.
기록되는 것들:
일반적으로 "전체 포맷(full format)"이라 하면 저수준 포매팅과 논리적 포매팅을 모두 수행하는 것을 의미합니다. "빠른 포맷(quick format)"은 논리적 포매팅만 수행하여 파일 시스템 메타데이터만 초기화하고, 실제 데이터 영역은 그대로 둡니다.

I/O 요청 (특정 섹터 읽기)
│
▼
디스크 캐시에 해당 섹터가 있는가? ──── Yes ──→ 캐시에서 바로 반환 (매우 빠름)
│ (Cache Hit)
No (Cache Miss)
│
▼
디스크에서 해당 섹터를 읽어서 캐시에 저장
│
▼
캐시에서 상위 계층으로 반환
I/O 요청 (특정 섹터 쓰기)
│
▼
디스크 캐시에 해당 섹터가 있는가? ──── Yes ──→ 캐시의 데이터를 업데이트
│ (나중에 디스크에 반영)
No
│
▼
디스크에서 해당 섹터를 캐시로 읽어온 후 업데이트
(또는 직접 디스크에 기록)
프로그램은 지역성(locality)을 가집니다:
그래서 한 번 읽은 섹터를 캐시에 보관하면, 다음 접근 시 디스크까지 가지 않고 메모리에서 바로 가져올 수 있습니다.

스왑 공간(Swap Space)은 디스크의 일부를 가상 메모리의 확장으로 사용하는 영역입니다. 물리 메모리(RAM)가 부족할 때, 당장 사용하지 않는 페이지를 디스크의 스왑 공간으로 내보내고(swap out), 필요할 때 다시 불러옵니다(swap in).
스왑 공간에 저장될 수 있는 것:
권장 크기:

스왑 공간은 세 가지 방식으로 구현할 수 있습니다.
파일 시스템 안에 큰 파일 하나를 만들어 스왑 공간으로 사용합니다. Windows에서는 C:\pagefile.sys가 이에 해당합니다.
파일 시스템
└── pagefile.sys (스왑 파일)
장점: 구현이 쉬움. 기존 파일 시스템 루틴을 그대로 사용
단점: 비효율적. 스왑 시마다 디렉터리 구조와 디스크 할당 데이터 구조(inode 등)를 조회해야 하므로 오버헤드가 큼
파일 시스템이 없는 별도의 raw 파티션을 스왑 공간으로 사용합니다.
디스크
├── Partition 1: ext4 파일 시스템 (일반 데이터)
└── Partition 2: raw partition (스왑 전용, 파일 시스템 없음)
장점: 파일 시스템 오버헤드 없이 직접 디스크 블록에 접근하므로 빠름
단점: 파티션 크기를 설치 시 미리 결정해야 하며, 나중에 변경이 어려움
스왑 공간 관리자(Swap space manager)가 스왑 맵(swap map)을 유지하여 어떤 블록이 사용 중인지 추적합니다.
Linux는 raw 파티션과 파일 시스템 기반 스왑을 모두 지원합니다.
# 스왑 파티션 사용
sudo swapon /dev/sda2
# 스왑 파일 사용
sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
이 유연성 덕분에 설치 후에도 스왑 파일을 추가하거나 크기를 변경할 수 있습니다.
슬라이드의 다이어그램에 따르면 두 가지 경로가 있습니다:
경로 1: 파일 시스템을 통한 접근 (Normal file system 방식)
Virtual memory system
→ (1) /etc/swap.data 파일 경로 조회
→ Naming layer → VFS → Local file system (Ext2)
→ 디스크의 swap.data 파일에 접근
경로 2: raw disk를 통한 직접 접근 (Separate partition 방식)
Virtual memory system
→ (2) Swap space manager가 raw disk의 swap space에 직접 접근
→ Swap map으로 블록 위치 관리
→ 디스크의 스왑 파티션에 직접 접근
경로 2가 파일 시스템 계층을 거치지 않으므로 더 빠릅니다.

| 항목 | Normal File System | Separate Partition | Flexible (Linux) |
|---|---|---|---|
| 대표 OS | Windows | Unix | Linux |
| 파일 시스템 필요 | 예 | 아니오 | 둘 다 가능 |
| 성능 | 느림 (파일 시스템 오버헤드) | 빠름 (직접 접근) | 선택에 따라 다름 |
| 구현 난이도 | 쉬움 | 보통 | 보통 |
| 유연성 | 높음 (파일 크기 변경 가능) | 낮음 (파티션 크기 고정) | 매우 높음 |
디스크의 물리적 구조: 플래터, 트랙, 섹터, 실린더로 구성. 섹터가 최소 전송 단위
디스크 접근 시간 = Seek time + Rotational time + Transfer time이며, Seek time이 가장 큰 비중을 차지
디스크 스케줄링의 목적: Seek time을 최소화하는 것
디스크 포매팅: 저수준 포매팅(섹터 구조) → 파티셔닝 → 논리적 포매팅(파일 시스템)
디스크 캐시: 지역성을 이용하여 자주 접근하는 섹터를 메모리에 캐싱
스왑 공간: 물리 메모리 부족 시 디스크를 가상 메모리 확장으로 사용. 파일 시스템 방식(Windows)과 raw 파티션 방식(Unix), 둘 다 지원하는 유연한 방식(Linux)이 있음