ページングとスワッピングを理解している限り、それらは完全に異なる概念です。スワッピングとは、プロセスが物理メモリ内またはハードドライブ上に完全に存在することを意味します。プロセスのページング部分は物理メモリ内にあり、他の部分はハードドライブ上にあります。
しかし、なぜLinuxにはスワップパーティションが必要なのですか?物理メモリがいっぱいになると、一部のプロセスがハードドライブにアウトソーシングされ、新しいプロセスが仮想メモリから物理メモリにマッピングされます。
なぜスワップパーティション(または一般的にスワップ)が必要なのかわかりませんか?
それとも、これは単に用語の問題であり、swap partition == virtual memory
?
はい、それは単に用語の問題です。多くの場合、スワップパーティションは仮想メモリとして使用されます。
UNIXおよびUNIXライクなシステムがページファイルよりもスワップパーティションを好む理由は、それらが連続している可能性があるため、フラグメント化される可能性のあるページファイルと比較してシーク時間が短くなるためです。
「スワップとは、プロセスが完全に物理メモリ内またはハードドライブ上にあることを意味する」という概念がどこで得られたかはわかりません。その意味は、数十年の間使用されていません。引用 ウィキペディア :
歴史的に、スワッピングとは、ロールイン/ロールアウトと呼ばれるスキームで、プログラム全体を一度にセカンダリストレージとの間で移動することを指していました。 1960年代、仮想メモリの概念が導入された後(セグメントまたはページを使用する2つのバリエーション)、スワップという用語は、ディスクとメモリ間でのセグメントまたはページの移動にそれぞれ適用されました。今日、仮想メモリは主にセグメントではなくページに基づいているため、スワッピングはページングのかなり近い同義語になりましたが、1つの違いがあります。[疑わしい–議論]
実際、Linux(またはその他のUNIXシステム)が関係するコンテキストでは、ページングおよびスワッピングはほとんど同義語です。両方とも、ページのデータをRAMまたはディスクに保存できる仮想メモリの使用を指します(ページは、一般的なデバイスでは4kBです)。メモリページを使用するプログラムは、データがどこに保存されているかを気にせず、知らないだけです。仮想アドレスを使い続けるだけです。カーネルは、RAMとディスクの間でデータを転送し、- [〜#〜] mmu [〜#〜] テーブルが進むにつれて、仮想アドレスのエントリがメモリ内の物理ページを指すか、プロセッサにいくつかを実行させる特別な値が含まれるようになります。ディスクから適切なデータをロードするカーネルコード。
ページングは、この一般的なプロセスを指します。 Swappingは、ディスク上のデータが専用領域(スワップ領域(スワップパーティションまたはスワップファイル))にある場合を指します。ページングは、RAMとファイルの間でも実行できます。この場合、通常、スワッピングとは呼ばれません。たとえば、プログラムを実行する場合、実行するにはコードをメモリにロードする必要があります。コードページをRAMから削除して他のスペースを確保する必要がある場合は、何もありません。このページは、プログラムファイルから再度読み込むことができるため、スワップ領域に書き込む必要があります(これは、プログラムコードだけでなく、すべての読み取り専用データに対して実行できます)。
物理メモリが(ほぼ)いっぱいである場合、カーネルはRAM(プロセス全体ではない))で最近使用されていないページを探します。そのページがディスクのコンテンツを再生する場合ファイル(これを示すためにカーネル内にテーブルがある)、ページは再利用できます。そうでない場合、ページはスワップに書き出され、再利用されます。カーネルがプロセスの仮想メモリテーブル(これは、 MMUテーブル)にないことを示すマークを付けるRAMそして、物理ページを別のもの(別のプログラム、または別のページ)に再利用できます。同じプログラムの)。
仮想メモリ/ページング機能により、カーネルはメモリをユーザースペースプロセスに「仮想化」できます。カーネルは物理メモリからページを取得し、ページングを介してそれらを配置して、ユーザー空間プロセスに隣接して見えるようにすることができます。
ユーザースペースプロセスのメモリに制限を設定できます。プロセスがそれを超えると、「ページフォールト」が発生し、CPU例外が発生してカーネルに戻ります。これにより、カーネルの許可なしに、ユーザー空間プログラムがカーネルまたは他のプログラムに割り当てられたメモリを乱用するのを防ぎます。
通常、ユーザー空間プログラムは、適切に定義されたインターフェース(たとえば、C関数malloc()
およびfree()
によって呼び出されます)を介して、この制限を拡張するようカーネルに要求します。カーネルは、プログラムに割り当てられているメモリの量とメモリを追跡する責任があります。
この「ページフォールト」メカニズムは、カーネルがメモリをオーバープロビジョニングできる場合(およびWindowsとLinuxの両方がこれをサポートしている場合)、プロセスがアクセスしようとしていたページをディスクからスワップさせることもできます。そのため、これはスワップと呼ばれます。メモリアクセスが実際に無効だった場合(つまり、プロセスが最初に要求しなかったメモリにアクセスしようとしている場合)、通常、プロセスはSIGSEGVで強制終了されます。
したがって、「スワッピング」は仮想メモリ/ページングに依存する追加機能です(Linuxでは、必要に応じて実際に完全に無効にすることができます)が、CPUに仮想メモリ/ページングがあるという理由だけで必須ではありません。概念は同じではありませんが、スワッピングは存在するページング/仮想メモリに依存します。
また、質問を詳しく読んだ後、「ページング」は「スワッピング」の同義語として使用されることもありますが、プロセス全体のメモリがスワップアウトされることを意味する「スワッピング」と、一部のみを意味する「ページング」については聞いたことがありません。スワップアウトされます。
しかし、なぜLinuxにはスワップパーティションが必要なのでしょうか。物理メモリがいっぱいになると、一部のプロセスがハードドライブにアウトソーシングされ、新しいプロセスが仮想メモリから物理メモリにマッピングされます。
「仮想メモリ」 です 物理メモリ、単に「再マップ」。 MMUハードウェアはどのストレージデバイスにも直接マップできません。MMUは、プロセスがメモリにアクセスしようとしたことをカーネルに通知する障害をスローする可能性があります。 -カーネルはこのメカニズムを使用して、プロセスがメモリ内にあると考えたディスクから何かを戻したいことを確認し、「スワップ」を実行できます。重要なのは、ページをディスクに保存して使用できるようにするのはオペレーティングシステムです。ハードウェアではなく、他のプロセスのページ。
一般に、スワップパーティションは仮想メモリとは異なります。
プロセスは実際の物理メモリより多くのメモリを必要とする可能性があるため、OS開発者はシステムに「仮想メモリ」と呼ばれるより多くのメモリがあると想定することにしました。
この仮想メモリは基本的に物理メモリであり、ディスクの一部です。ディスクのこの部分は、Linuxでは「スワップ」と呼ばれます。
また、開発者は、ハードディスク上にある仮想メモリの部分の使用量をできるだけ少なくする必要があることを提案しました。そのために、すべての仮想メモリは「ページ」と呼ばれる小さな部分に分割されました。多くのページが低速で使用されています。これらのページは、ハードディスク上の仮想メモリの一部に書き出す必要があります。この操作は「スワップアウト」と呼ばれます。 OSは、必要なときにページを見つけるために、物理メモリにないページを追跡する必要があります。ページフォールトは、プログラムがスワップアウトされたメモリの一部を書き込み/読み取りしようとしたときに発生します。
あなたの質問に答えるには:Linuxはメモリのいくつかのページをスワップアウトするためにスワップパーティションを必要とし、vmstat
で仮想メモリ使用量の統計を見ることができます:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
2 0 35424 524560 134164 1858728 0 0 13 11 55 42 5 1 94 0
0 0 35424 526720 134164 1857872 0 0 0 0 2774 5224 7 2 91 0
1 0 35424 516328 134172 1870116 0 0 0 6 3464 6561 13 3 84 0
0 0 35424 522992 134212 1862676 0 0 0 125 4135 7135 12 4 84 1
'swap'列には、スワップアウトと統計が表示されます。また、 このリンク は仮想メモリとvmstat
の使用法についても説明しています。