ファイルシステム

ファイルシステムのレイアウト
• ディスク全体は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