« 2006年10月20日 | メイン | 2006年11月13日 »

2006年11月10日

Low Fragmentation Heap (LFH)

WindwosXP以降に用意されている機能。
任意のヒープに対して断片化への耐性を付加するオプションらしい。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/memory/base/low_fragmentation_heap.asp

このあたりに書いてある。
小さいオブジェクトの生成・破棄を繰り返すような場合に有効らしい。
上記URLによると、16kBまで有効ってところか。

小さいオブジェクトが多数できて遅くなるような場合にはかなり有効ってことなんだろうな。
あれ、そもそも VC++ の new ってのはなにで実装してるんだろうか?
#windows 初心者だからなあ

でも、ヒープだから遅いってのは真?
あ、ヒープがスタックに比べて断片化しやすいってことか?

windowsのheapの実装が、一度確保したら開放しないというやつと関係ある?
heap関連のメモリ操作を行うのが、かならずしも自分自身だけではないから
断片化しやすいとか、待たされるとか、そういうことも関連あるのかなあ?


sample




{
typedef BOOL (WINAPI *Function_HeapSetInformation) (HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T);
Function_HeapSetInformation heapSetInfo;
ULONG heapFlags;
heapSetInfo = (Function_HeapSetInformation)
GetProcAddress(GetModuleHandle("kernel32.dll"), "HeapSetInformation");
heapFlags = 2;
if (heapSetInfo!=NULL) {
heapSetInfo(GetProcessHeap(), HeapCompatibilityInformation, &heapFlags, sizeof(ULONG));
}
}



http://support.microsoft.com/kb/816542/ja
w2kでも使えるらしい。

メモリアロック系について調べてみないと(windows)
heapcreate heapdestroy heapalloc
malloc globalalloc malloc new ... このへんは きっと heapalloc あたりに落ちていくんだろう (ただの予想)
だとすると、HeapCreate したときの new はどこからもってくるんだろう?
プロセスヒープ? 自前で確保したヒープ?

ヒープに関しては
http://www.geocities.jp/i96815/windows/win11.html
この辺が詳しそうだ

メモリ管理に関するサイト。やたら詳しそう(ちゃんとよんでいない)
http://www.memorymanagement.org/