仮想メモリの概念は、RAMの物理アドレスと一致しない仮想アドレス空間を作成することである。システムはディスクにメモリのフルコピーを保存し、最も頻繁に使用されるデータのみをRAMにキャッシュします。これを実現可能にするために、仮想メモリを次のように分割します。ページ;一般的なページサイズは4KBです。また、RAMを次のように分割します。ページフレーム、それぞれはページと同じサイズで、仮想メモリ内のすべてのページを収容する準備ができています。
Linuxシステムを実行していますが、メインメモリに十分なスペースがあるため、スワップ領域は空です。つまり、ページ付きの仮想メモリがまだ存在し、プロセスはメインメモリ内のそのセグメントの物理アドレスではなく仮想アドレスを持続しますか?
ディスクにスワップ領域がない場合、システムにも仮想メモリがありますか?
つまり、Linuxシステムでは仮想メモリを常に使用できますか?プロセスには常に仮想アドレスがありますか?
答え1
仮想メモリ(ページング)はCPUレベルで有効になります。これは、CPUがMMUを使用して仮想アドレス(アプリケーションに示すように)を物理アドレスに変換することを意味します。メモリはページに分割されます。ページはメモリにロードしたり、ディスクにロードしたりできます。ページがディスク上にある場合、ページにアクセスすると、オペレーティングシステムが処理するページエラーが発生します(オペレーティングシステムはディスクからページをロードします)。
したがって、スワップがなければ、まだ仮想メモリがあり、CPUはまだMMUを使用し、メモリをページに分割しますが、OSはそのページをディスクに移動できません。
答え2
いいえ。
user996142が述べたように、仮想アドレス空間の2つがあります。しかし、あなたの質問に示されている定義は、スワップスペースをより具体的に説明します。それにもかかわらず、私は両方のステートメントは非常に謎だと思います。
CPUレベルで仮想メモリアドレスを持つにはMMUが必要です。他のユーザが述べたように、コンピュータは、所与の物理アドレスに物理メモリを有する。ほとんどの場合、物理メモリはゼロから始まり、保持している合計メモリ量まで徐々に増加します。一部のアーキテクチャでは、最後にもメモリを持ちたい(アドレス-1、-2、-3...)。すべてのCPUにMMUチップはありません。特に組み込みシステムではさらにそうです。これらのシステムの中には、実際にはMMUが利用できない状態で8ビットCPUを使用しています(これらのシステムでは、とにかくまたはアドレス指定可能なメモリが64Kbに制限されています)。
システムレベルでは、仮想メモリは言及したスワップ領域です。繰り返しますが、必ずしも使用できるわけではありません。ほとんどのLinuxディストリビューションでは、インストール中にスワップ領域が自動的に作成されます。ただし、一部のシステムはこの操作を自動的に実行しません(DigitalOceanが提供するUbuntuシステムはデフォルトではスワップスペースを提供しません...)。ほとんどの場合、スワップ領域を確保することは、プロセスが復元されるのを防ぐのに役立ちます。オペレーティングシステム固有のRAM(それで、何が起こったのかわかりません)。
カーネルはこれらすべてを管理する役割を担います。
MMU部分は非常に低いレベルです。ほとんどの実装では、プロセスをLinuxで実行する必要があります。その機能がなければ、どこでも実行できるプロセスが必要か(68Kプロセッサを実行する古いMacでは面白いことであり、メモリのどこにでも配置できる〜64Kbのコードチャンクを生成することになる)、プロセスを再配置できる方法が必要です。 ...
メモ: しばらくの間、Linuxカーネルは再起動するたびに同じIPアドレスでプロセスを実行しないように更新されました。自分のプロセスをデバッグしようとしていて、このような静的IPアドレスに依存したい場合は、これは本当に迷惑です。しかし、これはより安全です。しかし、MMUだけではプロセスを実行するのに十分ではないことがわかりました。その時点で、カーネルが選択したIPに従って再起動するたびに再配置する必要があります。
Exchangeは、エクスプロイトを実行できる非常に高い階層です。より多くのメモリディスクにいくつかのデータを保存するよりも、コンピュータに多くのデータがあります。もちろん、スピードの面で大きなペナルティがあります。ほとんどの場合、1つのプロセスを実行する方が良いです。プロセスが完了したら、次のプロセスを実行するなどの作業を続けてディスクへの交換を防ぎます。
重要な側面は、プロセスのコード(PythonやPHPなどの解釈された言語のアセンブリコードはインタプリタバイナリになる)が変更されず、ディスク上で読み取り専用モードで使用できることです。つまり、プロセスコードの一部を交換し、後で必要に応じてRAMの交換データを大きく失うことなく再ロードできるという意味です。データをディスクに書き込む必要がありますが、遅くなります。コードを読んでください。したがって、プロセスコードの一部が実行されていない場合、後で再度実行されると、そのコードページを置き換えて非常にすばやくリロードできます。このスワップにはスワップディスクやスワップファイルは必要ありません。したがって、スワップスペースが0Kbであっても、カーネルは実行中のプロセスのコードをスワップして一部のRAMを節約できます。
答え3
Linuxがメモリ管理デバイス(MMU)を搭載したCPUで実行されている場合、仮想メモリは常に使用されます。
ここで、「仮想メモリ」という用語は、2つの互いに絡み合った意味を有する。これは、物理メモリに対応する場合とそうでない場合があるプロセス内のメモリアドレスの仮想割り当てを意味する可能性があります。ディスクブロックをプロセス仮想メモリにマッピングして、物理的に利用可能なRAM以上にメモリスペースを拡張するディスクブロックを参照することもできます。
Linux(および通常Unix)はリクエストページングです。つまり、ページは要求時にディスクからロードされるか、使用可能なメモリプールから割り当てられます。
処理中のページは、複数のソースから複数の状態にある可能性があります。
- 実行可能ページは、ディスク上のプログラムまたは共有ライブラリに関連付けられている可能性が高いです。ディスクにページコピーがあり、物理メモリにページの(読み取り専用)コピーがある可能性があります。これらのページは、関連ファイルを使用するすべてのプロセスで共有(読み取り専用)できます。
- プロセスのデータページは物理RAMに配置できます。メモリに入っていると、きれいになったり汚れたりすることがあります。クリーンアップされたデータページにはスワップ領域にコピーがあります(必要に応じて解放できます)。ダーティページには、スワップにコピーがないか、ページが変更されました(そしてスワップページは解放されました)。物理メモリにコピーなしで交換することもできます。
- ディスク上のファイルはプロセスの仮想メモリにマッピングできます。実行可能ページは、前述のように読み取り専用にマップされます。ただし、書き込み可能ファイルをデータページにマップし、スワップ領域の代わりにファイルに保存することもできます。マップされたデータページが汚れた場合、機会に応じてファイルにすばやく書き戻されます。上記のようにマップされたページはディスクにのみ配置することも、RAMにコピー(クリーンまたはダーティ)することもできます。
- ページは仮想メモリに割り当てることができますが、物理RAMまたはディスクには対応するデータはありません。これは、プロセスがより多くのメモリを要求したが(まだ?)メモリを使用しない場合に発生します。そのようなページを読むと、ゼロが返されます。書き込みは物理ページをゼロにし、プロセスに割り当てられてから書き込みを完了します。 (またはこれが不可能な場合、メモリ不足エラーのためプロセスは終了します。)
したがって、スワッピングなしで初期化されていない空のページ、実行可能ページ用の仮想(非物理)メモリがまだ存在し、マッピングされたデータページも存在する可能性があります。さらに、物理メモリは、ディスクがサポートされているかどうかにかかわらず、仮想メモリ内に含まれる。
違いは、スワップがないと、システムメモリが不足しているときに読み取り専用ページが他のページをロードするために頻繁にフラッシュされ、ファイルに関連付けられていない限り(マッピングされているかどうかにかかわらず)、ダーティページは行く場所がなく物理的に存在することです。ロックされたメモリ。
プロセスの仮想メモリに割り当てられていないディスクファイルのキャッシュされたページもありますが、仮想メモリシステムはまだ関連しているため、操作は少し簡単になります。また、実装の詳細によっては、上記の操作の一部の順序が異なるように指定される場合があります。
以前のUNIXシステムでは、すべての物理メモリページをサポートするのに十分なスワップスペースが必要であるため、スワップスペースは通常RAMサイズの2倍以上です。 Linuxはずっと前にこの戦略を放棄しており、交換は不要です。