目次
上の図は、仮想メモリの最も単純かつ直感的な説明です。 " >上の図は、仮想メモリの最も単純かつ直感的な説明です。
ページングとページテーブル" >ページングとページテーブル
メモリのアドレス指定と割り当て" >メモリのアドレス指定と割り当て
データ共有" >データ共有
32 ビットと 64 ビット" >32 ビットと 64 ビット
物理メモリを直接操作する " > 物理メモリを直接操作する
一般的な管理コマンド" >一般的な管理コマンド
システムメモリステータスの表示" >システムメモリステータスの表示
pマップ" >pマップ
メモリ構成の変更" >メモリ構成の変更
スワップ操作" >スワップ操作
仮想メモリの概念は非常に簡単に理解できますが、一連の非常に複雑な知識が得られます。この記事では、いくつかの基本原則についてのみ説明し、仮想メモリのアドレス指定における中間セグメント レジスタの使用法、キャッシュおよびバッファ アプリケーションを強化するためのオペレーティング システムの仮想メモリの使用法など、多くの詳細については省略します。機会があれば、それについては別途話します。 " >仮想メモリの概念は非常に簡単に理解できますが、一連の非常に複雑な知識が得られます。この記事では、いくつかの基本原則についてのみ説明し、仮想メモリのアドレス指定における中間セグメント レジスタの使用法、キャッシュおよびバッファ アプリケーションを強化するためのオペレーティング システムの仮想メモリの使用法など、多くの詳細については省略します。機会があれば、それについては別途話します。
ホームページ システムチュートリアル Linux Linuxの仮想メモリ、よく理解できましたか?

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

Feb 05, 2024 pm 12:42 PM
linux Linuxチュートリアル Linuxシステム Linuxコマンド シェルスクリプト 埋め込みLinux 良い約束 Linux を始める Linux学習

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

最近、グループ内で非常に楽しみにしている共有トピックがあります。それは「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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Linuxアーキテクチャ:5つの基本コンポーネントを発表します Linuxアーキテクチャ:5つの基本コンポーネントを発表します Apr 20, 2025 am 12:04 AM

Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

GITの倉庫アドレスを確認する方法 GITの倉庫アドレスを確認する方法 Apr 17, 2025 pm 01:54 PM

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。

Linuxの主な目的は何ですか? Linuxの主な目的は何ですか? Apr 16, 2025 am 12:19 AM

Linuxの主な用途には、1。Serverオペレーティングシステム、2。EmbeddedSystem、3。Desktopオペレーティングシステム、4。開発およびテスト環境。 Linuxはこれらの分野で優れており、安定性、セキュリティ、効率的な開発ツールを提供します。

Apr 16, 2025 pm 07:39 PM

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

コードを書いた後に崇高に実行する方法 コードを書いた後に崇高に実行する方法 Apr 16, 2025 am 08:51 AM

Sublimeでコードを実行するには6つの方法があります。ホットキー、メニュー、ビルドシステム、コマンドライン、デフォルトビルドシステムの設定、カスタムビルドコマンド、プロジェクト/ファイルを右クリックして個々のファイル/プロジェクトを実行します。ビルドシステムの可用性は、崇高なテキストのインストールに依存します。

Laravelインストールコード Laravelインストールコード Apr 18, 2025 pm 12:30 PM

Laravelをインストールするには、これらの手順を順番に進みます。コンポーザー(MacOS/LinuxとWindows用)インストールLaravelインストーラーをインストールします。

vscodeの使用方法 vscodeの使用方法 Apr 15, 2025 pm 11:21 PM

Visual Studio Code(VSCODE)は、Microsoftが開発したクロスプラットフォーム、オープンソース、および無料のコードエディターです。軽量、スケーラビリティ、および幅広いプログラミング言語のサポートで知られています。 VSCODEをインストールするには、公式Webサイトにアクセスして、インストーラーをダウンロードして実行してください。 VSCODEを使用する場合、新しいプロジェクトを作成し、コードを編集し、コードをデバッグし、プロジェクトをナビゲートし、VSCODEを展開し、設定を管理できます。 VSCODEは、Windows、MacOS、Linuxで利用でき、複数のプログラミング言語をサポートし、マーケットプレイスを通じてさまざまな拡張機能を提供します。その利点には、軽量、スケーラビリティ、広範な言語サポート、豊富な機能とバージョンが含まれます

GITソフトウェアのインストール GITソフトウェアのインストール Apr 17, 2025 am 11:57 AM

GITソフトウェアのインストールには、次の手順が含まれています。インストールパッケージをダウンロードしてインストールパッケージを実行して、インストール構成gitインストールgitバッシュ(Windowsのみ)を確認します

See all articles