ヒープ領域と ntdll.dll について


異なった環境でちゃんと動くかどうかのテストを兼ね Windows 7 での開発と XP での開発を行き来。

いまのところ Windows 7 では動作改善したが、Windows XP では動作が改善されない。

不思議なことにクラッシュする場合データサイズに影響されるのだけど、サイズが大きいと必ずクラッシュするわけではなく。例えば30Kb で落ちないのに 20kb 読み込むと落ちたり現象はマチマチ。原因は ntdll.dll で、つまりメモリ領域の動的確保でなにか悪さしてる。

ヒープとは何か?

参考URL:ヒープ : 喜びと苦悩.

とてもよくまとまった内容で参考になったのが上記 URL。
以下は上記URLからの部分抜粋
ここから抜粋

ヒープは、プログラムが使用するオブジェクトを動的に割り当てたり、解放したりしています。

Windows NT において、Win32 ヒープは Windows NT ランタイム アロケータを取り巻く薄い層です。すべての API は NTDLL へ要求を転送します。

NTランタイムアロケータ=NTDLL.dll

一般的なヒープ機能の問題

  1. 割り当て操作の結果として、スローダウンが起こる
  2. 解放操作の結果として、スローダウンが起こる
  3. ヒープの競合によりスローダウンが起こる
  4. ヒープの破損によりスローダウンが起こる
  5. 頻繁な alloc および realloc によりスローダウンが起こる

ここまで抜粋

上記を見て考えると

ヒープ競合と頻繁な alloc および realloc が怪しい。

しかし頻繁と言っても大きめ確保は心がけていたのでヒープ操作の使用回数を減らすことは最初から念頭にあったはず。もっと大胆にメモリを使って良いのか悩むところ。

実際ヒープ操作回数を減らすようにしたら Win 7 での動作は改善した。しかし XP では効果無かった。汎用だとどうしてもこういう部分で大きめのマージン取っておかないとダメなのだろうか。小さいデータを処理する場合は無駄だし、でかいデータ扱うときは落ちるし、でも落ちるよりマシだからでかく取るしか無さそう。


Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です