仮想メモリがオペレーティング システムにおける最も重要な概念の 1 つであることは間違いありません。 CPU は高速ですが、容量が小さく、機能が制限されています。他の I/O ハードウェアはさまざまな高度な機能をサポートしていますが、CPU と比較すると遅すぎます。したがって、それらの間には緩衝材として機能する潤滑剤が必要であり、ここでメモリが役に立ちます。
現代のオペレーティング システムでは、マルチタスクが標準になっています。マルチタスクを並列に実行すると 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高速ネットワーク」を構築しました
漠然とした内容のSEO記事と、正確で詳細な内容のSEO記事の違いについて簡単に説明します。私はインタ...
著者 |シンシンAlibaba Cloud Quick BI は、柔軟なパブリッククラウド展開、プラ...
中国の自動運転市場が年々熱を帯び、産業政策の支援が継続的に増加し、インフラ建設が継続的に改善され、新...
私は重慶のウェディング写真ウェブサイトの SEO を 3 か月間行っており、「コンテンツが王様」であ...
[[443167]] 0. はじめにクラウドネイティブ!ついに来ました。クラウドが将来のデジタル世界...
Ganji.comは共同購入事業をWoWotuanに売却したが、アナリストらはこれを「負担の解消」と...
多くの組織にとって、2018 年のクラウドに関する最重要の取り組みは、クラウド支出の最適化です。しか...
[51CTO.com からのオリジナル記事] クラウド ネイティブは、現在のあらゆるテクノロジー カ...
10w+ とはどういう意味ですか?新しいメディア環境が成熟するにつれ、ヒット商品を生み出す手法も確立...
はるか北極圏にあるスヴァールバル諸島の「最後の審判」種子貯蔵庫には、世界中から集められた何百万もの作...
タイトル通りです! Hostcat の閲覧に慣れているユーザーは、「119083232」を直接追加し...
2日前、パーフェクトワールドがシャンダゲームズの株式を買収するというニュースが出た時、私はその発表を...
フォーチュン誌によって世界のトップ500にランクされているウォルマートは、世界で最初に「ワンストップ...
みなさんこんにちは。今日はキーワードを深く掘り下げる方法についてお話します。自分に合ったキーワードを...
2012年、タイガースは休むことなく、競争はさらに激しくなるだろう。業界のリーダーであっても、常に最...