Windowsにプロセスを完全にスワップから外すように指示することは可能ですか?


13

Windows virtual-memory-managerに特定のプロセスのスワップを解除するように指示することは可能ですか?

私がよく遭遇する状況は、通常、通常のプログラムすべてにRAMの約50%を使用していることです。特に、組み込みターゲット用のIDEとそれに関連するデバッガーです。

それから、メモリを消費するプロセスを実行したままにします。たとえば、wiresharkまたは週末にデータを蓄積しているものはすべて、必要に応じて交換されます。大きなプロセスが終了すると、ほとんどのプロセスはスワップのままになります。

その後、おそらくIDEとハードウェアデバッガー間の通信のタイミングの問題が原因で、散発的に一時停止してプロセスをスワップバックし、デバッガーに問題を引き起こします。したがって、十分な試行がIDEのデバッグデータをスワップから戻すまで、ターゲットデバイスの制御は散発的になる可能性があります。


これは非常に便利です!ユーザーの観点からは、クリックまたはユーザーのアクションごとにスワップオフプロセスを待つのは面倒です。「このプロセスのスワップを解除してください!」と言う方がはるかに良いでしょう、コーヒーを飲みに行き、レスポンシブシステムに戻ります!
トマス

Windowsのスワッピングプロセスの詳細についてはよく知りませんが、これはあなたが探しているものですか?コメントに実用的なバイナリの例があるはずです。
リック

1
私はかつて同様の質問があり、Stack Overflowで得た答えに基づいてプログラムを書きました。
ケレックSB

@ Kerrek、MinGWでコードをコンパイルしようとすると、「0x161000から1バイトを読み取れませんでした、エラー299(0バイトが読み取られました)」という読み取りごとにエラーが発生しました。私は仕事でWindowsしか持っていないので、アタッチしたランダムバイナリを実行するのに十分な勇気がなかったので、問題はコンパイルにある可能性があります。
グレッグ

1
@KerrekSB、小さな問題のようです。たぶん、あなたはマップされていないメモリ領域に触れていますか?とにかく、あなたの答えは報奨に値すると思います:) PS:HDDの速度と比較して、アンスワップはそれよりもはるかに遅いようです。ボトルネックは他のどこかにあるようですが、どこにありますか?
トマス

回答:


1

KerrekSBは、この目的のための特別なツールを開発しました。

/programming//a/2940209/684229

バイナリを含むGiTHUBで利用できます:https : //github.com/louisdx/unpage

実行中に、「0x .... 000から1バイトを読み取れませんでした、エラー299(0バイトが読み取られました)」というエラーが大量に発生しますが、問題ではなく、ツールは正常に動作します。


「しかし、それは問題です」?私はそれが問題だとは思わない。
Kerrek SB

引用:「すべてのアプリケーションを物理メモリに戻そうとするツール」。ポスターの「メモリ不足プロセス」では、これは機能しない場合があります。
harrymc

@harrymc質問からの引用:After the big process is finished, most processes are left in swap.。そのため、彼はすでに「メモリ不足のプロセス」を終了したと考えられます。
リック

@KerrekSBはもちろん、タイプミスでした。ありがとう:-)
トマス

@Tomas これを見つけまし。私はc ++の非常に限られた知識で、アクセスが失敗するたびにページが実際にPAGE_GUARDビットで保護されていることを確認しました。-lineのif (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }直前に使用しReadProcessMemoryました。PAGE_GUARDは256で、失敗したページで260になりました。したがって、エラーを取り除くことができます。C ++およびページングの知識がある人は、PAGE_GUARDビットを読む必要があります。
リック

1

プロセスラッソを使用して、プロセスにメモリページの優先度を与えることができます。

Windows Vista以降、各メモリページの優先度は0〜7です。スタンバイリストは8つのリストに分割され、それぞれが異なる優先度のページを処理します。メモリマネージャがスタンバイリストからページを取得する場合、優先度の低いリストから最初にページを取得します。」

プロセスラッソは、プロセスに永続的なメモリ優先度を設定できるようにすることで、メモリ優先度の管理に役立ちます。これにより、実行のたびに仮想メモリページが特定の優先度に設定されます。

Process Lassoには、無料版と商用版(試用版で18.95ドル)の2つのバージョンがあります。


私はあなたが全く異なる質問に答えているのではないかと心配しています。プロセスのプロセスにメモリの優先順位を与えることは別のタスクであり、おそらくコンテキストOPでは役に立たないと私はスケッチしました:あなたがすでにスワップにあるプロセスを持ち、それをアンスワップしたいとき あなたはそれがスワップするのを防ぎたくありません。
トマス

@トーマス:それは私の理解ではありません。要求は、特定のプロセスがスワップアウトされるのを防ぐことです。プロセス自体がページをメモリにロックするようにプログラムされていない場合、次に最適な解決策は、スワップアウトされる可能性を低くするために最高のメモリ優先度を与えることです。
harrymc

3
@ harrymc、OPは、メモリホグが実行されると「すべてがスワップアウトされます-必要に応じて」と言うので、OPはそれを望んでいます。月曜日の朝、彼は重要なプロセスのワーキングセットを、ページフォールトによる時間の経過に伴うribや単調な作業ではなく、一度にすべて取り込むようにしたいだけです。
mgkrebbs

@mgkrebbs:それは問題の別の解決策であり、それは不可能だと思います。私の解決策は、IDEが一度もスワップアウトされない場合、再度スワップインする必要はないということです。「メモリを大量に消費するプロセス」はRAMを数メガバイト少なくするだけで、パフォーマンスにあまり影響しません。
harrymc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.