回答:
オンデマンド。実際、Linuxはアイドル時に物理メモリをゆっくりとスワップに転送します(「スワップ」を参照)。
通常の操作中、スワップからのデータはオンデマンドでメモリに読み込まれますが、他の回答もありますが、これが発生するケースがもう1つあります。それは、スワップコンテンツ全体を読み込むのに十分な物理メモリがある場合に、スワップスペースが無効になっている場合です。
ただやる:
swapoff -a
…そして、すべてのスワップデータがメモリに「戻ります」。副作用として、ディスクバッファー/キャッシュがフラッシュされる可能性があります。
時々swapoff -a ; swapon -a
、たとえばバグのあるメモリリークプロセスの後、クラッシュする前に、より重要なプロセスを一掃することが望ましい場合があります。システムで実行中のプロセスがメモリにロードされ、スワップインを待機しないようにするためです。数分。
swapoff
は失敗しませんが、システムはすぐにメモリ不足にswapoff
なり、OOMはランダムプロセスを終了します(最悪の場合、シェルswapon
またはswapon
コマンドを呼び出します)。実際にはほとんどありません。swapoff
呼び出される前に多くのメモリがキャッシュによって使用されるため、両方のコマンドを実行するには十分なRAMが必要です。
他の人が指摘したように、ページは、必要に応じて(オンデマンドで)RAMにコピーされるだけで、キャッシュ/バッファーで利用可能なままにしておいたRAMを占有することはありません。
ページが移動されずにRAMにコピーされるという事実は重要であり、知らない場合は混乱を招く可能性があります。ページがまったく不要にならない(つまり、ページが完全に割り当て解除される)か、RAMで変更される(そのため、スワップ内のコピーが正しくなくなる)か、スワップが少なくなっている(および-diskブロックは、他のいくつかのページをスワップアウトするために必要です)。カーネルがディスク上に既に適切なコピーがあることを知っているので、このようにページを将来スワップアウトする必要がある場合、ディスク書き込みは不要です。これにより、使用可能なRAMが非常に少なくなったときに「スラッシング」を大幅に減らすことができますが、スワップ領域もありません。混雑。
あなたはからのRAMとスワップの両方に入っているどのように多くのページを見ることができますcat /proc/meminfo
- SwapCached
ラインはRAMで、ディスク上の両方の現在のページにあるデータの量です。現在のスワップが予想よりも多く使用していると思われる場合は、SwapCachedの値を確認してください。
これは通常、使用しているハードウェアにバインドされています。ほとんどのハードウェア(Intelを含む)では、MMUがプロセス全体を制御します。
プログラムがメモリを割り当てると、MMUにメモリを要求し、仮想アドレスを返します。次に、MMUはそのページをグローバルアドレス空間マップで「使用中」として登録します。
プログラムが実際にそのメモリ空間にアクセスすると、MMUはページをアドレスマップにルックアップします。そのページが「ライブ」メモリ内にある場合、プログラムの代わりにメモリの読み取り/書き込みを処理するOSに「ライブ」ポインタを送り返します。メモリが現在割り当てられていない場合は、ページ違反がトリガーされます。次に、このプロセッサ例外はOSによってキャッチされます。OSは、データがスワップファイル内のどこにあるかを把握し、物理メモリにロードして、ページをMMUに戻し、初期プロセスを続行できるようにします。
これは、メモリページがアクセスされない限り、スワップに入れられると「ライブ」メモリに戻らないことを意味します。そのため、通常、特定のメモリブロックをディスクにスワップせず、メモリに保持する必要があることをプログラムが指定できるOS APIがあります(Linuxについてはわかりませんが、WindowsではVirtualLock関数です)。 。
mlock(2)
linux.die.net/man/2/mlock