仮想メモリ/ページング機能により、カーネルはメモリをユーザー空間プロセスに「仮想化」できます。カーネルは、物理メモリからページを取得し、ページングを介してページを配置して、ユーザースペースプロセスに隣接しているように見せることができます。
ユーザースペースプロセスのメモリに制限を設定できます。プロセスがそれを超えると「ページフォールト」が発生し、CPU例外が発生してカーネルに戻ります。これにより、ユーザー空間プログラムが、カーネルの許可なしに、カーネルまたは他のプログラムに割り当てられたメモリをいじることを防ぎます。
通常、ユーザー空間プログラムは、カーネルに、明確に定義されたインターフェース(C関数malloc()
などによって呼び出される)を介してこの制限を拡張するように要求しますfree()
。カーネルは、プログラムが割り当てられているメモリの量と量を追跡する責任があります。
カーネルがメモリをオーバープロビジョニングできる場合(およびWindowsとLinuxの両方がこれをサポートしている場合)、この「ページフォールト」メカニズムにより、プロセスがディスクからアクセスしようとしたページをカーネルにスワップさせることができます。メモリアクセスが実際に無効だった場合(つまり、プロセスが最初に要求しなかったメモリにアクセスしようとしている場合)、通常、プロセスはSIGSEGVで強制終了されます。
そのため、「スワップ」は仮想メモリ/ページングに依存する追加機能です(Linuxでは必要に応じて実際に完全に無効にできます)が、CPUに仮想メモリ/ページングがあるという理由だけでは必要ありません。概念は同じではありませんが、スワッピングは存在するページング/仮想メモリに依存します。
また、質問をより詳しく読んだ後、「ページング」は「スワップ」の同義語として使用されることがありますが、プロセス全体のメモリがスワップアウトされることを意味する「スワップ」と聞いたことはありません。スワップアウトされます。
しかし、なぜLinuxはスワップパーティションを必要としますか?物理メモリがいっぱいになると、一部のプロセスがハードドライブに外注され、新しいプロセスが仮想メモリから物理メモリにマップされます。
「仮想メモリ」は物理メモリであり、「再マップ」されます。MMUハードウェアは、ストレージデバイスに直接マッピングできません。MMUは、あるべきではないメモリにアクセスしようとしたプロセスをカーネルに伝えるフォールトをスローできます。また、カーネルはこのメカニズムを使用して、プロセスがメモリ内にあると考えられるディスクから何かを戻すことを確認してから、「スワップ"。ポイントは、ハードウェアではなく、他のプロセスでページを使用できるようにページをディスクに保存することを決定するオペレーティングシステムです。