Linux システムの仮想メモリはまさに落とし穴です。

Linux システムの仮想メモリはまさに落とし穴です。

仮想メモリがオペレーティング システムにおける最も重要な概念の 1 つであることは間違いありません。

CPU は高速ですが、容量が小さく、機能が制限されています。他の I/O ハードウェアはさまざまな高度な機能をサポートしていますが、CPU と比較すると遅すぎます。したがって、それらの間には緩衝材として機能する潤滑剤が必要であり、ここでメモリが役に立ちます。

[[259430]]

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

上の図は、仮想メモリの最もシンプルで直感的な説明です。

オペレーティング システムには、物理​​メモリ (中央部分) と 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 は大容量メモリ用にマルチレベル ページ テーブルを設計しており、これによりメモリ消費をさらに削減できます。オペレーティング システムの仮想メモリから物理メモリへのマッピング テーブルは、ページ テーブルと呼ばれます。

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

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

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

関数

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

プロセスメモリ管理

主に以下の点でプロセスがメモリを管理するのに役立ちます。

メモリの整合性: プロセスに対する仮想メモリの「欺瞞」により、各プロセスは取得したメモリが連続したアドレスであると信じます。アプリケーションを作成するときに、大きなアドレス ブロックの割り当てを考慮する必要はありません。システムには十分な大きさのメモリ ブロックがあることを常に想定できます。

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

データ共有

仮想メモリを使用すると、メモリとデータを共有しやすくなります。

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

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

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

スワップ

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

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

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

よくある質問

仮想メモリについて学ぶときにも、多くの疑問がありました。

32 ビットと 64 ビット

最も一般的な問題は、32 ビットと 64 ビットです。

CPU は物理バスを介してメモリにアクセスするため、アクセス アドレスの範囲はマシン バスの数によって制限されます。 32 ビット マシンには 32 個のバスがあり、それぞれ高電位と低電位がビット 1 と 0 を表すため、アクセス可能な最大アドレスは 2^32 ビット = 4 GB になります。そのため、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 スレッド スタックは 1 MB の仮想メモリを占有します。 Linux でマルチスレッド プログラムが大量の仮想メモリを消費する理由を確認できます。

実際に占有されている物理メモリは、RES (resident) 列で確認できます。この列の値は、実際に物理メモリにマップされるサイズです。

一般的な管理コマンド

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

システムメモリの状態を確認する

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

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

ピマップ

特定のプロセスの仮想メモリの分布を個別に表示する場合は、pmap pid コマンドを使用できます。このコマンドは、各仮想メモリ セグメントの占有率を低アドレスから高アドレスまで一覧表示します。

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

メモリ構成を変更する

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

SWAP操作

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

vm.swappiness=0 を変更して、メモリがスワップをできるだけ使用しないように設定するか、swapoff コマンドを使用して SWAP を無効にすることができます。

<<:  大規模SDNクラウドコンピューティングデータセンターネットワークのアーキテクチャ設計

>>:  アリババは人工知能科学計算をサポートするためにグローバルハイパースケールデータセンター「RDMA高速ネットワーク」を構築しました

推薦する

200億ドルの価値を持つ小紅書は無事に離陸したのか?

11月8日、小紅書は5億ドルの新たな資金調達ラウンドを完了し、投資後の評価額は200億ドルを超えた。...

nexusbytes: 月額 3.25 ドル、KVM シリーズ大容量ハードディスク VPS、512m メモリ/2 コア/500g ハードディスク/5T トラフィック

アメリカの企業である Nexusbytes は、今年から事業を開始したと主張していますが、実際にはそ...

Rackburst - 1.49ポンド/256mメモリ/3g SSD/350g帯域幅

Rackburst は、ABPNI Computer Solutions Ltd の新しい VPS ...

ウェブサイトの構築と運営では、ユーザーのプライバシー保護に注意を払う必要があります

少し前に、ホテルの宿泊客の宿泊予約情報が漏洩し、大きな騒動となりました。それがシステムやウェブサイト...

アプリの宣伝は難しいですか?チャンネルはありませんか?人手がない?お金がない?全部言い訳だ!主な理由は、あなたがあまりにも怠惰だからです。

数日前、私は、 APP のプロモーションが困難に直面していること、そして起業家にとってそれがいかに困...

2024 年に向けてすべての企業が準備すべきクラウド コンピューティングの 10 大トレンド

2024 年には、企業は時間とコストを節約するためにクラウド移行の機会の先を見据えるようになります。...

周鴻毅はモバイル検索を展開する予定、老李は戦いに復帰

メディアのインタビューで「モバイル検索は短期的にはリリースされないだろう」と発言したことから、「モバ...

5Gは、国内のクラウドコンピューティング大手が国際的な大手を追い抜くための新たな跳躍台となるでしょうか?

クラウドコンピューティングは、新しいインフラストラクチャ基盤の重要なメンバーとして大きな注目を集めて...

Google サイトマップに関する知識

多くの友人は SEO 業界に参入したばかりで、「なぜ私のサイトのランキングはそれほど良くないのか」「...

ウェブサイト申請に関する私の個人的な体験談(パート2)

月収10万元の起業の夢を実現するミニプログラム起業支援プランウェブサイトの登録は、国内ホストを使用す...

企業にはクラウドが必要ですか?クラウドテクノロジーのユースケースと利点

企業にはクラウドが必要ですか?約8〜10年前、この問題はさまざまな規模や業種の企業の経営者やオーナー...

HardCloud - 非常に安価な Windows KVM VPS

Hardcloud は非常に新しいビジネスであり、一般的に言えばお勧めできません。ただし、公式が無料...