0

通常の優先度でユーザーモードプログラムを実行しています。私のプログラムはNPの問題を検索しており、その結果、大量のメモリを消費し、最終的にはスワップファイルになります。

次に、マウスがフリーズし、タスクマネージャーが開いてプロセスを終了できるようになるまでに永遠に時間がかかります。

私が知りたいのは、2つのコアのうち1つしか使用されていないのに、Windowsオペレーティングシステムがこれから完全にロックアップするのを防ぐ方法です。

編集:返信ありがとうございます。

使用するメモリを少なくすることが役立つことは知っていますが、OS全体がロックアップする必要があることは私には意味がありません。

4

4 に答える 4

2

明らかな答えは、「メモリの使用量を減らす」です。アプリが使用可能なすべてのメモリを使い果たすと、OS はタスク マネージャー (など) をページアウトして、アプリ用のスペースを確保する必要があります。プログラムを切り替えると、OS は (必要に応じて) 他のプログラムをページインする必要があります。ディスクの読み取りはメモリの読み取りよりも遅いため、すべてが遅くなるように見えます。

これを回避したい場合は、アプリで独自のメモリを管理するか、ブルート フォースよりも優れたアルゴリズムを使用してください。(遺伝的アルゴリズム、シミュレーテッド・アニーリングなどがあります)

于 2009-02-27T07:36:13.973 に答える
1

「メモリ使用量を減らすためにアプリを再構築する」以外に、この質問に対するプログラミングの答えはないと思います。スワップファイルの問題は、特に IDE HDD または高度に断片化されたスワップファイルを使用している場合、ディスクへのアクセスのボトルネックが原因である可能性が最も高くなります。

于 2009-02-27T07:37:51.147 に答える
1

問題は、別のプログラム (explorer.exe など) が実行されるときに、そのコードとメモリがすべてスワップ アウトされていることです。他のプログラム用のスペースを確保するために、Windows は最初にプログラムが使用しているデータをディスクに書き込み、次に他のプログラムのメモリをロードする必要があります。他のプログラムで実行されるコードの新しいページごとにディスク アクセスが必要になるため、プログラムの実行が遅くなります。

私はあなたのプログラムのアクセス パターンを知りませんが、Windows がプログラムからメモリ ページを追い出すとすぐに突然再びそれが必要になり、Windows は同じ処理を行うために別のページを見つける必要があります。

他のプロセスにより多くの RAM を割り当てるには、 SetProcessWorkingSetSizeを使用して、プログラムが使用できる RAM の最大量を減らすことができます。もちろん、これにより、より多くのスワッピングを行う必要があるため、プログラムの実行が遅くなります。

別の方法として、システムにドライブを追加し、スワップ ファイルをそれらに分散することもできます。デュアルコア CPU を使用している場合でも、ドライブは 1 つしかありません。スワップ ファイルを複数のドライブに分散することで、Windows は複数のドライブ間で作業のバランスをとることができます (ただし、これがどの程度うまく機能するかを直接経験したことはありません)。

于 2009-02-27T07:39:17.727 に答える
1

これは少し極端ですが、常にスワップ ファイルを最小化できるため、すべてのディスク ハッシュが発生することはなく、プログラムは多くの仮想メモリを割り当てることができません。コントロール パネル / 詳細設定 / 詳細設定タブ / パフォーマンス / 仮想メモリの下で、ページ ファイルをカスタム サイズに設定し、2 MB の値を入力します (XP で許可される最小値)。割り当てが失敗すると、例外が発生し、正常に終了できるはずです。問題を完全に解決するわけではなく、速度を上げるだけです;)

考慮に値するもう 1 つの点は、32 ビット プラットフォームを使用している場合、64 ビット システムに移植して、より多くのアドレス可能な RAM を搭載したボックスを入手することです。

于 2009-02-27T08:26:39.453 に答える