3

これは厳密にはプログラミング関連ではなく、OS 構造に関連している可能性があります。

3 GB のメモリを搭載した新品のラップトップで Vista 32 ビットを実行すると、アイドル状態でシステムを実行すると、メモリの約 40% が消費されます。これはそれ自体が法外なことであるという事実を除けば、OSはすべてのプロセスをメモリにうまく収めることができ、ディスクにスワップする必要はありません。
しかし、タスク マネージャーを見ると、常にページ フォールトが発生しているプロセスが表示されます。多くはありませんが、まだです。たとえば、explorer.exe は約 1 秒ごとに 1 つです。

何故ですか?十分な物理メモリがあるにもかかわらず、OS がページをスワップアウトする必要があると感じるのはなぜですか?

4

6 に答える 6

3

ページ フォールトは、必ずしも何かがディスクにページングされたことを意味するわけではありません。最新の OS には、ページが存在する可能性のある多くのレベルの状態があります。たとえば、Windows はおそらく、アクティブに使用されているメモリのページと、しばらく触れられておらず、ページングされる可能性のあるメモリのページを区別します。必要に応じてディスクに。(これにより、ページャーの仕事が簡単になります。なぜなら、どのページをページングできるかを見つけるために 2 番目の種類のページを見るだけでよいからです。) では、ページはどのようにして 2 番目の状態から最初の状態に戻るのでしょうか? カーネルはそのページにビットを設定し、何かがそれにアクセスすると、そのページが「アクティブ」としてマークされ、最初の状態に戻ることを示します。これにより、ページ フォールトが発生します。

ページ フォールトの原因となるその他の要因として、メモリ マップ ファイルなどがあります。アプリケーションは、ファイルをメモリにマップすることを要求します。つまり、アプリがファイルから読み取りたいときはいつでもメモリに表示されます。明らかに、ファイル全体を一度にメモリにロードするのは非常にコストがかかるため、カーネルはメモリ空間に「これがアクセスされた場合はページフォールトしてください」ビットをマークし、アプリがそれに触れた場合はディスクから読み取りますページ。

実際の状況は上記よりもはるかに複雑ですが、何が起こっているのかについての一般的な考えが得られるはずです。

于 2008-10-10T06:57:46.360 に答える
3

タスク マネージャーを見ているときに、エクスプローラーで毎秒ページ フォールトが発生することは完全に論理的です。タスク マネージャーは毎秒更新され、通知領域のグラフも更新されます。通知領域とそのアイコンを管理するのは explorer.exe です。そのため、タスク マネージャーが小さなグラフを更新するたびに、エクスプローラーは taskmgr.exe から適切なアイコンを読み込む必要があり、ページ フォールトが発生します。( Raymond Chen の優れたブログで詳細をお読みください)

Raymond Chen がページ フォールトに関するその他の「問題」をいくつか説明していると確信していますが、現在その記事を見つけることができません。基本的に、ページ フォールトは、何かをディスクからロードする必要があることを常に意味するわけではありません。

于 2008-10-10T07:25:55.960 に答える
1

システムをアイドル状態で実行すると、メモリの約 40% が消費されます。

これを聞くたびに、ソフトウェアがシステム リソースを利用していると文句を言う人がいるのはなぜだろうと思います。ユーザーとして、積極的なプリフェッチとキャッシュのために、OS がメモリの 40% を占有することを好みます (他の方法で使用されていないと仮定します)。これにより、システムのインメモリ ヒットがより多く (ページ フォールトがより少なく) なるため、エンド エクスペリエンスが大幅に向上します。

大規模なページングに関しては、これは別の積極的なキャッシュ戦略であると思います (確実ではありません)。システム メモリがいっぱいになった場合 (たとえば、Visual Studio などのいくつかの大きなアプリで 1 GB、または VM を 1 つまたは 2 つ実行している場合は 4GB でさえ、かなり簡単です)、システムはページングする必要があります。ディスクからメモリにページを読み取る前に、メモリの一部のチャンクをディスクに出力します。OS がアイドル時間中に非アクティブなメモリを積極的にディスクにページングしている場合、別のプロセスでページ フォールトが発生したときにその操作を保存できます。

于 2008-10-10T07:22:13.517 に答える
0

「空きメモリ」は問題のある用語です。いつでも、すべてのバイトがディスクとRAMの両方にあることが最善です。そうすれば、プログラムが突然2GBになった場合でも、OSはディスクI/Oなしでその要求を満たすことができます。RAMをゼロにするだけです。これは、バイトが論理的に「ファイルバイト」(つまりRAMがキャッシュ)であるか「プロセスバイト」(つまりディスクバイトがページングされる)であるかに関係なく当てはまります。

明らかに、エンジニアリング上の理由から、ディスクとRAMの両方にすべてのバイトを含めることはできません。ただし、バイトがディスク上にあるという理由だけで、RAMからバイトをスローするべきではありません。また、回転するディスクとRAMページの両方が1分以内に変更されていない場合は、先制的にバイトを書き出すのが理にかなっています。OSに低い優先度でこれを実行させたいと思うでしょうが、優先I / OはWindowsではあまり一般的ではありません(Vistaの新機能であり、正直なところ、これは1.0の実装です)

于 2008-10-13T11:13:58.620 に答える
0

はい、同じことに気付きました。Windows XP でも発生します。

基本的に、Windows にはスワッピングに関して「高速割り当て」ポリシーがあるようです。必要なときに利用できるように、大量のメモリを解放しておきます。これは、メモリが制限されているコンピューターでは、ある程度の意味のある戦略です。大きなプログラムをロードすると何らかのスワップが発生するため、システムは事前にスワップを行います。
もちろん、大量のメモリを搭載したシステムでは、これは意味がありません。私のコンピューターの 1 つで、3 GB の RAM を搭載した XP を使用しています。ページ ファイルをオフにすると、コンピューターの速度が大幅に向上します。
また、この戦略は「シェルのロード」時間にも影響を与えます。シェルのロードとは、ログインしてから実際にコンピュータを使用できるようになるまでの間に何が起こるかを意味します。多くの常駐トレイ アイコン プログラムがロードされると同時にスワッピングが行われるため、ディスクの使用効率が非常に低下します。

Linux がインストールされている他のコンピューターでは、ポリシーが異なります。メモリがなくなるまで swap を使用しないでください。Linux は一般にメモリ消費量がかなり少ないため (アプリケーションが本当の豚です)、これは優れた戦略であり、結果として「シェルの読み込み」時間が短縮されます。十分なメモリがある場合、スワップ ファイルは必要になるまで基本的にオフになっています。

于 2008-10-10T07:47:05.917 に答える
0

もちろん、Vista はコンピュータの起動と実行を高速化するために必要なメモリを使用します。他のプログラムがメモリを必要とするときに、メモリを解放/スワップします。

そこにリソースがあり、利用可能で、後で問題なくリリースできる場合は、リソースを使用しないのはなぜですか?

ページ フォールトについては、この説明を参照してください。タスク マネージャーはそれらを作成します

(要約すると、タスク マネージャーがシステム トレイ アイコンを更新するたびに 1 つのページ フォールトが発生します。タスク マネージャーの更新速度を高速に設定すると、さらに多くのページ フォールトが発生します。これらのページ フォールトではメモリがスワップされません)。

于 2008-10-10T07:15:50.910 に答える