ホームページ  >  記事  >  システムチュートリアル  >  Linuxの仮想メモリ、よく理解できましたか?

Linuxの仮想メモリ、よく理解できましたか?

WBOY
WBOY転載
2024-02-05 12:42:14929ブラウズ

######序文######

最近、グループ内で非常に楽しみにしている共有トピックがあります。それは「Linux 仮想メモリ」です。ある夜の残業中、仮想メモリの概念について話し合っていたところ、何人かの同僚が仮想メモリを十分に理解していないことに気づいたリーダーが、この同僚のために特別にこのトピックを取り上げました(笑)。 以前は、オペレーティング システムの概念についてはある程度理解していましたが、卒業後、大学での 4 年間のコンピュータ専攻が無駄になったと少し後悔しました。そこで、仕事が終わった後、NetEase Cloud Classroomでハルビン工業大学のオープンオペレーティングシステム授業を視聴したり、オペレーティングシステムの基本概念を解説した書籍「Linux Kernel Design and Implementation」を読んだりしました。さらに、昨年は C 言語を使用して簡単なサーバーを作成し、基礎となるシステムについてさらに学びました。この知識により、アプリケーション層をより深く理解できるようになり、最近のトラブルシューティングの際に非常に役立ちました。

数日前、別の同僚から仮想メモリに関する別の質問を受けましたが、仮想メモリに対する私の理解が十分に深くなく、いくつかの概念は矛盾していることに気づきました。そこで、次回はもっと流暢に実践できるようになりたいと考えて、いくつかの情報を調べて知識を再整理しました。

######起源######

仮想メモリ

仮想メモリがオペレーティング システムの最も重要な概念の 1 つであることは間違いありません。それは主に、システム全体におけるメモリの重要性によるものだと思います。 CPU は非常に高速ですが、能力が限られており、機能も単一であり、他の I/O ハードウェアはさまざまな高度な機能をサポートしていますが、CPU よりも遅いです。したがって、両者の間の緩衝剤として機能する潤滑剤が必要であり、ここで記憶が活躍します。

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

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

オペレーティング システムには 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 ビット

最も一般的な問題は 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 プロセスが大量の仮想メモリを占有していることがわかります。

Linuxの仮想メモリ、よく理解できましたか?

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

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

一般的な管理コマンド


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

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

システム メモリの状態を確認するには、さまざまな方法があります。freevmstat などのコマンドを使用して、現在のシステムのメモリの状態を出力できます。使用可能なメモリはこれは単なる空き列ではありません。オペレーティング システムの遅延特性により、プロセスが使用されなくなった後、大量のバッファ/キャッシュがすぐにクリアされません。以前にそれらを使用していたプロセスが再度使用され続ける場合は、 、必要に応じて使用することもできます。

さらに、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 までご連絡ください。