仮想メモリがオペレーティング システムにおける最も重要な概念の 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高速ネットワーク」を構築しました
tmhhost は元旦に皆様に新年の贈り物をお送りします。ロサンゼルスの Anchang データセン...
この記事を書く前に、SEO コンサルタントは Baidu の公式ドキュメントを検索しましたが、ドメイ...
昨年12月、iPhone用のアルミ製充電スタンドを製作するプロジェクトが発表され、ネット上で大きな話...
過去20年間、インターネットは中国最大の経済的奇跡であり、最も多くの富を生み出した産業でした。しかし...
gigsgigscloudは、元旦に米国高防御VPSの30%割引プロモーションを提供しています。米国...
現在、企業の IT リーダーはさまざまなメリットを求めてクラウドに移行していますが、調査によると、ク...
外部リンクは、ウェブサイトのキーワードランキングを向上させる上で重要な要素です。検索エンジンは現在、...
colocrossing傘下のブランドであるchicagovps.netが、特別価格でいくつかの格安...
人々は常に百度と Google を比較することを好み、百度の検索アルゴリズムは Google よりは...
「インテルと中国聯通は、MEC エッジ コンピューティングとビデオの組み合わせに関する本格的なコラボ...
ライブストリーミングは、過去から未来への旅の途中の立ち寄り場所です。これまではテキスト、画像、音声、...
現在最も人気のアプリケーションはWeChatです。長い間QQの使い方を知らなかった超初心者でも簡単に...
IDC Review Network (idcps.com) は 5 月 13 日に次のように報告し...
コンテナとクラウド コンピューティングのテクノロジが成熟する一方で、企業の CTO は、すべてがスム...
Alibaba Cloudの現在のCloud Station特別プロモーションには、2Gメモリ、2コ...