ファイルシステムのレイアウト • ディスク全体は1つあるいは複数のパーティションに分 けられている。 オペレーティングシステム 第10回 ファイルシステム(2) 2004年12月21日 情報工学科 寺岡文男 – パーティションごとに別のファイルシステムでもよい。 • ディスクのセクタ0はMBR (Mater Boot Record) と呼ば れ、コンピュータの起動(ブート)に使用される。 • MBRの最後にはパーティションテーブルがある。 – 各パーティションの先頭及び終了セクタ番号を登録 – 1つのパーティションが “active” となっている。 • パーティションの先頭ブロックをブートブロックと呼ぶ。 ファイルシステムレイアウトの例 レイアウトの一例 • ブートブロックの次にはスーパーブロック ディスク全体 – 重要なパラメータ:全体のブロック数など MBR パーティション パーティション パーティション • 空きスペース管理の領域 – ビットマップやリストによる管理 • i-ノードテーブル ブートブロック スーパーブロック i-node フリースペース管理 ルートディレクトリ ディレクトリやファイル 起動時の動作 • コンピュータの電源が入ると、 • BIOSがMBRを読込み、実行する。 • MBRプログラムはactiveパーティションを見つ けて、そのブートブロックを読込み、実行する。 • ブートブロックプログラムはOSを読込み、実行 する。 – 1つのファイルについて1つの iノード • ルートディレクトリ • ファイルやディレクトリの内容 ファイルの格納方法 • n バイトのファイルの場合: – n バイトの連続領域に格納 • ファイルが大きくなったら別の場所に移す必要あり – 固定長のブロック(不連続でもOK)に分割して格納 • ほとんどのOSは後者を採用 1 ブロックサイズ ブロックサイズ • ファイルはブロックサイズで区切られてディスク に格納される。 • ブロックサイズが大きいと – ディスクとのデータ転送効率は良くなる – ディスクの利用効率は悪くなる • ブロックサイズが小さいと – ディスクとのデータ転送効率は悪くなる – ディスクの利用効率は良くなる • 例: – 1トラック = 128KB (131,072バイト) – ローテーション時間 = 8.33msec – 平均シーク時間 = 10msec – k バイトの読込みにかかる時間 10 + 4.165 + (k/131072) * 8.33 (msec) • 調査によるUNIXでのファイルサイズの中央値 • UNIXでは通常1KB • MS-DOSでは512B∼32KBの2のべき乗の数 データレートとディスクスペース利用率 – 約 1Kバイト (1984年) – 1680バイト (2000年頃) → ここでは2KBと仮定 ファイルへのブロック割当て方法 • ディスクブロックをファイルにどのように割当て るか。 • 連続割当て – ファイルサイズの分、連続してブロックを割当てる。 – 利点:単純でわかりやすい、高速 – 欠点:ファイル消去により虫食い状態になる ファイルA ファイルC ファイルB 連結リスト割当て – 利点:すべてのブロックが利用可能。 – 欠点:ランダムアクセスが非常に遅い。データサイズが2の べき乗でなくなる。 ファイルB 物理 ブロック ファイルD ファイルF 空きブロック 空きブロック メモリ上の連結リストテーブル • ブロックの先頭を次のブロックへのポインタとして使う。 物理 ブロック ファイルG ファイルD,Fを消去 block size (bytes) ファイルA ファイルE ファイル ブロック 0 ファイル ブロック 1 ファイル ブロック 2 ファイル ブロック 3 0 ファイル ブロック 4 4 7 2 10 12 ファイル ブロック 0 ファイル ブロック 1 ファイル ブロック 2 0 ファイル ブロック 3 6 3 11 14 • ポインタの部分をメモリ上のテーブルに集める。 – FAT (File Allocation Table) とも呼ばれる。 – 利点:ランダムアクセスもある程度高速 – 欠点:テーブルが大きくなる • 容量が20GBでブロックサイズが1KBだと、20Mエントリ。 • 1エントリが4B → 80MBのメモリがFATに使われる。 0 1 2 3 4 5 6 7 10 11 7 3 2 ファイルAは ここから ファイルBは ここから 8 9 10 11 12 13 14 15 12 14 -1 -1 2 ディレクトリ i-ノード • ファイルごとにi-node (index-node)という構造体に関連 付ける – 利点:オープンされているファイルのi-nodeのみがメモリ上に あればよい ファイルの属性 ディスクブロック ブロック0のディスクアドレス ブロック1のディスクアドレス ブロック2のディスクアドレス ブロック3のディスクアドレス ブロック4のディスクアドレス ブロック5のディスクアドレス ブロック6のディスクアドレス ブロック7のディスクアドレス ポインタブロックのアドレス • ディレクトリの役割 – ユーザがファイル名(パス名)を指定してオープン → パス名を解析 → ディレクトリのエントリを見つける → ディスクのブロックを見つける • 2種類のファイル属性の保持方法 ディスクアドレスの テーブルを保持する ディスクブロック – ディレクトリに保持する (MS-DOS/Windows) – i-nodeに保持する (UNIX) フリーブロックの管理法 1Kブロックに256個の 32ビットディスクブロック番号を格納 42 136 210 97 41 ・ ・ ・ 516 230 162 612 342 214 ・ ・ ・ 482 86 234 897 422 140 ・ ・ ・ 482 連結リストによる管理法 1001101101101100 0110110111110111 1010110110110110 ・ ・ ・ 1101111101110111 フリーブロックの管理法 • 1KBブロックで32ビットのディスクブロック番号、 16GBディスクの場合(224ディスクブロック) : – 連結リストによる方法 • 1ブロックに255のフリーブロック番号を格納 (残る1つはポインタ用) • 最大65,794 (= 224/255)ブロックからなるフリーリスト – ビットマップによる方法 • 2,048 (= 224/(1024*8))ブロックからなるビットマップ ビットマップによる管理 余分なディスクI/Oの例 連結リストの操作 • 1つのポインタブロックのみをメモリ上に置く – ディスクブロックの割当てや解放はこのポインタブ ロックに対して行われる – すべて割当て済みになったら(ポインタブロックが空 になったら)新しいポインタブロックをディスクから読 込む – すべてフリーになったら(ポインタブロックがフルに なったら)、ディスクに書き戻す • 2ブロックが空で、3ブロック解放:左から右の状態へ • 次に3ブロック割当て:右から左の状態へ • これのような操作が繰返されるとディスクI/Oが増える メモリ ディスク メモリ ディスク • メモリ上のポインタブロックはなるべく半分程度 フルになるように保つ – そうしないと、余分なディスクI/Oが発生する 3 ビットマップ キャッシュによる高速化 • 連結リストと同様に1つのビットマップブロックの みをメモリに置く • ディスク読み込みの際にはまずキャッシュ (cache) を調べ、あればディスクへはアクセスし ない。なければまずキャッシュに読込む。 • 指定されたブロックがキャッシュにあるかを高 速に調べるためには、ハッシュ関数を用いる。 – フルになったり空になったらディスクにアクセスして 別のブロックを使う • ビットマップの利点 – 1つのビットマップブロックから割当てたディスクブ ロックは近くにまとまって存在 → アクセス時にディスクアームの移動が少ない – デバイス番号やブロック番号を利用 – ハッシュ値は衝突することがあるので、チェインを 作る キャッシュの置換え ブロックキャッシュの構造の例 • キャッシュがフルのときにブロックを追加 – キャッシュブロックの消去が必要 – ブロックが書き換えられていたらディスクに書戻す 末尾 (MRU) 先頭 (LRU) • この操作はページングと同様 – ページングと同様の置換えアルゴリズムが利用可 • FIFO, second chance, LRUなど – 厳密なLRUの実装も可能 • キャッシュの参照はそれほど頻繁ではないため ハッシュ テーブル キャッシュが使われるたびに末尾へ移される → 完全なLRUの実現が可能 → だが、注意が必要 キャッシュの置換えは先頭から (変更されていたらディスクに書き戻す) キャッシュ置換えの注意点 キャッシュ置換えの注意点 • システムがクラッシュした場合のファイルシステ ムの一貫性を考慮すると、LRUは必ずしも望ま しくない。→ LRUを改良 (以下を考慮) • すぐにまた使われそうもないものは先頭に置く • すぐにまた使われそうなものは末尾に置く – ブロックはすぐにまた利用されるか? – ファイルシステムの一貫性保持に重要なブロック か? • ブロックをカテゴリで分類する – i-nodeブロック、間接ブロック、ディレクトリブロック、 データブロック(フル)、データブロック(フルでない)、 など。 – データフルでないデータブロックなど。 • ファイルシステムの一貫性保持に重要なブロッ クは、変更されたら直ちにディスクに書き戻す – データブロック以外のブロック • 別の方法として write-through cache という方法 もある。 – 変更されたブロックは直ちにディクスに書き戻す 4 さらなる高速化手法 ファイルシステムの一貫性チェック • Read ahead – キャッシュのヒット率を上げるため、ディスクブロック を事前にキャッシュに読込む – ファイルがシーケンシャルに読込まれる場合有効 – OSはファイルのアクセスパターンにより、動作を変 更 • ディスクアーム移動の削減 – ファイル書込みの際、なるべく近いブロック同士を 割当てる – i-nodeテーブルの配置を工夫する • ディスクの中ほどに置く • シリンダグループごとに分けるなど • 変更がディスクに格納される前にシステムがク ラッシュすると、ファイルシステムの一貫性が崩 れる – i-nodeブロック、ディレクトリブロック、フリーリストブ ロックなどの場合は影響が大きい • OSごとにファイルシステムの一貫性をチェック するプログラムがある – UNIX: fsck • ブロックの一貫性、ファイルの一貫性をチェック – Windows: scandisk ブロックの一貫性チェック ディレクトリの一貫性チェック 0 2 4 6 1 1 0 1 0 1 1 1 割当て済み 0 2 4 6 1 1 0 1 0 1 1 1 割当て済み • ファイル (i-node) ごとにカウンタを用意する • ルートディレクトリからツリーをたどり、各ディレクトリに 含まれるファイルに関するカウンタをインクリメントす る • ファイルごとに、カウンタの値と i-nodeに記録されてい るリンクカウントを比較する • “リンクカウント > カウンタの値” の場合 0 0 1 0 1 0 0 0 フリー (a) 0 0 0 0 1 0 0 0 フリー (b) • “リンクカウント < カウンタの値” の場合 0 2 4 6 1 1 0 1 0 1 1 1 割当て済み 0 2 4 6 1 1 0 1 0 2 1 1 割当て済み 0 0 1 0 2 0 0 0 フリー (c) 0 0 1 0 1 0 0 0 フリー (d) • ファイルに割当てられているブロックとフリーリスト(or ビットマップ)に含まれるブロックをカウント (a) 正常 (c) ブロック4がフリーリストに (b) ブロック2が “missing block” 2回 → 1にする • フリーリストに加える (d) ブロック5が2つのファイル – “リンクカウント := カウンタの値” とすればよい – 場合によっては深刻 • ディレクトが未使用のi-nodeを指すことがある → このi-nodeが示す ブロックが他のファイルに割当てられることもある UNIX ver.7 の i-node と ディレクトリエントリ ディレクトリ エントリ i-node attribute single indirect block 2バイト 14バイト i-node 番号 ファイル名 double indirect block triple indirect block UNIXでの動作例 • /usr/tera/mbox をアクセス – i-nodeテーブルはディスク上の決まった場所にある – ルートディレクトリを見つけ、 /usr を見つけ、… ルート ディレクトリ 1 . 1 .. 4 bin 7 dev 14 lib 9 etc 6 usr 8 tmp i-node 6 (/usr) attribute 132 ブロック132 (/usr) 6 . 1 .. 19 kunishi 26 tera 51 yatch i-node 26 (/usr/tera) attribute 406 ブロック406 (/usr/tera) 26 . 6 .. 64 .cshrc 92 books 60 mbox /usr/tera/mbox は i-node 60 5
© Copyright 2024 Paperzz