Windows7のフォールトトレラントヒープ

Fault Tolerant Heap(FTH)はWindows7に搭載されているメモリ破壊によるプロセスの停止を回避する機能です。http://technet.microsoft.com/ja-jp/windows/dd723549.aspx

調べたところ、以下のDieHardアルゴリズムを使っている模様。
http://www.cs.umass.edu/~emery/pubs/diehard-journal-07.pdf

これによると、Randomized memory managerをコアとしたもので、Dangling pointers、Buffer overflows、Uninitialized readsなどのエラーを確率的に低減させる働きをします。
通常のMemory managerはメモリを連続したアドレスに順番に確保していきます。
たとえば、8バイトのメモリを3回確保した場合、そのアドレス(M1,M2,M3)は

M1 = 0x1000
M2 = 0x1008
M3 = 0x1010

のようになります。
これが、Randomized memory managerを使うと、ランダムな位置にメモリが確保されます。

M1 = 0x1020 
M2 = 0x1108
M3 = 0x1050

こうすると何がいいかというと、通常のmemory managerでは、M1に対して8バイト以上書きこむとM2のメモリが破壊されてしまいますが、Randomized memory managerではM1の後ろが空いているので壊れても影響が出ません。
つまり、十分なメモリ領域があり、均等にランダムな位置にメモリが確保されていれば、メモリ破壊が起こってもエラーを出さずにプログラムを続行できるというものです。論文によると、ヒープ全体の容量に対して使用量が1/2程度のときに、約1/2の確率でエラーを回避できるとあります。*1
ランダムに確保するので、プログラムを起動するたびに、破壊されたり破壊されなかったりするのですが、これを原因の特定に使うこともできます。メモリ破壊が起きた時は破壊された領域より、必ず前の領域に犯人がいいるので、何回か試行すれば捕まえられるという具合です。

Windows7では、原因の特定まで行い、原因を回避する配置まで行っているようです。

*1:ランダムに配置するとフラグメント化しやすいとか、CPUキャッシュのヒット率が悪いとかありそうですがその辺は論文を読んでくださいね(^-^;