- Authors

- Name
- Youngju Kim
- @fjvbn20031
大容量ストレージ構造
オペレーティングシステムにおいて、大容量ストレージはファイルシステム、仮想メモリ、スワップ空間など様々な目的で使用されます。 この記事では、HDDとSSDの物理構造、ディスクスケジューリングアルゴリズム、RAID構成、 そして現代的なオブジェクトストレージとクラウドストレージを解説します。
1. HDD(Hard Disk Drive)構造
HDDは磁気ディスクを回転させてデータを読み書きする機械式ストレージデバイスです。
物理的構成要素
┌─────────────────────────────────────┐
│ HDD 内部構造 │
│ │
│ ┌───────────────────┐ │
│ │ Platter (円盤) │ ← 磁気 │
│ │ ┌─────────┐ │ コーティング│
│ │ │ Spindle │ │ ← 回転軸 │
│ │ └─────────┘ │ │
│ └───────────────────┘ │
│ │
│ ─────── Actuator Arm ─────── │
│ ▼ │
│ Read/Write Head │
│ │
│ Track: 同心円状のデータ経路 │
│ Sector: Trackの細分化単位 │
│ Cylinder: 同じ位置のTrackの集合 │
└─────────────────────────────────────┘
- プラッタ(Platter): 磁性体でコーティングされた円形ディスク
- スピンドル(Spindle): プラッタを回転させるモーター(5,400~15,000 RPM)
- 読み書きヘッド: プラッタ表面の磁気パターンを読み書きする装置
- アクチュエータアーム(Actuator Arm): ヘッドを目的のトラックに移動
ディスクアクセス時間の構成
総アクセス時間 = シーク時間(Seek Time) + 回転遅延(Rotational Latency) + 転送時間(Transfer Time)
| 構成要素 | 説明 | 一般的な時間 |
|---|---|---|
| シーク時間 | ヘッドを目標トラックに移動 | 3~12 ms |
| 回転遅延 | 目標セクタがヘッド下に来る | 2~6 ms |
| 転送時間 | データの実際の読み書き | 数十 us |
2. ディスクスケジューリングアルゴリズム
ディスクI/O要求がキューに溜まると、処理順序がパフォーマンスに大きく影響します。 主な目標はシーク時間を最小化することです。
FCFS(First-Come, First-Served)
最も単純な方式で、要求が到着した順に処理します。
要求キュー: 98, 183, 37, 122, 14, 124, 65, 67
ヘッド開始位置: 53
移動順序: 53 → 98 → 183 → 37 → 122 → 14 → 124 → 65 → 67
総ヘッド移動: 640 シリンダ
SCAN(エレベータアルゴリズム)
ヘッドが一方向に端まで移動しながら要求を処理し、反対方向に戻ります。
要求キュー: 98, 183, 37, 122, 14, 124, 65, 67
ヘッド開始: 53, 方向: 増加
移動順序: 53 → 65 → 67 → 98 → 122 → 124 → 183 → [199] → 37 → 14
端に達した後反転
C-SCAN(Circular SCAN)
一方向のみサービスし、端に到達すると反対側の端に即座に移動して、再び同じ方向で処理します。 待ち時間の均一性を向上させます。
要求キュー: 98, 183, 37, 122, 14, 124, 65, 67
ヘッド開始: 53, 方向: 増加
移動順序: 53 → 65 → 67 → 98 → 122 → 124 → 183 → [199] → [0] → 14 → 37
端 → 先頭にジャンプ
スケジューリング比較表
| アルゴリズム | 利点 | 欠点 |
|---|---|---|
| FCFS | 実装が簡単、公平 | ヘッド移動が多い |
| SCAN | 効率的、飢餓なし | 両端の要求待ち不均等 |
| C-SCAN | 待ち時間が均一 | 一方向のみサービス |
| LOOK | SCAN改善、不要な移動を排除 | 実装がやや複雑 |
C言語によるSCANシミュレーション
#include <stdio.h>
#include <stdlib.h>
int compare(const void *a, const void *b) {
return (*(int *)a - *(int *)b);
}
void scan(int requests[], int n, int head, int disk_size) {
int total_movement = 0;
int sorted[n + 1];
for (int i = 0; i < n; i++)
sorted[i] = requests[i];
sorted[n] = head;
qsort(sorted, n + 1, sizeof(int), compare);
int head_idx = 0;
for (int i = 0; i <= n; i++) {
if (sorted[i] == head) {
head_idx = i;
break;
}
}
// 오른쪽으로 이동
for (int i = head_idx; i <= n; i++) {
printf("서비스: %d\n", sorted[i]);
total_movement += abs(sorted[i] - head);
head = sorted[i];
}
// 디스크 끝까지 이동
total_movement += abs(disk_size - 1 - head);
head = disk_size - 1;
// 왼쪽으로 이동
for (int i = head_idx - 1; i >= 0; i--) {
printf("서비스: %d\n", sorted[i]);
total_movement += abs(sorted[i] - head);
head = sorted[i];
}
printf("총 헤드 이동: %d\n", total_movement);
}
int main() {
int requests[] = {98, 183, 37, 122, 14, 124, 65, 67};
int n = sizeof(requests) / sizeof(requests[0]);
scan(requests, n, 53, 200);
return 0;
}
3. NVM(Non-Volatile Memory)デバイス - SSD
SSD(Solid State Drive)はNANDフラッシュメモリベースのストレージデバイスで、HDDと異なり機械的部品がありません。
SSD内部構造
┌──────────────────────────────────────┐
│ SSD 構造 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Channel 0│ │ Channel 1│ ... │
│ │ ┌──────┐ │ │ ┌──────┐ │ │
│ │ │Die 0 │ │ │ │Die 0 │ │ │
│ │ │┌────┐│ │ │ │┌────┐│ │ │
│ │ ││Blk ││ │ │ ││Blk ││ │ │
│ │ ││Page││ │ │ ││Page││ │ │
│ │ │└────┘│ │ │ │└────┘│ │ │
│ │ └──────┘ │ │ └──────┘ │ │
│ └──────────┘ └──────────┘ │
│ │
│ FTL (Flash Translation Layer) │
│ - 論理アドレス → 物理アドレスマッピング│
│ - ガベージコレクション管理 │
│ - ウェアレベリング(摩耗均等化) │
└──────────────────────────────────────┘
SSD vs HDD 比較
| 特性 | HDD | SSD |
|---|---|---|
| 読み取り速度 | ~200 MB/s | ~3,500 MB/s (NVMe) |
| 書き込み速度 | ~150 MB/s | ~3,000 MB/s (NVMe) |
| ランダムI/O | 数百 IOPS | 数十万 IOPS |
| レイテンシ | 数 ms | 数十 us |
| 耐久性 | 機械的摩耗 | 書き込み回数制限 (TBW) |
| 価格/GB | 低い | 高い |
NANDフラッシュの特性
- 読み取り: ページ単位(4~16 KB)
- 書き込み: ページ単位(空のページにのみ可能)
- 消去: ブロック単位(数百ページ)
- 書き込み増幅(Write Amplification): 実際のデータよりも多くの物理的書き込みが発生
4. RAID(Redundant Array of Independent Disks)
RAIDは複数のディスクを組み合わせて、パフォーマンス、信頼性、またはその両方を向上させる技術です。
RAIDレベル別構造
RAID 0 (ストライピング)
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│ A1 │ │ A2 │ │ A3 │ │ A4 │
│ A5 │ │ A6 │ │ A7 │ │ A8 │
└─────┘ └─────┘ └─────┘ └─────┘
Disk 0 Disk 1 Disk 2 Disk 3
→ 性能向上、耐障害性なし
RAID 1 (ミラーリング)
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│ A1 │ │ A1 │ │ A2 │ │ A2 │
│ A3 │ │ A3 │ │ A4 │ │ A4 │
└─────┘ └─────┘ └─────┘ └─────┘
Disk 0 Disk 1 Disk 2 Disk 3
→ ミラーコピー、高い耐障害性
RAID 5 (分散パリティ)
┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐
│ A1 │ │ A2 │ │ A3 │ │ Ap │
│ B1 │ │ B2 │ │ Bp │ │ B3 │
│ C1 │ │ Cp │ │ C2 │ │ C3 │
│ Dp │ │ D1 │ │ D2 │ │ D3 │
└─────┘ └─────┘ └─────┘ └─────┘
Disk 0 Disk 1 Disk 2 Disk 3
→ パリティ分散、1台のディスク障害許容
RAID 6 (二重パリティ)
→ RAID 5 + 追加パリティ、2台のディスク障害許容
RAIDレベル比較
| RAID | 最小ディスク | 容量効率 | 耐障害性 | 読み取り性能 | 書き込み性能 |
|---|---|---|---|---|---|
| 0 | 2 | 100% | なし | 非常に高い | 非常に高い |
| 1 | 2 | 50% | 1台障害 | 高い | 普通 |
| 5 | 3 | (N-1)/N | 1台障害 | 高い | 普通 |
| 6 | 4 | (N-2)/N | 2台障害 | 高い | 低い |
| 10 | 4 | 50% | 各ミラー1台 | 非常に高い | 高い |
5. オブジェクトストレージ(Object Storage)
従来のブロックストレージやファイルシステムとは異なり、オブジェクトストレージはデータをオブジェクト単位で管理します。
構造比較
ブロックストレージ: ファイルシステム: オブジェクトストレージ:
┌────┐ /home/ ┌──────────────────┐
│Blk1│ ├── user/ │ Object ID: abc123│
│Blk2│ │ └── file.txt │ Data: [binary] │
│Blk3│ └── etc/ │ Metadata: │
│Blk4│ └── config │ size: 1024 │
└────┘ │ type: image │
固定サイズブロック 階層的ディレクトリ │ created: ... │
└──────────────────┘
フラットネームスペース
オブジェクトストレージの特性
- フラットネームスペース: ディレクトリ階層なしに一意のIDでアクセス
- 豊富なメタデータ: オブジェクトごとにユーザー定義メタデータを保存可能
- HTTP REST API: GET、PUT、DELETEなどのHTTPメソッドでアクセス
- 大規模スケーラビリティ: ペタバイト以上のデータ保存が可能
- 代表的なサービス: Amazon S3、Google Cloud Storage、Azure Blob Storage
6. クラウドストレージ
クラウド環境でのストレージは、用途に応じて複数のタイプに分かれます。
クラウドストレージの種類
┌─────────────────────────────────────────────┐
│ クラウドストレージ分類 │
│ │
│ ┌───────────┐ ┌───────────┐ ┌───────────┐ │
│ │ ブロック │ │ ファイル │ │ オブジェクト│ │
│ │ ストレージ │ │ ストレージ │ │ ストレージ │ │
│ │ │ │ │ │ │ │
│ │ EBS │ │ EFS │ │ S3 │ │
│ │ 高性能 │ │ 共有 │ │ 大規模 │ │
│ │ 低レイテンシ│ │ アクセス │ │ HTTP │ │
│ │ │ │ NFS互換 │ │ アクセス │ │
│ └───────────┘ └───────────┘ └───────────┘ │
│ │
│ ┌───────────────────────────────────────┐ │
│ │ ストレージティア: Hot → Warm → Cold │ │
│ │ アクセス頻度に応じたコスト最適化 │ │
│ └───────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
7. まとめ
大容量ストレージはオペレーティングシステムのコアサブシステムです。
- HDD: 機械式デバイスでシーク時間がパフォーマンスのボトルネック。スケジューリングアルゴリズム(SCAN、C-SCANなど)で最適化
- SSD: NANDフラッシュベースでランダムI/O性能に優れる。FTL、ウェアレベリング、TRIMなどの管理が必要
- RAID: 複数のディスクを組み合わせてパフォーマンスと信頼性を確保。レベルによりトレードオフが異なる
- オブジェクトストレージ: 大規模な非構造化データに最適。REST APIベースのアクセス
- クラウドストレージ: オンデマンドスケーリング、ティアリングによるコスト最適化
クイズ:ディスクスケジューリングとRAID
Q1. SCANアルゴリズムとC-SCANアルゴリズムの違いは何ですか?
A1. SCANはヘッドが一方の端に到達すると方向を反転し、双方向でサービスします。 C-SCANは一方向のみサービスし、端に到達すると反対側の端に即座に移動します。 C-SCANは待ち時間の均一性がより優れています。
Q2. RAID 5でディスクが1台故障した場合、どのようにデータを復旧しますか?
A2. RAID 5は分散パリティを使用します。故障したディスクのデータは、 残りのディスクのデータとパリティ情報をXOR演算して復旧できます。 ただし、復旧中に追加のディスク障害が発生するとデータを失います。
Q3. SSDにおける書き込み増幅(Write Amplification)とは何ですか?
A3. SSDは書き込み前にブロック単位で消去する必要があるため、有効なデータを別のブロックにコピーした後 消去する過程で、実際のユーザーデータよりも多くの物理的書き込みが発生します。 これを書き込み増幅といい、SSDの寿命に直接的に影響します。