######序文######
数日前、別の同僚から仮想メモリに関する別の質問を受けましたが、仮想メモリに対する私の理解が十分に深くなく、いくつかの概念は矛盾していることに気づきました。そこで、次回はもっと流暢に実践できるようになりたいと考えて、いくつかの情報を調べて知識を再整理しました。
######起源######仮想メモリ
オペレーティング システムには 1 つの物理メモリ (中央部分) と 2 つのプロセス (実際にはそれ以上) P1 と P2 があります。オペレーティング システムはそれぞれ P1 と P2 に、私のメモリはすべてあなたのものです、好きに使ってくださいと密かに伝えます。 、十分な注意が必要です。これらのメモリは P1 と P2 に与えられると言われていましたが、実際にはシリアル番号が与えられただけでした。 P1 と P2 が実際にこれらのメモリを使用し始めるときのみ、システムは動き回って、プロセス用のさまざまなブロックをつなぎ合わせ始めます。P2 は A メモリを使用していると考えていますが、実際には、メモリ B に静かにリダイレクトされています。 P1 と P2 が C メモリを共有している場合でも、それらは知りません。
オペレーティング システムのプロセスを欺くこの方法は、仮想メモリです。 P1 や P2 などのプロセスは、すべてメモリ全体を占有していると考えており、使用する物理メモリのアドレスを知りませんし、気にする必要もありません。
仮想メモリはオペレーティング システムの概念です。オペレーティング システムにとって、仮想メモリは比較テーブルです。P1 が A メモリ内のデータを取得するときは、物理メモリの A アドレスに移動して、そのデータを検索する必要があります。 B メモリ データは物理メモリの C アドレスに送られる必要があります。
システムの基本単位はバイトであることがわかっています。仮想メモリの各バイトが物理メモリのアドレスにマッピングされている場合、各エントリには少なくとも 8 バイトが必要です (32 ビット仮想アドレス -> 32 ビット物理アドレス) )、4G メモリの場合、比較テーブルを保存するには 32GB のスペースが必要です。そのため、このテーブルは大きすぎて実際の物理アドレスに適合しないため、オペレーティング システムは Page
という概念を導入します。
システムが起動すると、オペレーティング システムは物理メモリ全体を 4K 単位のページに分割します。将来メモリを割り当てる場合、単位はページになるため、物理メモリ ページに対応する仮想メモリ ページのマッピング テーブルが大幅に削減されます。4G メモリには 8M マッピング テーブルのみが必要です。一部のプロセスは仮想メモリを使用しません。 Linux では、マッピング関係を保存する必要があり、Linux では、ページを進めてメモリ消費を削減できる、大容量メモリ用のマルチレベル ページ テーブルも設計されています。オペレーティング システムの仮想メモリと物理メモリ間のマッピング テーブルは、ページ テーブル
と呼ばれます。
仮想メモリ メカニズムを通じて、各プロセスはすべてのメモリを占有していると認識していることがわかります。プロセスがメモリにアクセスすると、オペレーティング システムは、プロセスによって提供された仮想メモリ アドレスを物理アドレスに変換し、取得します。対応する物理アドレスのデータ。 CPU には一種のハードウェアがあり、メモリ管理ユニット MMU (メモリ管理ユニット)
は、仮想メモリ アドレスを変換するために特別に使用されます。 CPU はページ テーブル アドレス指定のキャッシュ戦略も設定し、プログラムの局所性により、キャッシュ ヒット率が 98% に達することがあります。
上記の状況は、ページ テーブル メモリ内の仮想アドレスから物理アドレスへのマッピングです。プロセスがアクセスする物理アドレスが割り当てられていない場合、システムは ページ欠落割り込み
を生成します。割り込み処理が行われると、システムはカーネル モードに切り替わり、物理アドレスをプロセスの仮想アドレスに割り当てます。
仮想メモリを介してメモリとデータを共有するのが簡単になります。
プロセスがシステム ライブラリをロードするときは、常に最初にメモリの一部を割り当て、ディスク上のライブラリ ファイルをこのメモリにロードします。物理メモリを直接使用する場合、物理メモリ アドレスは一意であるため、システムがシステム ライブラリを見つけても、同じライブラリがシステムに2回ロードされていますが、各プロセスが指定するロードメモリが異なるため、システムは何もできません。
仮想メモリを使用する場合、システムはプロセスの仮想メモリ アドレスを、ライブラリ ファイルが配置されている物理メモリ アドレスに指定するだけで済みます。上の図に示すように、プロセス P1 と P2 の B アドレスは両方とも物理アドレス C を指します。
仮想メモリを使用して共有メモリを使用することも非常に簡単で、システムは各プロセスの仮想メモリ アドレスを、システムによって割り当てられた共有メモリ アドレスにポイントするだけで済みます。
######スワップ######Linux は SWAP の概念を提案しています。Linux では SWAP パーティションを使用できます。物理メモリが割り当てられているが、利用可能なメモリが不十分な場合、一時的に未使用のメモリ データが最初にディスクに配置され、必要なプロセスがそれを使用できるようになります。最初に、プロセスが再びそのデータを使用するのを待ちます。データを使用する必要がある場合、データはメモリにロードされます。この「スワッピング」テクノロジを通じて、Linux はプロセスがより多くのメモリを使用できるようにすることができます。
よくある問題最も一般的な問題は 32 ビットと 64 ビットです。
CPU は物理バスを介してメモリにアクセスするため、アクセス アドレスの範囲はマシン バスの数によって制限されます。32 ビット マシンには 32 のバスがあります。各バスにはビットを表す高電位と低電位の 2 つの電位があります。それぞれ 1 と 0 の場合、アクセス可能な最大アドレスは 2^32 ビット = 4GB となるため、32 ビット マシンに 4G を超えるメモリを挿入することは無効であり、CPU は 4G を超えるメモリにアクセスできません。
ただし、64 ビット マシンには 64 ビット バスがなく、最大メモリはオペレーティング システムによって制限されており、Linux は現在最大 256G メモリをサポートしています。
仮想メモリの概念によれば、32 ビット システム上で 64 ビット ソフトウェアを実行することは問題ありませんが、システムの仮想メモリ アドレスの構造設計により、64 ビットの仮想アドレスは 32 ビット システムでは使用できません。 -ビットシステム。
Linux は、各デバイスを
/dev/ ディレクトリ内のファイルにマップします。これらのデバイス ファイルを通じてハードウェアを直接操作でき、メモリも例外ではありません。 Linux では、メモリ設定は
/dev/mem にマッピングされており、root ユーザーはこのファイルを読み書きすることでメモリを直接操作できます。
この問題の原因は、Java が Glibc の Arena メモリ プールを使用して大量の仮想メモリを割り当て、それを使用しないことです。さらに、Java によって読み取られたファイルも仮想メモリにマッピングされ、仮想マシンのデフォルト構成では、各 Java スレッド スタックが 1M の仮想メモリを占有します。詳細については、Linux のマルチスレッド プログラムが仮想メモリを大量に消費する理由を確認してください。
実際に占有される物理メモリは、RES
(常駐) 列によって決まります。この列の値は、実際に物理メモリにマップされるサイズです。
Linux 仮想メモリを自分で管理することもできます。
システム メモリの状態を確認するには、さまざまな方法があります。free
、vmstat
などのコマンドを使用して、現在のシステムのメモリの状態を出力できます。使用可能なメモリはこれは単なる空き列ではありません。オペレーティング システムの遅延特性により、プロセスが使用されなくなった後、大量のバッファ/キャッシュがすぐにクリアされません。以前にそれらを使用していたプロセスが再度使用され続ける場合は、 、必要に応じて使用することもできます。
さらに、cat /proc/meminfo
を通じて、ダーティ ページ ステータスなどを含むシステム メモリ使用量の詳細を表示できます。詳細については、/PROC/MEMINFO Mystery を参照してください。
プロセスの仮想メモリの分布を個別に表示したい場合は、pmap pid
コマンドを使用すると、下位アドレスから上位アドレスまでの各仮想メモリ セグメントの占有率が一覧表示されます。
-XX
パラメータを追加して、より詳細な情報を出力できます。
Linux システム構成を変更することもできます。sysctl vm [-options] CONFIG
を使用するか、/proc/sys/vm/
ディレクトリ内のファイルを直接読み書きして表示することもできます。設定を変更します。
仮想メモリの SWAP 機能は常に有益であるとは限りません。プロセスがメモリとディスク間で大量のデータを継続的に交換できるようにすると、CPU が大幅に占有され、システムの動作効率が低下するため、スワップを使用したくない場合があります。
vm.swappiness=0
を変更してスワップの使用を最小限に抑えるようにメモリを設定するか、単純に swapoff
コマンドを使用して SWAP を無効にすることができます。
以上がLinuxの仮想メモリ、よく理解できましたか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。