断片化

パソコンのファイルって、連続にデータが記録されているべきなんだけど。
それが、ばらばらになっちゃうのが断片化。


どういうことかっていうと、授業のノートをとるときに、ランダムなページに書かないでしょ。って話。

1回目の授業は1ページ目。
2回目の授業は2ページ目。
3回目の授業は3ページ目。
4回目の授業は4ページ目。
5回目の授業は5ページ目。
6回目の授業は6ページ目。
・・・
って具合に、順番にとるのが普通(だと思うけど、そうですよね)。
なぜかっていうと、1ページ目の続きが隣の2ページ目に来ていた方が見やすいから。
めくればすぐに目的のページが来る。


断片化っていうのは、これがばらばらになること。

1回目の授業は2ページ目。
2回目の授業は5ページ目。
3回目の授業は1ページ目。
4回目の授業は3ページ目。
5回目の授業は6ページ目。
6回目の授業は4ページ目。
・・・
って具合に。
これだと、見返すときにページをめくるのが大変。いやになっちゃう。
この、いやになっちゃうのが断片化。
ページをまたいで進んだり戻ったりするから時間がかかる。


これがパソコン(記憶媒体)の中でも起きている。
CD、DVDやハードディスクは回転方向が一定だから、例えば読み出したいデータ群が、回転方向と同じ方向で、常に隣に来ていればスムーズに読める。
でも、読み出したいデータが、ばらばらだったら大変。
しかも、回転方向と逆方向だったら、1つのデータ(1か0)を読むごとに1回転させなきゃいけない。


モリーは、CDほど遅くなることはないけど、遅くなる。数usとか数msとかかな?読み出すデータの量にもよるけど。
モリーの読み出しは、たいてい

アドレス(読み出したい場所)をメモリに教える → データが来る
って手順を踏む。


データが連続していた場合、先頭のアドレスを教えるだけで、だらだらとデータを持ってきてくれる。

データの先頭アドレス(読み出したい場所)をメモリに教える → データ1が来る → データ2が来る → データ3が来る →・・・
でも、連続していない、断片化のデータの場合は、いちいちアドレスを教えなきゃならない。
データ1のアドレス(読み出したい場所)をメモリに教える → データ1が来る
データ2のアドレスをメモリに教える → データ2が来る
データ3のアドレスをメモリに教える → データ3が来る・・・
連続の場合は1回だけアドレスを送ればよかったけど、下の場合は、いちいちデータのアドレスを教える必要がある。
その分、処理時間が長くなる。


こういうデータの断片化を直して、連続したデータにするのが「デフラグ


昨日の、ブログに貼った画像は断片化の例(MicroSD FAT16)。
データのアドレスが16進数で記録されていて、

→ 0x52E4 → 0x52E5 → 0x52E6 → 0x03B8 → 0xFFFF(0xFFFFは「ここでデータが終了」って意味)
となっている。
(16進数は数列の前に「0x」を記述することが多い。あと、昨日の画像は「B8 03」を「03B8」と後ろから読む「リトルエンディアン」という記録法)
最初は連続だけど、最後に0x52E6から0x03B8に飛んでいる。
10進数で言うと21222番地から急に、952番地に飛んでいる。
埼玉県に配達する荷物がたくさんあって、順番に効率よく配達していたんだけど、最後に沖縄県あての荷物があったって感じ。


なんで、断片化について書いたかっていうと、自分の作ったプログラムが、断片化を配慮していなかったので、問題が発生したんです。
具体的に言うと、音楽を再生してたんだけど、途中で全然違う曲に変わったんです。
デフラグすれば全然問題ないんだけど、プログラム側を修正することにしたので、まとめついでに。


なんでもそうだけど、自分が必要としないと、なかなか気にしないよなーって話。