Linuxでスワップが物理メモリに戻されるのはいつですか?それはオンデマンドだけですか、つまり。いつ必要ですか?または、コンピュータの負荷が高くないときに、スワップが物理メモリにゆっくりと転送されますか?
オンデマンド。実際、Linuxはアイドル状態のときに物理メモリをゆっくりとスワップに転送します(「スワップネス」を参照)。
他の回答と同様に、通常の操作中にスワップからのデータがオンデマンドでメモリにロードされますが、これが発生するもう1つのケースがあります。それは、スワップコンテンツ全体をロードするのに十分な物理メモリがある場合、スワップスペースが無効になっている場合です。
ただしてください:
swapoff -a
…そして、すべてのスワップデータはメモリに「戻ってきます」。副作用は、ディスクバッファ/キャッシュがフラッシュされる可能性があることです。
swapoff -a ; swapon -a
を実行することが望ましい場合があります。バグのあるメモリリークプロセスの後、クラッシュする前に、より重要なプロセスを一掃しました。システムで実行されているプロセスがメモリにロードされ、数分でスワップを待機しないようにするためです。
他の人が指摘しているように、ページはRAMを使用するのではなく、必要な場合(オンデマンド)にのみRAMにコピーされます。キャッシュ/バッファ。
ページが移動されずにRAMにコピーされて戻されるという事実は重要であり、気づかないと混乱を招く可能性があります。ページは、まったく必要なくなった(つまり、ページが完全に割り当て解除された)場合を除いて、スワップから割り当て解除されません。RAM(したがって、スワップ内のコピーは正しくありません)、またはスワップが少なくなっています(そして、他のページをスワップアウトするためにディスク上のブロックが必要です)。このように、将来ページを再びスワップアウトする必要がある場合、カーネルはすでに適切なコピーがあることを知っているので、ディスク書き込みは必要ありませんディスク上-これにより、使用可能な場合の「スラッシング」を大幅に減らすことができますRAMは非常に低くなりますが、スワップスペースも混雑しません。
現在両方にあるページ数を確認できますRAMおよびcat /proc/meminfo
からスワップ-SwapCached
行は、現在両方にあるページにあるデータの量ですin RAM and on disk。現在のスワップが予想よりも高く使用していると思われる場合は、SwapCached値を確認してください。これにより、不一致が説明される可能性があります。
これは通常、使用しているハードウェアにバインドされています。ほとんどのハードウェア(Intelを含む)では、 [〜#〜] mmu [〜#〜] がプロセス全体を制御します。
プログラムがメモリを割り当てると、それをMMUに要求し、仮想アドレスを取得します。次に、MMUは、そのページを "として登録します。グローバルアドレス空間マップの「使用中」。
プログラムが実際にそのメモリ空間にアクセスすると、MMUはページをアドレスマップで検索します。そのページが「ライブ」メモリにある場合、「ライブ」ポインタをプログラムに代わってメモリの読み取り/書き込みを処理するOS。メモリが現在割り当てられていない場合、ページ障害がトリガーされます。このプロセッサ例外はOSによってキャッチされ、OSはどこにあるかを把握する責任があります。データはスワップファイルにあり、それを物理メモリにロードして、ページをMMUに戻し、最初のプロセスを続行できるようにします。
これは、メモリページにアクセスしない限り、スワップに入れられると「ライブ」メモリに戻らないことを意味します。そのため、通常、特定のメモリブロックをディスクにスワップせず、メモリに保持するようにプログラムで指定できるOS APIがあります(Linuxについてはわかりませんが、WindowsではVirtualLock関数です)。 。