● デッドギャップ
片原 「延々と引っ張ってきましたが、レジストリの先天的な肥大化原因はここにあります。」
片原 「『デッドギャップ』を説明するため、レジストリファイルを取り込んだとき、レジストリの中で何が起きるのかを追いかけてみましょう。仮に次のようなレジストリファイルがあるとします。
REGEDIT4
[HKEY_CURRENT_USER\1234]
[HKEY_CURRENT_USER\ABCD]
[HKEY_CURRENT_USER\ZYXW]
レジストリエディタで取り込むと、2行目から順次レジストリデータベースに取り込まれ、図1のようになります。
ここで、レジストリキー「HKEY_CURRENT_USER\1234」に文字列データ「SAMPLE1」を加えてみます。レジストリファイルは次のようになります。
REGEDIT4
[HKEY_CURRENT_USER\1234]
"STR1"="SAMPLE1"
レジストリキー「HKEY_CURRENT_USER\1234」に文字列データを加えるため、このキーのデータ情報が増加し、今このキーの情報を格納しているサイズには収まり切らなくなってしまいます。そこで一旦「HKEY_CURRENT_USER\1234」は削除され、文字列データ「SAMPLE1」を含む新しい「HKEY_CURRENT_USER\1234」が登録されます。削除された旧い「HKEY_CURRENT_USER\1234」は、未使用領域になります(図2)。
さらにレジストリキー「HKEY_CURRENT_USER\1234」に文字列データ「SAMPLE2」を追加してみます。上と同じように、キーは一旦消されてまた作られます。
さらに文字列データ「SAMPLE3」を加えると、図3の未使用領域1を消費し、旧いキーの格納領域が未使用領域(4と名付ける)になることのですが、隣り合っているにも関わらず、未使用領域4と未使用領域3は合併されません。分断されてしまうのです。
後になって、未使用領域3と4を足した領域よりやや小さいサイズのレジストリキーとデータを格納しようとしたとき、この「見えない境界」のために両者は利用されず、レジストリデータベース下方の大きな未使用領域が使われることになります。
この仕組みは、レジストリデータへのアクセスを高速にする反面、レジストリデータベースの未使用領域を食い散らかして断片化してしまいます。断片化が進むと、再利用しにくい空きレコードが増えるだけでなく、未使用領域の検索に時間が掛かり、Windows のレスポンス低下につながると思われます。」
三井 「どういう時に、『空きレコードの断片化』が起きるんですか?」
片原 「1つはアプリケーションの導入時です。ひたすら新しい情報をレジストリに取り込むわけですから。」
片原 「もう1つはアプリケーションを使っているときです。アプリケーションの中には、最後に編集したファイルの名前を記録として持っているものがありますよね。例えば「C:\USER\TEST1.XXX」を編集した後、「Q:\DIR1\DIR2\SAMPLE2.XXX」を編集したとすると、格納すべきレジストリデータ(最後に使ったファイル名)は、1つ前のファイル名より長くなったことでサイズが増え、レジストリキーの登録し直しが起きることになります。」
三井 「適当なサイズの空きレコードが無い場合はどうなるのかしら?」
片原 「新しい RGDB ブロックが追加されると思われます。」
片原 「ではさらに、レジストリ取り込みを進めてみましょう。
図4のレジストリに、新しいレジストリキーを登録してみます。
REGEDIT4
[HKEY_CURRENT_USER\99]
レジストリキー「HKEY_CURRENT_USER\1234」よりもキーの名称が短いです。これをレジストリに取り込むと図5のようになります。
レジストリキー「HKEY_CURRENT_USER\99」のサイズは、未使用領域2のサイズより小さいので、少し余ります。しかし、この数バイト程度の余りは空きレコードのチェーンには加わりません。なぜならチェーンするための情報すら格納できないほど小さいからです。
この小さい余りのエリアは「HKEY_CURRENT_USER\99」が削除されても、再び未使用領域として合わさることもなく、以後永久に使われることはありません。我々はレジストリ内のこのような領域を「デッド・ギャップ」と呼んでいます。」
三井 「極端な話、Win9x に何にもアプリケーションをインストールしていなくても、ただ使い続けるだけで徐々にレジストリは太っていくわけですね?」
片原 「そういうことです。導入しているアプリケーションが多ければ、言わずもがなですね。」
三井 「だってよ、真二くん!」
麻績村「うーん、自分のパソコンの不調も、なるべくしてなったということなのかな。」
三井 「えらい! ゲームやりながらでも、話をちゃんと聞いてたのね!」