まず、保存する必要があるRAMの量は驚くほど少ないです。実際、マップされたダーティページ(「遅延ライトバック」)のセットのみをフラッシュする必要があり、実行可能コードに書き込まれ、再配置されたすべてのプライベートページを書き込む必要があります。
- 実行可能ファイルの.textセグメントは、常にファイルマッピングによってサポートされます。これは少なくとも一部の DLLにも当てはまります(すべてではありませんが、再配置が必要かどうかによって異なります)。
- 同様にファイルマッピングによってサポートされているメモリは破棄できます(CoWまたはRWではなく、ダーティであると想定)。
- 遅延ライトバックは引き続き発生する必要がありますが、それ以外の場合、キャッシュは破棄できます。
- 割り当てられているが、書き込まれていないメモリ(通常はアプリケーションデータの大部分!)は、ゼロページによって裏打ちされており、破棄できます。
- 「スタンバイ」ステータスのメモリページの大部分(Windowsの実際のプロセスごとの常駐ワーキングセットは驚くほど小さく、わずか16MB)は、ある時点でバックグラウンドのページファイルにコピーされ、破棄できます。 。
- グラフィックカードなどの特定のデバイスによってマップされるメモリの領域は、(おそらく)保存する必要がない場合があります。ユーザーは、8GiBまたは16GiBをコンピューターに接続すると驚かされることがあり、1GiBまたは2GiBは明確な理由もなく「なくなった」だけです。主要なグラフィックスAPIでは、アプリケーションが「特定の条件下で」バッファーの内容が無効になることを要求します(これが何を意味するかを正確に伝えることなく)。したがって、グラフィックスドライバーによって固定されているメモリも単に破棄されることを期待するのは不合理ではありません。とにかく、画面はとにかく暗くなるでしょう。
第二に、ファイルをコピーするのとは異なり、ディスクに保存する必要があるRAMページのセットをダンプすることは、ドライブの観点からは単一の連続した連続した書き込みです。Win32 APIは、まさにこの操作のためにユーザーレベルの関数を公開します。書き込みの収集はハードウェアによって直接サポートされており、ディスクが物理的にデータを受け入れることができる限り高速に動作します(コントローラーはDMAを介してデータを直接プルします)。
これが機能するための多くの前提条件(アライメント、ブロックサイズ、固定など)があり、キャッシングとはうまく機能せず、「遅延書き込み」(通常の操作では非常に望ましい最適化)はありません。 )。
それがすべての書き込みではない理由です常にそのように動作します。ただし、システムが休止状態ファイルを保存すると、すべての前提条件が自動的に満たされ(すべてのデータはページに揃えられ、ページサイズが設定され、固定されます)、すぐにコンピューターの電源がオフになるため、キャッシュは無関係になります。
第三に、単一の連続した書き込みを行うことは、スピニングディスクとソリッドステートディスクの両方にとって非常に有利です。
通常、スワップファイルと休止状態ファイルは、ディスク上で作成および予約された最も古いファイルの一部です。通常、1つ、多くても2つのフラグメントがあります。したがって、セクターが損傷し、ディスクが物理セクターを再割り当てする必要がない限り、論理順次書き込みは、回転中のディスクでの物理順次書き込みに変換されます。
大量の連続した連続データが書き込まれている場合、ディスク上で読み取り-変更-書き込み操作は必要ありません。この問題は、非常に小さい単一セクターを書き込むことができる回転するハードディスクではそれほど顕著ではありません(通常、キャッシュによって防止される単一バイトを書き込まない場合、デバイスは元のコンテンツをフェッチして変更バージョンを書き戻す必要はありません)。 。
ただし、これはSSDで非常に顕著であり、書き込みごとに、たとえば512kBブロック(通常の数ですが、それより大きくなる可能性があります)をコントローラーで読み取って変更し、別のブロックに書き戻す必要があることを意味しますブロック。原則として書き込みが可能ですが(上書きはできません)フラッシュディスク上の小さなユニットでは、巨大なブロックのみを消去できます。ハードウェアの仕組みです。これが、SSDが巨大な順次書き込みでこれほど優れている理由です。