Microsoft Windowsのハイバネーションの手順を説明した記事を見ていた。私がそれから得る主なポイントは次のとおりです
- Windowsは
hiberfil.sys
ファイルにRAM全体を(たぶん処理した後に)ダンプします - 起動時にハイバネーションファイルが読み込まれ、その内容がRAMにロードされます
質問なのですが、普段、1GBなどのサイズのファイルをコピーしているときに、2分くらいで完了してしまうのですが、これはどうすればいいのでしょうか?
しかし、Windowsがハイバネーションファイルを書き込んでいるとき(ハイバネーション処理中)には、おそらく10~15秒ほどで全ての処理が終わってしまいます。なぜこのような書き込み速度の差があるのでしょうか?
私のRAMサイズは4GBです。(高速起動技術の話ではありません)
Benchmarks:
- 1GBのファイルをディスク1からディスク2(外付け)にコピー:2.3分
- システムを休止状態にする:15秒
65 coder 2015-03-09
これはおそらく三拍子揃った答えだと思います
ここで問題になっているのは、Windowsの新しいハイブリッド・シャットダウンで、これは効果的にアプリケーションを閉じてログオフし、その後オペレーティングシステムのコアを冬眠させることになります。すでにこのデータが保存されていれば、潜在的に「再冬眠」する必要がないことを意味します
第二に、ハイバネーションは、スワップファイルにページアウトされているか、使用されていないメモリページを保存する必要がないということです(これは、積極的にスワップファイルを埋めてメモリ内にデータを保持する1つの理由になるでしょう)
三つ目は、ハイバネーションファイルのデータも圧縮されているということですこれを私の2つ目のポイントと組み合わせると、もしあなたが非常に圧縮可能なデータ(実行ファイルは一般的によく圧縮されます)を含むエクスポートするデータの小さなセットだけを持っている場合、ハイバネーションファイルに出力されるデータの量は、作業データのセットよりも実質的に小さくなります。コメントにあるように、ファイルキャッシュやその他の不要なバッファデータは、ハイバネーションファイルにダンプされるデータ量を減らすために、悪い影響を与えずに簡単に捨てられることに注意してください
さらに、現在のハードドライブは非常に高速です。100 MB/秒の連続書き込みが可能なディスクであれば、4 GB の RAM を (非圧縮で) 1 分以内に書き出すことができます。ハイバネーションは、すべてのユーザープロセスを停止した後、CPUを停止する前に、最後に行うことができるので、OSは一般的にディスクの書き込み速度をフルに持つことになります。これは、あなたの単純なベンチマークが持っていない1つのことであり、ディスクからディスクへのコピーは、潜在的に単にディスクにRAMを書き出すよりも遅くなります
これらを組み合わせると、ハイバネーションファイルに書き込まれるデータ量は非常に小さく、潜在的には1GBのオーダーになる可能性があり、おそらく10秒以内に1つの大きな連続ブロックに書き込まれることになるでしょう
45 Mokubai 2015-03-09
まず、保存する必要のある RAM の量は驚くほど少ないです。実際には、マップされたダーティページのセット(「レイジーライトバック」)だけをフラッシュする必要があり、また、書き込まれたすべてのプライベートページと再配置された実行可能コードを書き込む必要があります
- 実行可能ファイルの.textセグメントは、常にファイルマッピングによってバックアップされています。これは少なくともいくつかの DLL にも当てはまります (すべてではありませんが、再配置する必要があるかどうかによります)
- ファイルマッピングによって同様にバックアップされたメモリは廃棄することができます(それはCoWやRWとダーティではないと推定されます)
- 怠惰なライトバックはまだ発生しますが、それ以外はキャッシュは捨てられます
- 割り当てられているが書き込まれていないメモリ(通常はアプリケーションデータの大部分です!)は、ゼロページによってバックアップされており、破棄することができます
- スタンバイ」状態にあるメモリページの大部分(Windowsのプロセスごとの実際の常駐作業セットはわずか16MBと驚くほど小さい)は、どこかの時点でバックグラウンドのページファイルにコピーされており、破棄される可能性があります
- グラフィックカードのような特定のデバイスによってマップされたメモリの領域は、(おそらく)保存する必要がないかもしれません。8GiBや16GiBをコンピュータに接続して、1GiBや2GiBが明らかな理由もなく “消えている “ことにユーザーが驚くことがあります。主要なグラフィックスAPIは、アプリケーションがバッファの内容が「ある条件の下で」無効になることを要求しています(これが何を意味するのかは正確には明かされていません)。そのため、グラフィックドライバによって固定されているメモリも廃棄されてしまうのではないかと期待するのも無理はありません。結局、画面は真っ暗になってしまいます
第二に、ファイルをコピーするのとは逆に、ディスクに保存する必要があるRAMページのセットをダンプすることは、ドライブの観点から見て、単一の連続した連続書き込みです。Win32 APIは、この操作のためのユーザーレベルの関数さえ公開しています。書込みギャザはハードウェアによって直接サポートされており、ディスクが物理的にデータを受け入れることができる速度で動作します(コントローラはDMAを介して直接データを引き出します)。 これが動作するためにはいくつかの前提条件があり(アライメント、ブロックサイズ、ピン留めなど)、キャッシングとの相性が悪く、「遅延ライトバック」(これは通常の動作下では非常に望ましい最適化です)のようなものは存在しません。 すべての書き込みが常にそのように動作するわけではないのはそのためです。しかし、システムがハイバネーションファイルを保存しているときは、すべての前提条件が自動的に満たされていて(すべてのデータがページ揃えされていて、ページサイズが決まっていて、ピン留めされている)、コンピュータの電源が一瞬で切れそうなので、キャッシングは無関係になっているだけなのです
第三に、単一の連続した書き込みを行うことは、回転ディスクとソリッドステートディスクの両方で非常に有利です
スワップファイルとハイバネーションファイルは、通常、ディスク上に作成され、予約された最も初期のファイルのいくつかです。これらのファイルは通常、1つ、多くても2つのフラグメントを持っています。したがって、セクタが破損してディスクが物理セクタを再割り当てしなければならない場合を除いて、論理的なシーケンシャル書き込みは、回転するディスク上での物理的なシーケンシャル書き込みに変換されます
膨大な量の連続したデータが書き込まれているときには、ディスク上でのリード・モディファイ・ライト操作は必要ありません。この問題は、非常に小さいシングルセクタを書き込むことができる回転するハードディスクではあまり顕著ではありません(キャッシュが通常防ぐシングルバイトの書き込みを行わない場合は、デバイスは元の内容を取得して変更されたバージョンを書き戻す必要はありません)。 しかし、これは SSD の場合、書き込みのたびに、例えば 512kB のブロック (これは通常の数字ですが、もっと大きいかもしれません) をコントローラが読み込んで修正し、別のブロックに書き戻さなければならないことを意味しています。原則として、フラッシュディスク上のより小さな単位に書き込むことはできますが(上書きはできません)、巨大なブロックを消去することはできません。これが、SSD が巨大なシーケンシャル書き込みに優れている理由です
31 Damon 2015-03-10
ハイバネート時にRAM全体をダンプしてくれるわけではありません
すでにRAMの大部分がディスク上に複製されているでしょう。これにより、ハイバネーションを素早く行うことができるだけでなく、新しいプログラムのために(素早く起動できるように)メモリを素早く利用可能にすることができます
そのため、4GBのごく一部を書けばいいだけで、それが10-15秒でできるようになります
RAM が不足している場合(例えば、Committed Bytes がインストールされている RAM よりも大きい場合)、オペレーティング システムは、アクティブに使用されていない仮想メモリ ページをページファイルにコピーすることで、インストールされている RAM の一定の割合をすぐに使用できるように維持しようとします。したがって、このカウンタがゼロになることはなく、システムのRAMが不足しているかどうかを示す良い指標になるとは限りません
10 Peter Crotty 2015-03-10
上記以外にも、いくつかの要因があると思います
1つは、ファイルをコピーするときに、ファイルを読み書きしなければならないということですが、hybernationではファイルを書き込むだけで済みます。それは、定義上、すでにメモリに入っています!
これに密接に関連して、ファイルを読み込んで同時に書き込む場合、メモリを節約するために、処理は次のようになります:チャンクを読んで、チャンクを書いて、ディレクトリを更新(新しいサイズを表示する); チャンクを読んで、チャンクを書いて、ディレクトリを更新します
ディスクのある部分から別の部分に移動するたびに(例えば、ファイルaを読んでファイルbを書き、ファイルbを書いてディレクトリを書き、ディレクトリを書いて次のチャンクを読む)、ディスクはシークしなければなりません – ヘッドを動かし、ヘッドが落ち着くのを待ち、ディスクの適切な部分が来るのを待ちます。これはソリッドステートディスクの利点の一つで、シークに時間がかからないということです。ハイバネーション時には、データはエンドツーエンドで書き込まれます。ハイバネーション(スワップ)ファイルはあらかじめ割り当てられているので、ディレクトリを更新する必要がありません(ハイバネーションファイルのサイズを変更するのではなく、内容だけを変更します)
そして最後に、あなたのコンピュータは他のすべてのタスクを停止しています – これは、コンピュータが行っている唯一のことです (これが大きな違いになるとは思えませんが、多少の違いはあるでしょう!)。メモリ管理やタスクの切り替えなどの作業も中断されています
2 AMADANON Inc. 2015-03-12
これは、RAMの入出力速度がハードディスクよりもはるかに速いため、中に入っているものをハードディスクで読み込んだように素早く出力できるからではないでしょうか
ファイルをコピーするとき、あなたはまた、様々な要因によって制限されています – ディスクの速度、同じディスクに読み込まれたり読み出されたりすると時間がかかります、接続の制限された速度(外付けドライブの場合)、何かを上書きしていないかどうかの確認など
0 Wilf 2015-03-09