プロセス全体を主記憶と補助記憶の間でまるごと退避・復帰させる仕組み。
スワッピングとは、主記憶(=メインメモリ)が不足したとき、プロセス(=実行中のプログラム1つ分)を主記憶と補助記憶の間でまるごと入れ替える仕組みのことです。退避することをスワップアウト、戻すことをスワップインといいます。
身近な例で考えると、狭い作業机と大きな書庫の関係に似ています。机(=主記憶)に書類を全部広げられないので、今使わない書類の束をまるごと書庫(=補助記憶)にしまい、必要になったらまた机に戻します。1束まるごと動かすのがスワッピングの特徴です。
上のツールで▶ボタンを押すと、主記憶が足りないときにプロセスBを補助記憶へ退避し、空いた領域に別のプロセスを置く流れを確認できます。
スワッピングと似た仕組みにページングがあります。どちらも主記憶と補助記憶を行き来させますが、動かす単位(粒度)が違います。
| 項目 | スワッピング | ページング |
|---|---|---|
| 動かす単位 | プロセス全体(粒度が大きい) | ページ単位(細かい) |
| 読み込み量 | まるごと全部 | 必要な分だけ |
| 現代OS | 補助的に併用 | 中心的に使用 |
スワッピングはプロセスを丸ごと動かすため、退避・復帰のたびに大きなデータをやり取りします。一方ページングはページ単位(=メモリを一定サイズに区切った単位)で必要な分だけ動かすので無駄が少なく、現代のOSはページ単位の管理が中心です。
スワップ領域とは、補助記憶(ディスク)上に確保された、退避されたプロセスやページを置くための専用領域のことです。スワップアウトされたデータはここに保存されます。
スワップ領域があることで、物理メモリの不足を補い、見かけ上のメモリを増やせます。実際の物理メモリが少なくても、当面使わないプロセスを退避しておけば、その分だけ多くのプロセスを同時に抱えられるようになります。これが仮想記憶(=実際のメモリより大きく見せかける仕組み)の土台です。
ただし補助記憶は主記憶よりずっと遅いため、スワップが多発すると性能が落ちます。上のツールの補助記憶(右側のボックス)が、このスワップ領域にあたります。
主記憶(メインメモリ)は容量に限りがあります。プログラムを実行するとき、OSはそのプログラムを主記憶に読み込んでからCPUに渡します。しかし主記憶が満杯だと、新しいプログラムをどこにも置けません。
なぜ主記憶だけでは限界があるのか。主記憶は非常に高速ですが、その分コストが高く、大容量にしにくいという性質があります。一方、補助記憶(ハードディスクやSSDなど)は主記憶より容量が何十倍も大きく、コストも低い。この差を利用するのがスワッピングです。
・主記憶:今すぐ使うデータを置く。容量は小さいが高速
・補助記憶:しばらく使わないデータを退避する。容量は大きいが低速
身近な例で考えると、スマートフォンでアプリをバックグラウンドに移すのに似ています。表示していないアプリを「休眠状態」にしてメモリを空け、別のアプリのために領域を確保しています。スワッピングはこれと同じ発想をOSが自動で行う仕組みです。
スワッピングには大きなコスト(代償)があります。補助記憶は主記憶より何十倍〜何百倍も遅いのです。そのため、スワップアウトとスワップインのたびに大量のデータを補助記憶からやり取りするスワッピングは、どうしても時間がかかります。
なぜ遅くなると困るのか。コンピュータの動作が目に見えてもたつき始める「スラッシング(=スワップが多発して処理がほぼ止まってしまう状態)」という問題に発展することがあります。OSはスワップが増えないよう、なるべく使われているプロセスを主記憶に保つように工夫しています。
・スワップが少ない:補助記憶のやり取りが少なく、快適に動く
・スワップが多発:補助記憶のやり取りが増え、全体の処理が大幅に遅くなる
まとめると、スワッピングは「主記憶の限界を補助記憶で補う便利な仕組みだが、多用すると速度が落ちる」というトレードオフの関係にあります。同時に起動するプログラムを増やしすぎると動作が遅くなるのは、このスワッピングが多発しているからと考えられます。