Mímisbrunnr知恵の泉

← コンピュータ基礎 一覧

🎓 レベル:標準 | 重要度:B(推奨)

📎 前提:ファイルシステムの構造 | 関連:メモリ階層とキャッシュバッファリング・キャッシュ・ジャーナリング

要点(BLUF)

概念 ── ストレージは階層の最下層

メモリ階層とキャッシュ の階層の一番下が、大容量・不揮発・低速なストレージ。ここがページフォルト(ページ置換アルゴリズム)の読み込み先でもあり、その遅さがシステム全体の足を引っ張りがちです。物理特性を知ると、なぜOSがあれこれ工夫するかが腑に落ちます。

仕組み① ── HDDの3要素(なぜランダムが遅いか)

HDDは、高速回転する磁性体の円盤(プラッタ)の上を、読み書きヘッドが半径方向に動いてデータにアクセスします。1回のアクセス時間は3つの和。

flowchart LR
    req["ブロック要求"] --> seek["シーク時間(ヘッドを目的トラックへ移動 / 数ms)"]
    seek --> rot["回転待ち(目的セクタが来るまで回転 / 平均 半回転)"]
    rot --> xfer["転送時間(読み出し / 比較的短い)"]

ここから決定的な事実:連続(シーケンシャル)アクセスは速く、飛び飛び(ランダム)アクセスは遅い。ランダムだと毎回シーク+回転待ちが乗る。だからファイルシステム(ファイルシステムの構造)は関連ブロックを近くに置こうとし、DBは連続I/Oを好みます。「計算量が同じでもアクセスパターンで激変する」点は メモリ階層とキャッシュ と同じ構図です。

仕組み② ── SSDは別の物理、別の制約

SSDはフラッシュメモリで、可動部がありません。シークも回転待ちもないのでランダムアクセスがHDDより桁違いに速い。ただし独特の制約があります。

要するに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)と冗長性(故障耐性)のトレードオフを、用途に応じて組むこと。ただし複数マシンにまたがる冗長化・レプリケーションは 分散システム の領域で、ここは単一マシンの複数ディスクまで。

仕組みの直観 ── なぜこの設計か

⚠️ よくある誤解・落とし穴

対応ラボ

cs-foundations-study/labs/05-02_io_observe.md(Linux: lsblk/cat /sys/block/<dev>/queue/scheduler でスケジューラ確認、hdparm -tdd で連続 vs ランダムの速度差を観察する手順)。

関連

第5章 ファイルシステムとI/O 目次