🎓 レベル:標準 | 重要度:B(推奨)
📎 前提:ファイルシステムの構造 | 関連:メモリ階層とキャッシュ・バッファリング・キャッシュ・ジャーナリング
要点(BLUF)
- HDDは回転する円盤と動くヘッドの機械装置。アクセス時間はシーク(ヘッド移動)+回転待ち+転送で決まり、ランダムアクセスが致命的に遅い(ミリ秒オーダ)。
- SSDは電子的(フラッシュメモリ)でシークがなく高速だが、「書き込み前に消去が要る」「書き換え回数に上限」という別の制約を持つ。
- 遅いHDDのためにI/Oスケジューリング(要求を並べ替えてヘッド移動を減らす)があり、RAIDで複数台を束ねて速度・容量・冗長性を稼ぐ。
概念 ── ストレージは階層の最下層
メモリ階層とキャッシュ の階層の一番下が、大容量・不揮発・低速なストレージ。ここがページフォルト(ページ置換アルゴリズム)の読み込み先でもあり、その遅さがシステム全体の足を引っ張りがちです。物理特性を知ると、なぜOSがあれこれ工夫するかが腑に落ちます。
仕組み① ── HDDの3要素(なぜランダムが遅いか)
HDDは、高速回転する磁性体の円盤(プラッタ)の上を、読み書きヘッドが半径方向に動いてデータにアクセスします。1回のアクセス時間は3つの和。
flowchart LR
req["ブロック要求"] --> seek["シーク時間(ヘッドを目的トラックへ移動 / 数ms)"]
seek --> rot["回転待ち(目的セクタが来るまで回転 / 平均 半回転)"]
rot --> xfer["転送時間(読み出し / 比較的短い)"]
- シーク時間:ヘッドの物理移動。最も重い。
- 回転待ち(回転遅延):目的のセクタがヘッド下に来るまで。7200rpmなら1回転≈8.3ms、平均その半分。
- 転送時間:実際の読み出し。連続なら速い。
ここから決定的な事実:連続(シーケンシャル)アクセスは速く、飛び飛び(ランダム)アクセスは遅い。ランダムだと毎回シーク+回転待ちが乗る。だからファイルシステム(ファイルシステムの構造)は関連ブロックを近くに置こうとし、DBは連続I/Oを好みます。「計算量が同じでもアクセスパターンで激変する」点は メモリ階層とキャッシュ と同じ構図です。
仕組み② ── SSDは別の物理、別の制約
SSDはフラッシュメモリで、可動部がありません。シークも回転待ちもないのでランダムアクセスがHDDより桁違いに速い。ただし独特の制約があります。
- 読みは速いが、書き込みは「消去してから」:フラッシュはページ単位で書け、消去はより大きなブロック単位。上書きが直接できず、空ページに書いて古いのを無効化する。
- 書き換え回数に上限:各セルは数千〜数万回で劣化。ウェアレベリング(書き込みを全体に均す)で寿命を延ばす。
- ガベージコレクション/TRIM:無効ページを回収する裏処理。これが書き込み遅延のばらつきを生む。
要するにSSDは「読みは一様に速い/書きは仕組み上の手間がある」。HDDの「シーク回避」とは別の最適化(書き込みの偏り回避)が要ります。
仕組み③ ── I/Oスケジューリングとキューイング
HDDでは、ヘッド移動を減らすためにI/O要求を並べ替えると効きます。エレベータ(SCAN)アルゴリズムが古典:エレベータのようにヘッドを一方向に動かしながら、その途中にある要求を順に処理し、端で折り返す。バラバラに来た要求を、シーク総距離が短くなる順に並べ替えます。
flowchart LR
qin["要求がランダムな順で到着"] --> sched["I/Oスケジューラ(シーク最小になるよう並べ替え)"]
sched --> disk["ディスク(ヘッド移動を削減)"]
SSDではシークがないため並べ替えの利得は小さく、Linuxでは none(並べ替えなし)が選ばれることも多い。物理特性に応じてスケジューラを変えるわけです。
仕組み④ ── RAID(複数台で速度・冗長性)
1台の限界(容量・速度・故障)を、複数のディスクを束ねて超えるのがRAID。代表的な考え方:
| レベル | 仕組み | 狙い |
|---|---|---|
| RAID 0(ストライピング) | データを複数台に分散 | 速度・容量(冗長性なし=1台故障で全滅) |
| RAID 1(ミラーリング) | 同じデータを2台に複製 | 冗長性(1台壊れても無事) |
| RAID 5 | データ+パリティを分散 | 容量効率と冗長性の両立(1台故障に耐える) |
要点は速度(並列I/O)と冗長性(故障耐性)のトレードオフを、用途に応じて組むこと。ただし複数マシンにまたがる冗長化・レプリケーションは 分散システム の領域で、ここは単一マシンの複数ディスクまで。
仕組みの直観 ── なぜこの設計か
- 連続アクセスを優遇する理由:HDDの支配項はシーク+回転で、これは物理的に減らせない。唯一の手はアクセスを連続化して回数自体を減らすこと。
- SSDがウェアレベリングする理由:同じセルに書き続けると局所的に寿命が尽きる。書き込みを均せば全体寿命が延びる(負荷分散)。
- RAIDが冗長性を持つ理由:ディスクは必ず壊れる前提。1台の故障を別の台(複製/パリティ)で吸収すれば、可用性を上げられる。バックアップとは別物(RAIDは可用性、バックアップは復旧)。
⚠️ よくある誤解・落とし穴
- 「SSDだからランダムも気にしなくていい」→ 読みは速いが、ランダム小書き込みはGC負荷で遅延がばらつく。連続書き込みは依然有利。
- 「RAIDはバックアップ」→ 違う。RAIDは可用性(稼働継続)。誤削除やランサムウェアはRAIDでは守れない。バックアップは別途必須。
- 「I/Oスケジューラはどれも同じ」→ HDDとSSDで最適が異なる。SSDで重い並べ替えはむしろ無駄。
- 「ディスクは速い」→ メモリ比で桁違いに遅い。だから上位層でキャッシュする(バッファリング・キャッシュ・ジャーナリング)。
対応ラボ
cs-foundations-study/labs/05-02_io_observe.md(Linux: lsblk/cat /sys/block/<dev>/queue/scheduler でスケジューラ確認、hdparm -t や dd で連続 vs ランダムの速度差を観察する手順)。
関連
- 階層全体の発想は メモリ階層とキャッシュ
- 遅いディスクを速く見せる工夫は バッファリング・キャッシュ・ジャーナリング
- ファイルの実体の置き方は ファイルシステムの構造