ページフォールトを回避するために、事前に.NETプロセスのワーキングセットを1GBに増やしたいと思います。
.NETでこれを行う方法はありますか?
アップデート
残念ながら、SetProcessWorkingSetSizeExを呼び出しても、ガベージコレクションは、MinWorkingSetをバイパスしてワーキングセットをトリミングしているようです(下の図の「自動GC.Collect()」を参照)。
下の図では、プロセスに新しいメモリを割り当てるときに発生するページフォールト(赤い線)の急増を回避するために、プロセスのワーキングセット(緑の線)を1GBにロックする方法はありますか?
これがすばらしい理由は、ページフォールトが発生するたびに、250usのスレッドがブロックされ、アプリケーションのパフォーマンスに大きな影響を与えるためです。
アップデート
引用元:「Windowsvia C / C ++、第5版、Jeffrey Richter(Wintellect)」
プロセスがワーキングセットを空にしようとしているだけでない限り、個々のプロセスによるSetProcessWorkingSetSizeの呼び出しは無視されます。この制限を設定するには、LimitFlagsメンバーでJOB_OBJECT_LIMIT_WORKINGSETフラグを指定します。
この本は、WorkingSetを設定する唯一の方法は、プロセスをジョブオブジェクトに割り当て、JOB_OBJECT_LIMIT_WORKINGSETとMinimumWorkingSetSizeを設定することであることを示唆しています。
アップデート
SetProcessWorkingSetSizeExは、ソフトページフォールトとはまったく関係がありません。現在のワーキングセットのメモリがハードドライブにページアウトされるのを防ぐため、ハードページフォールトのみを参照します。
アップデート
ワーキングセットを増やす唯一の方法は、C ++で記述された非常に特殊なCLRホストを使用して.NETを実行することです(以下の私の回答を参照)。