ホームページ  >  記事  >  システムチュートリアル  >  Linux 仮想メモリの原理を詳細に分析し、メモリ不足の問題に別れを告げます。

Linux 仮想メモリの原理を詳細に分析し、メモリ不足の問題に別れを告げます。

王林
王林転載
2024-02-09 13:21:31702ブラウズ

数日前、別の同僚が仮想メモリに関する別の質問をしに来ましたが、仮想メモリに対する私の理解が十分に深くなく、いくつかの概念が多少矛盾していることがわかりました。そこで、次回はよりスムーズに活用できるように、情報を調べて知識を再整理しました。

Linux 虚拟内存原理深度解析,从此告别内存不足问题!

つい最近、私が楽しみにしていたグループ内での別の共有が行われました。それは「Linux 仮想メモリ」です。ある夜の残業中に仮想記憶の概念について議論していたとき、同僚数名が仮想記憶についてよく理解していないことに気づいたリーダーが、この学生のために特別にテーマを選んでくれました(笑)。

私は以前にオペレーティング システムについていくつかの概念を学びました。主な理由は、卒業後、大学での 4 年間の時間を無駄にしていたことに腹を立てていたからです。コンピューター サイエンスのバックグラウンドを少し残念に感じたので、仕事後の時間をとって、 NetEase Cloud Classroom でハルビン工業大学のオペレーティング システムを読みました。公開授業では、オペレーティング システムについて比較的簡単に説明されている書籍「Linux カーネルの設計と実装」も読みました。昨年 C で簡単なサーバーを書いたとき, システムの基礎知識についても詳しく知ることができました。この知識のおかげで、アプリケーション層の知識をよりコントロールできるようになり、前回問題のトラブルシューティングを行うときにも役に立ちました。

数日前、別の同僚が仮想メモリに関する別の質問をしに来ましたが、仮想メモリに対する私の理解が十分に深くなく、いくつかの概念が多少矛盾していることがわかりました。そこで、次回はよりスムーズに活用できるように、情報を調べて知識を再整理しました。

仮想メモリの起源

仮想メモリがオペレーティング システムの最も重要な概念の 1 つであることは間違いありません。それは主に、記憶の重要な「戦略的位置」によるものだと思います。 CPU は高速ですが容量が小さく単機能であり、他の I/O ハードウェアはさまざまな機能をサポートしていますが、CPU に比べて遅すぎます。したがって、それらの間には緩衝剤として潤滑剤が必要であり、ここでメモリが機能します。

最新のオペレーティング システムでは、マルチタスクが標準です。マルチタスクの並列処理により CPU 使用率は大幅に向上しますが、同時に複数のプロセス間のメモリ操作の競合が発生するため、この問題を解決するために仮想メモリの概念が提案されました。

Linux 虚拟内存原理深度解析,从此告别内存不足问题!

上の図は、仮想メモリの最も単純かつ直感的な説明です。

オペレーティング システムには 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 のスペースが必要です。そのため、このテーブルは大きすぎて実際の物理アドレスさえも収まらないため、オペレーティング システムではページの概念が導入されています。

システムが起動すると、オペレーティング システムは物理メモリ全体を 4K 単位のページに分割します。将来メモリを割り当てる場合、単位はページになるため、物理メモリ ページに対応する仮想メモリ ページのマッピング テーブルが大幅に削減されます。4G メモリには 8M マッピング テーブルのみが必要です。一部のプロセスは仮想メモリを使用しません。 Linux では、マッピング関係を保存する必要があり、Linux では、ページを進めてメモリ消費を削減できる、大容量メモリ用のマルチレベル ページ テーブルも設計されています。オペレーティング システムの仮想メモリから物理メモリへのマッピング テーブルは、ページ テーブルと呼ばれます。

メモリのアドレス指定と割り当て

仮想メモリ メカニズムを通じて、各プロセスはすべてのメモリを占有していると認識していることがわかります。プロセスがメモリにアクセスすると、オペレーティング システムは、プロセスによって提供された仮想メモリ アドレスを物理アドレスに変換し、取得します。対応する物理アドレスのデータ。 CPU には、仮想メモリ アドレスを変換するために特別に使用されるメモリ管理ユニット MMU (Memory Management Unit) というハードウェアがあります。 CPU はページ テーブル アドレス指定のキャッシュ戦略も設定し、プログラムの局所性により、キャッシュ ヒット率が 98% に達することがあります。

上記の状況は、ページ テーブル メモリ内の仮想アドレスと物理アドレスのマッピングです。プロセスがアクセスする物理アドレスが割り当てられていない場合、システムはページ フォールト割り込みを生成します。割り込み処理中に、システムはカーネル状態に切り替わり、プロセス仮想アドレスによって物理アドレスが割り当てられます。

######関数######

仮想メモリは、メモリ アドレス変換を通じて複数のプロセス間のメモリ アクセスの競合の問題を解決するだけでなく、さらなる利点ももたらします。

プロセス メモリ管理

これは、プロセスがメモリを管理するのに役立ちます。主に次の点に反映されます。 メモリの整合性: プロセス上の仮想メモリの「欺瞞」により、各プロセスは取得したメモリが連続したアドレスであると認識します。アプリケーションを作成するとき、大きなアドレス ブロックの割り当てを考慮する必要はなく、システムには十分な大きなメモリ ブロックがあると常に考えます。

セキュリティ: プロセスがメモリにアクセスするときは、ページ テーブルを介してアドレス指定する必要があるため、オペレーティング システムは、ページ テーブルの各項目にさまざまなアクセス許可フラグを追加することで、メモリ許可制御を実装できます。

データ共有

仮想メモリを介してメモリとデータを共有するのが簡単になります。 プロセスがシステム ライブラリをロードするときは、常に最初にメモリの一部を割り当て、ディスク上のライブラリ ファイルをこのメモリにロードします。物理メモリを直接使用する場合、物理メモリ アドレスは一意であるため、システムがシステム ライブラリを見つけても、同じライブラリがシステムに2回ロードされていますが、各プロセスが指定するロードメモリが異なるため、システムは何もできません。

仮想メモリを使用する場合、システムはプロセスの仮想メモリ アドレスを、ライブラリ ファイルが配置されている物理メモリ アドレスに指定するだけで済みます。上の図に示すように、プロセス P1 と P2 の B アドレスは両方とも物理アドレス C を指します。

仮想メモリを使用して共有メモリを使用することも非常に簡単で、システムは各プロセスの仮想メモリ アドレスを、システムによって割り当てられた共有メモリ アドレスにポイントするだけで済みます。

######スワップ######

仮想メモリにより、プロセスはメモリを「拡張」できます。

仮想メモリは、ページ フォールト割り込みを通じてプロセスに物理メモリを割り当てると前述しましたが、メモリは常に制限されています。すべての物理メモリが占​​有されている場合はどうなるでしょうか?

Linux は SWAP の概念を提案しています。Linux では SWAP パーティションを使用できます。物理メモリが割り当てられているが、利用可能なメモリが不十分な場合、一時的に未使用のメモリ データが最初にディスクに配置され、必要なプロセスがそれを使用できるようになります。最初に、プロセスが再びそのデータを使用するのを待ちます。データを使用する必要がある場合、データはメモリにロードされます。この「スワッピング」テクノロジを通じて、Linux はプロセスがより多くのメモリを使用できるようにすることができます。

よくある問題

仮想メモリを理解する際にも、多くの疑問がありました。

32 ビットと 64 ビット

最も一般的な問題は 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 ユーザーはこのファイルを読み書きすることでメモリを直接操作できます。

JVM プロセスが占有する仮想メモリが多すぎます

TOP を使用してシステム パフォーマンスを表示すると、VIRT 列で Java プロセスが大量の仮想メモリを占有していることがわかります。

この問題の原因は、Java が Glibc の Arena メモリ プールを使用して大量の仮想メモリを割り当て、それを使用しないことです。さらに、Java によって読み取られたファイルも仮想メモリにマッピングされ、仮想マシンのデフォルト構成では、各 Java スレッド スタックが 1M の仮想メモリを占有します。詳細については、Linux のマルチスレッド プログラムが仮想メモリを大量に消費する理由を確認してください。

実際に占有される物理メモリは、RES (常駐) 列によって決まります。この列の値は、実際に物理メモリにマップされるサイズです。

一般的な管理コマンド

Linux 仮想メモリを自分で管理することもできます。

システムメモリステータスの表示

システム メモリのステータスを確認するには、さまざまな方法があります。Free、vmstat、およびその他のコマンドは、現在のシステム メモリのステータスを出力できます。使用可能なメモリは空き列だけではないことに注意してください。オペレーティングシステム、大量のバッファ/プロセスが使用されなくなっても、キャッシュはすぐにはクリアされませんが、以前に使用していたプロセスが再度使用し続けることができれば、必要なときにも使用できます。

さらに、cat /proc/meminfo を使用すると、ダーティ ページ ステータスなどを含むシステム メモリ使用量の詳細を表示できます。詳細については、/PROC/MEMINFO Mystery を参照してください。

pマップ

プロセスの仮想メモリの分布を個別に表示したい場合は、pmap pid コマンドを使用すると、下位アドレスから上位アドレスまでの各仮想メモリ セグメントの占有率が一覧表示されます。

-XX パラメータを追加すると、より詳細な情報を出力できます。

メモリ構成の変更

Linux システム構成を変更することもできます。sysctl vm [-options] CONFIG を使用するか、/proc/sys/vm/ ディレクトリ内のファイルを直接読み書きして、構成を表示および変更することもできます。

スワップ操作

仮想メモリの SWAP 機能は常に有益であるとは限りません。プロセスがメモリとディスク間で大量のデータを継続的に交換できるようにすると、CPU が大幅に占有され、システムの動作効率が低下するため、スワップを使用したくない場合があります。

vm.swappiness=0 を変更して、スワップの使用を最小限に抑えるようにメモリを設定するか、単純に swapoff コマンドを使用して SWAP を無効にすることができます。

######まとめ######

仮想メモリの概念は非常に理解しやすいですが、一連の非常に複雑な知識が得られます。この記事では、いくつかの基本原則についてのみ説明し、仮想メモリのアドレス指定における中間セグメント レジスタの使用法、キャッシュおよびバッファ アプリケーションを強化するためのオペレーティング システムの仮想メモリの使用法など、多くの詳細については省略します。機会があれば、それについては別途話します。

以上がLinux 仮想メモリの原理を詳細に分析し、メモリ不足の問題に別れを告げます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlxlinux.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。