人とか機械とか

デジタルガジェットやコンピュータについてのブログです。

Superfetchに対する建設的な考察

スーパーフェッチ
http://www.sophia-it.com/content/SuperFetch

Windows Vistaから搭載された。

アプリやデータ(?)の利用頻度をランキングにして、ランキングの上位から全てのファイルを、メモリがなくなるまで先読みする。というようなアルゴリズムみたい。あと、時間帯も関係してる?とか。先読みをするのはいいんだけど、メモリがなくなるまで、っていうのがダメだと思う。たとえばサイズを100MBとか、なんか指定できればいいんだと思う。建前上は「キャッシュしてても必要になったらちゃんと明け渡すよ!」とはいうものの、事実、物理メモリ全体にSuperfetchのキャッシュがある状態で(タスクマネージャに見える「空き物理メモリ」が10MBくらい)ドライバでMmAllocateContiguousMemorySpecifyCache()で10MBを確保しようとしたら失敗した。MmAllocatePagesForMdl()も失敗した。明け渡してくれないじゃん。

メモリを積んでるだけ全部読むってことは、例えば16GB積んでてOS起動時に1GB消費してたとすると、15GBぶんものデータを読むことになる。先読みするのはアプリだけなのか、それともデータのファイルも含むのか、分からないけど、なんにせよ、そんな数ギガバイトもの情報をHDDから読み取る作業を、そんなに頻繁に行うだろうか?という点が疑問である。
つまりメモリを積めば積むほど、利用頻度ランキング下位のファイルまでも読み込んでしまうことになり、キャッシュヒット率が低下していくということを意味する。キャッシュがヒットしなかったぶん先読みしたものは、HDDを無駄に駆動したことになる。それが嫌。バッテリ駆動のノートPCなら致命的。なので、例えばランキング10位までを先読みする。とか、そういう閾値を設ければいいんじゃないの?と思う。(この辺は電源の管理オプションで、パフォーマンスか節電かで変わるのかな?)

以上のように1,キャッシュするサイズを制限する、2,読み込むランキングの閾値を設定する、の2点が実装されたら使ってみたいと思えるのだが、Windows7ではVistaよりは賢くなったらしいが、相変わらず「メモリ積んでるだけ全部読む」らしいので、残念ながら使う気になれない。

そういったところから読み取れる設計思想は「ブラックボックス」と,詳しい事を知らない「一般ユーザー」を意識しているように思う。

遅いHDDアクセスを、メモリとCPU資源によって工夫して高速化するという、記憶領域のピラミッド構造のネックを克服する挑戦としては評価できるが、もうすこし がんばりましょう。

2010/2/20追記

MmAllocateContiguousMemorySpecifyCacheが失敗する件ですが、なんか、どっかに「連続メモリ領域はOS起動時に確保することを想定している」と書いてあった気がする。まあ、たしかにメモリの中身的に、起動時じゃないとキレイじゃないから物理的に連続した領域を確保するのは難しいよなあ。だから起動してしばらくした状態でやろうとしても無理があるのかも。