4

malloc-ed または-edのときではなく、タッチされるまでメモリが Windows タスク マネージャーによって割り当てられたものとして登録されないというこの奇妙な効果に気付きましたnew。この効果は、最適化されたビルドdebugと最適化されたビルドの両方で発生しreleaseます。

以下は構造の例ですが、私のコードでは割り当てと使用率が異なるスレッドで発生するため、確認方法はわかりませんが、オプティマイザーではないと思います。

for (int i = 0 ;i < 1000;i++)
{
buffer[i]=malloc(buffersize);
}
_sleep(1000*60)
for (int i=0;i<1000;i++)
{
memset(buffer[i],0,buffersize);//Only shows up the in the resource manager here
}

私の質問は、メモリを使用したことを Windows がどのように認識しているのかということです。最初の使用のためにメモリを監視していますか、それともコンパイル時の最適化ですか。

私の好奇心は、私が書いているリアルタイムの取得によって動機付けられています.2回メモリに触れる必要があります->割り当て時に1回、実際にデータを入力するときに1回。したがって、ボタンを押す ("aquire!") と、時間の経過とは対照的に、一度に 64 ギガバイトの RAM を書き込む必要があり、かなりの遅延が追加されます。私mallocが行くと、これにより遅延が大きくなりすぎます。

- 編集 -

Windowsページファイルも無効にしました...

4

4 に答える 4

7

これは、Windows などのデマンド ページ仮想メモリ オペレーティング システムの標準的な動作です。malloc() 呼び出しは、仮想メモリ アドレス空間のみを割り当てます。メモリにアクセスするまで、実際に RAM を使い始めることはありません。これにより、ページ フォールトが生成され、オペレーティング システムは、アクセスしたメモリ ページを RAM にマップするよう強制されます。

これは通常、ソフト ページ フォールトであり、フリー リストから RAM ページを取得してマッピングすることにより、非常に迅速に処理されます。ハード ページ フォールトとは対照的に、別のプロセスが RAM を必要としたために、これらの RAM ページの一部がスワップ ファイルに再度スワップ アウトされたときに、後で苦しむことになります。ディスクからのページのリロードには、より多くの時間がかかります。

ページング ファイルを無効にすると、これらのハード ページ フォールトを回避するのに役立ちます。コードページもスワップアウトされる可能性があります。これは、OS がページング ファイルにスワップアウトできなくなったため、強制的に OS にフォールバックさせるとよく発生する可能性があります。このようなページは、スワップアウトされると破棄され、ページフォールトが発生すると実行可能ファイルから再ロードされます。

ソフトなリアルタイム要件がある場合、最適な戦略は、メモリを早期に割り当て、迅速な応答を約束する前に意図的にアクセスすることです。malloc() の代わりに calloc() で簡単に実行できます。

于 2013-11-03T16:59:40.953 に答える
1

OS がメモリを遅延して割り当てているようです。この質問への回答を見る

基本的に、malloc を呼び出すと、OS はプログラムにアドレスを与え、要求された量のメモリを使用できるようにすることを約束します。私が読んだ類推は、OSがメモリの「チェックを書き込む」が、プログラムがそれを使用してチェックを「キャッシュ」しようとしたときにのみ物理メモリを割り当てるということです。

レイテンシーヒットを前面に出したい場合はmalloc、そこにいる必要があると思いますmemset.

于 2013-11-03T16:54:15.690 に答える