とにかくカーネルがページング/仮想メモリをサポートしているのに、Linuxがスワップパーティションを使用するのはなぜですか?


23

ページングとスワッピングを理解している限り、それらはまったく異なる概念です。スワップとは、プロセスが完全に物理メモリまたはハードドライブにあることを意味します。ページングのプロセスの一部は物理メモリに、他の部分はハードドライブに配置できます。

しかし、なぜLinuxはスワップパーティションを必要としますか?物理メモリがいっぱいになると、一部のプロセスがハードドライブに外注され、新しいプロセスが仮想メモリから物理メモリにマップされます。

スワップパーティション(または一般的なスワップ)が必要な理由がわかりません。

または、これは単なる用語の問題swap partition == virtual memoryですか?


5
コンピュータアーキテクチャの「仮想メモリ」は技術であることに注意してください。一方、MS Windows(誤ってIMO)は、「仮想メモリとは、Windowsがランダムアクセスメモリ(RAM)と共に使用するコンピューターのハードディスク上のストレージスペース」と定義しています。 IEグーグルウィンドウズ「仮想メモリ」
おがくず

回答:


25

はい、用語の問題です。多くの場合、スワップパーティションは仮想メモリとして使用されます。

UNIXおよびUNIXライクシステムがページファイルよりもスワップパーティションを好む理由は、断片化されている可能性のあるページファイルに比べてシーク時間が短くなるためです。


6
また、この方法では、Linuxインストール間で単一のスワップパーティションを共有するのも簡単です。
オクトーシテ

3
通常、ページファイルは最初のブートで完全に作成されるため、断片化されません(まあ、まだいくつかの可能性があります。)
AndreaCi

12
非常に初期のUNIXには、ページングではなくスワップのみがあり、専用パーティションにのみスワップできました。ページングは​​、ハードウェアがサポートするとすぐに実装されましたが、「スワップパーティション」という名前はそのままです。ファイルへのページングは​​より最近のものであり、OSオーバーヘッドが高く、断片化のリスクがあるため、お勧めできません。
zwol

1
「スワップパーティションは仮想メモリとして使用されます。」-セカンダリストレージ(ディスク上のページファイルなど)を「仮想メモリ」として定義しているのはMicrosoft Windowsのみです。しかし、彼らもこの使用法から遠ざかろうとしています。「仮想メモリ」ウィンドウをググリングしてみてください。最初の結果の概要(「仮想メモリはストレージスペース...」)がページの内容と一致しません。正しいステートメントは、「スワップパーティションは仮想メモリによって使用さます」です。
おがくず

14

「スワッピングとは、プロセスが完全に物理メモリまたはハードドライブのいずれかにあること」という概念をどこから得たのかわかりません。その意味は、数十年間使用されていません。Wikipediaの引用:

歴史的に、スワッピングとは、ロールイン/ロールアウトとして知られる方式で、一度にプログラム全体をセカンダリストレージから/に移動することを指します。1960年代、仮想メモリの概念が導入された後、セグメントまたはページを使用した2つのバリエーションで、ディスクとメモリ間のセグメントまたはページの移動にそれぞれスワッピングという用語が適用されました。今日では、セグメントではなくページに主に基づいた仮想メモリにより、スワッピングはページングのかなり近い同義語になりましたが、1つの違いがあります。

実際、Linux(または他のUNIXシステム)が関係するコンテキストでは、ページングスワッピングはほぼ同義語です。どちらも、ページのデータをRAMまたはディスクに保存できる仮想メモリの使用を指します。(ページは、遭遇する可能性のあるデバイスで4kBです。)メモリページを使用するプログラムは、データの保存場所を気にせず、それどころか、仮想アドレスを使用し続けるだけです。カーネルはRAMとディスク間でデータを転送し、MMUテーブルを更新して、仮想アドレスのエントリがメモリ内の物理ページを指すか、プロセッサーにカーネルコードを実行させる特別な値が含まれるようにしますこれにより、ディスクから適切なデータがロードされます。

ページングとは、この一般的なプロセスのことです。スワッピングとは、ディスク上のデータが専用領域(スワップ領域(スワップパーティションまたはスワップファイル))にある場合を指します。ページングはまた、RAMとファイルの間で行うことができ、この場合には、それは通常通りに参照さていないスワップ。たとえば、プログラムを実行する場合、実行するコードをメモリにロードする必要があります。コードページをRAMからエビクトして他のスペースを確保する必要がある場合、プログラムファイルから読み込むことができるため、このページをスワップ領域に書き込む必要はありません。(これは、プログラムコードだけでなく、すべての読み取り専用データに対して実行できます。)

物理メモリが(ほぼ)満杯の場合、カーネルは最近使用されていない(プロセス全体ではなく)RAMのページを探します。そのページがディスクファイルのコンテンツを再現する場合(これを示すためのカーネル内のテーブルがあります)、ページを再生できます。そうでない場合、ページはスワップのために書き出され、再利用されます。どちらの方法でも、カーネルはプロセスの仮想メモリテーブル(プロセスの実行中にMMUテーブルになります)のエントリを更新してRAMにないことをマークし、物理ページを他の何か(別のプログラム、または同じプログラム)。


あなたの答えの最初の段落は、彼がアイデアを得た場所、つまり古い文書を彼に伝えます。(スワッピングとページングにも違いがあったときを覚えています。)
RonJohn

9

仮想メモリ/ページング機能により、カーネルはメモリをユーザー空間プロセスに「仮想化」できます。カーネルは、物理メモリからページを取得し、ページングを介してページを配置して、ユーザースペースプロセスに隣接しているように見せることができます。

ユーザースペースプロセスのメモリに制限を設定できます。プロセスがそれを超えると「ページフォールト」が発生し、CPU例外が発生してカーネルに戻ります。これにより、ユーザー空間プログラムが、カーネルの許可なしに、カーネルまたは他のプログラムに割り当てられたメモリをいじることを防ぎます。

通常、ユーザー空間プログラムは、カーネルに、明確に定義されたインターフェース(C関数malloc()などによって呼び出される)を介してこの制限を拡張するように要求しますfree()。カーネルは、プログラムが割り当てられているメモリの量と量を追跡する責任があります。

カーネルがメモリをオーバープロビジョニングできる場合(およびWindowsとLinuxの両方がこれをサポートしている場合)、この「ページフォールト」メカニズムにより、プロセスがディスクからアクセスしようとしたページをカーネルにスワップさせることができます。メモリアクセスが実際に無効だった場合(つまり、プロセスが最初に要求しなかったメモリにアクセスしようとしている場合)、通常、プロセスはSIGSEGVで強制終了されます。

そのため、「スワップ」は仮想メモリ/ページングに依存する追加機能です(Linuxでは必要に応じて実際に完全に無効にできます)が、CPUに仮想メモリ/ページングがあるという理由だけでは必要ありません。概念は同じではありませんが、スワッピングは存在するページング/仮想メモリに依存します。


また、質問をより詳しく読んだ後、「ページング」は「スワップ」の同義語として使用されることがありますが、プロセス全体のメモリがスワップアウトされることを意味する「スワップ」と聞いたことはありません。スワップアウトされます。

しかし、なぜLinuxはスワップパーティションを必要としますか?物理メモリがいっぱいになると、一部のプロセスがハードドライブに外注され、新しいプロセスが仮想メモリから物理メモリにマップされます。

「仮想メモリ」物理メモリであり、「再マップ」されます。MMUハードウェアは、ストレージデバイスに直接マッピングできません。MMUは、あるべきではないメモリにアクセスしようとしたプロセスをカーネルに伝えるフォールトをスローできます。また、カーネルはこのメカニズムを使用して、プロセスがメモリ内にあると考えられるディスクから何かを戻すことを確認してから、「スワップ"。ポイントは、ハードウェアではなく、他のプロセスでページを使用できるようにページをディスクに保存することを決定するオペレーティングシステムです。


2

一般に、スワップパーティションは仮想メモリと等しくありません。

プロセスは実際の物理メモリよりも多くのメモリを必要とする可能性があるため、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

「スワップ」列には、スワップアウトと統計が表示されます。また、このリンクでは仮想メモリとその使用方法についても説明しvmstatています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.