Linux の仮想メモリと物理メモリを理解する

Linux の仮想メモリと物理メモリを理解する

[[286810]]

仮想メモリ:

理解の第一段階

1. 各プロセスにはそれぞれ独立した 4G のメモリ空間があり、各プロセスのメモリ空間は同様の構造になっています。

2. 新しいプロセスが作成されると、独自のメモリ空間が作成されます。このプロセスのデータとコードは、ディスクから独自のプロセス スペースにコピーされます。プロセス制御テーブル内の task_struct には、データとその場所が記録されます。 task_struct は、メモリ空間の割り当て、どのアドレスにデータがあるか、どのアドレスにデータがないか、どのアドレスが読み取り可能か、どのアドレスが書き込み可能かを記録するリンク リストを記録します。これらはすべて、このリンクされたリストを通じて記録できます。

3. 各プロセスに割り当てられたメモリ空間は、対応するディスク空間にマップされます。

質問:

コンピュータには明らかにそれほど多くのメモリがありません(n プロセスには n*4G が必要です)

プロセスを作成するには、ディスク上のプログラム ファイルをプロセスに対応するメモリにコピーする必要があります。 1 つのプログラムに対応する複数のプロセスの場合、メモリの無駄になります。

理解の第2レベル

1. 各プロセスの 4G のメモリ空間は仮想メモリ空​​間のみです。メモリ空間内のアドレスにアクセスするたびに、そのアドレスを実際の物理メモリ アドレスに変換する必要があります。

2. すべてのプロセスは同じ物理メモリを共有し、各プロセスは現在必要な仮想メモリ空​​間のみを物理メモリにマップして保存します。

3. プロセスは、メモリアドレスのどのデータが物理メモリ内にあるか、どのデータが物理メモリ内にないか、また物理メモリのどこにあるのかを知る必要があるため、ページテーブルを使用して記録する必要があります。

4. ページ テーブル内の各エントリは 2 つの部分に分かれています。最初の部分はページが物理メモリ内にあるかどうかを記録し、2番目の部分は物理メモリページのアドレス(ある場合)を記録します。

5. プロセスが仮想アドレスにアクセスすると、ページ テーブルを参照します。対応するデータが物理メモリ内に存在しないことが判明した場合、ページ フォールト例外が発生します。

6. ページ フォールト例外を処理するプロセスは、プロセスに必要なデータをディスクから物理メモリにコピーすることです。メモリがいっぱいで空き領域がない場合は、上書きするページを探します。もちろん、上書きされたページが変更されている場合は、このページをディスクに書き戻す必要があります。

要約:

アドバンテージ:

1. 各プロセスのメモリ空間は一貫して固定されているため、リンカーはデータの実際のメモリ アドレスを気にせずに実行可能ファイルをリンクするときにメモリ アドレスを設定できます。これは独立したメモリ空間を持つことの利点です。

2. 異なるプロセスが同じコード(ライブラリファイル内のコードなど)を使用する場合、物理メモリに保存できるのはコードのコピー1つだけであり、異なるプロセスは独自の仮想メモリをそれにマップするだけでよいため、メモリを節約できます。

3. プログラムが連続したメモリ空間を割り当てる必要がある場合、実際の物理メモリ内に連続した空間を割り当てる必要がなく、仮想メモリ空​​間内に連続した空間を割り当てるだけでよく、断片化を利用できます。

さらに、実際には、各プロセスが作成されてロードされると、カーネルはプロセスの仮想メモリ レイアウトのみを「作成」します。具体的には、プロセス制御テーブル内のメモリ関連のリンク リストを初期化します。実際、仮想メモリの対応する位置にあるプログラム データとコード (.text .data セグメントなど) は、すぐには物理メモリにコピーされません。仮想メモリとディスク ファイル間のマッピング (メモリ マッピングと呼ばれる) を確立するだけです。対応するプログラムを実行すると、ページ フォールト例外を介してデータがコピーされます。さらに、プロセスの実行中は、メモリを動的に割り当てる必要があります。たとえば、malloc を使用すると、仮想メモリのみが割り当てられます。つまり、この仮想メモリに対応するページ テーブル エントリがそれに応じて設定されます。プロセスが実際にこのデータにアクセスすると、ページ フォールト例外がトリガーされます。

追加の理解:

仮想メモリには、仮想ストレージスペース、ディスクスペース、メモリスペースの3つの概念が含まれます。

仮想空間はディスク空間にマッピングされている(実際には mmap を通じて必要に応じてディスク空間にマッピングされている)とみなされ、マッピング位置はページ テーブルによって記録されます。特定のアドレスにアクセスすると、ページ テーブル内の有効なビットを使用して、データがメモリ内にあるかどうかを判断できます。そうでない場合、ディスク上の対応するデータはページ フォールト例外を通じてメモリにコピーされます。空きメモリがない場合は、犠牲ページが選択され、他のページが置き換えられます。

mmap は、仮想空間からディスク空間へのマッピングを確立するために使用されます。仮想空間アドレスをディスク ファイルにマップできます。このアドレスが設定されていない場合は、システムによって自動的に設定されます。この関数は、対応するメモリ アドレス (仮想アドレス) を返します。このアドレスにアクセスするときは、ディスク上の内容をメモリにコピーしてから、読み取りまたは書き込みを行う必要があります。最後に、manmap を使用すると、メモリ上のデータをディスクにスワップし直すことができます。つまり、仮想空間とメモリ空間のマップを解除することができます。これはディスクファイルの読み書きの方法であり、データ共有メモリを共有するプロセスの方法でもある。

物理メモリ:

カーネル モードでメモリを適用する方が、ユーザー モードでメモリを適用するよりも直接的です。ユーザー モードの遅延メモリ割り当てテクノロジは使用しません。カーネルは、カーネル関数がメモリを要求すると、その要求は直ちに満たされる必要があり、その要求は正確かつ合理的でなければならないと考えています。逆に、ユーザー モードのメモリ要求の場合、カーネルは常に物理メモリの割り当てを延期しようとします。ユーザー プロセスは常に最初に仮想メモリ領域を使用する権利を取得し、最後にページ フォールト例外を通じて実際の物理メモリを取得します。

1. 物理メモリのカーネルマッピング

IA32 アーキテクチャでは、カーネル仮想アドレス空間のサイズは 1GB (3GB から 4GB) しかないため、1GB の物理メモリ (つまり、コンベンショナル メモリ) はカーネル アドレス空間に直接マップできますが、1GB を超える物理メモリ (つまり、ハイエンド メモリ) はカーネル空間にマップできません。このため、カーネルはすべての物理メモリを使用できるようにするために、次のアプローチを採用しています。

1)。ハイエンド メモリはカーネル空間に完全にマップできません。つまり、これらの物理メモリには対応する線形アドレスがありません。ただし、カーネルは各物理ページ フレームに対応するページ フレーム記述子を割り当て、すべてのページ フレーム記述子は mem_map 配列に格納されるため、各ページ フレーム記述子の線形アドレスは固定されます。これらの関数はページ フレーム記述子の線形アドレスを返すため、カーネルは alloc_pages() と alloc_page() を使用して高メモリを割り当てることができるようになりました。

2)。カーネル アドレス空間の最後の 128 MB は、ハイエンド メモリをマップするために特別に使用されます。そうしないと、線形アドレスのないハイエンド メモリにカーネルがアクセスできなくなります。これらのハイエンド メモリのカーネル マッピングは明らかに一時的にマッピングされており、そうでない場合は 128 MB のハイエンド メモリしかマッピングできません。カーネルがハイエンド メモリにアクセスする必要がある場合、この領域のアドレスを一時的にマップし、使用後に他のハイエンド メモリをマップするために使用します。

ハイエンドメモリはカーネルにマップする必要があるため、直接マップできる物理メモリサイズは 896MB のみであり、この値は high_memory に保存されます。カーネル アドレス空間の線形アドレス範囲を次の図に示します。

図からわかるように、カーネルは、永続カーネル マッピング、固定マッピング、vmalloc メカニズムの 3 つのメカニズムを使用して、ハイエンド メモリをカーネル空間にマッピングします。

2. 物理メモリ管理メカニズム

カーネル空間における物理メモリのマッピング原則に基づいて、物理メモリの管理方法も異なります。カーネル内の物理メモリ管理メカニズムには、主にバディ アルゴリズム、スラブ キャッシュ、vmalloc メカニズムが含まれます。バディ アルゴリズムとスラブ キャッシュはどちらも物理メモリ マッピング領域に物理メモリを割り当てますが、vmalloc メカニズムはハイエンド メモリ マッピング領域に物理メモリを割り当てます。

パートナーアルゴリズム

バディ アルゴリズムは、ページ フレームを基本単位として、連続した物理メモリの大きなブロックの割り当てと解放を担当します。このメカニズムにより、外部の断片化を回避できます。

CPUごとのページフレームキャッシュ

カーネルは単一ページ フレームを頻繁に要求および解放します。このキャッシュには、ローカル CPU によって発行された単一ページ フレーム要求を満たすために事前に割り当てられたページ フレームが含まれています。

スラブキャッシュ

スラブ キャッシュは、物理メモリの小さなブロックの割り当てを担当し、カーネル内で頻繁に割り当ておよび解放されるオブジェクトのキャッシュとしても機能します。

vmalloc メカニズム

vmalloc メカニズムにより、カーネルは連続した線形アドレスを通じて非連続の物理ページ フレームにアクセスできるようになるため、ハイエンドの物理メモリを最大限に活用できます。

3. 物理メモリの割り当て

カーネルがメモリアプリケーションの要求を発行すると、カーネル関数呼び出しインターフェイスに応じて異なるメモリアロケータが有効になります。

3.1 パーティションページフレームアロケータ

ゾーン ページ フレーム アロケータは、連続するページ フレームのメモリ割り当て要求を処理します。パーティション ページ フレーム マネージャーは、以下に示すように、フロントエンド管理領域ディストリビューターとパートナー システムの 2 つの部分に分かれています。

管理領域アロケータは、要求されたページ フレーム ブロック サイズを満たす管理領域を検索する役割を担います。各管理領域において、具体的なページフレームの割り当て作業はパートナーシステムの責任となります。より優れたシステム パフォーマンスを実現するために、単一のページ フレームの適用は、CPU ごとのページ フレーム キャッシュを通じて直接実行されます。

アロケータはいくつかの関数とマクロを通じてページ フレームを要求します。それらの間のカプセル化関係を下図に示します。

これらの関数とマクロは、コア割り当て関数 __alloc_pages_nodemask() をカプセル化して、さまざまな割り当て要件を満たす割り当て関数を形成します。このうち、alloc_pages() シリーズの関数は物理メモリのホーム フレーム記述子を返し、__get_free_pages() シリーズの関数はメモリのリニア アドレスを返します。

3.2 スラブアロケータ

スラブ アロケータは、もともと物理メモリの内部断片化を解決するために提案されました。カーネル内でよく使用されるデータ構造をオブジェクトとして扱います。スラブ アロケータは、オブジェクトのタイプごとにキャッシュを作成します。カーネルはこのキャッシュ内のオブジェクトを割り当て、解放します。オブジェクトのスラブ アロケータ構造は次のとおりです。

各オブジェクトのキャッシュは複数のスラブで構成され、各スラブは複数のページ フレームで構成されていることがわかります。スラブ アロケータは 1 ページ フレームよりも小さいメモリ ブロックを割り当てることができますが、必要なメモリはすべてバディ アルゴリズムによって割り当てられます。

スラブ キャッシュは、専用キャッシュと一般キャッシュに分かれています。専用キャッシュは、メモリ記述子などの特定のオブジェクト用に作成されたキャッシュです。一般キャッシュは一般的な状況向けであり、任意のサイズの物理メモリを割り当てるのに適しています。そのインターフェースは kmalloc() です。

3.3 非連続メモリ領域におけるメモリ割り当て

カーネルは、vmalloc() を通じて非連続の物理メモリを申請します。アプリケーションが成功した場合、関数は連続メモリ領域の開始アドレスを返します。それ以外の場合は NULL を返します。 vmalloc() と kmalloc() によって要求されるメモリは異なります。 kmalloc() によって要求されるメモリのリニア アドレスと物理アドレスは連続していますが、vmalloc() によって要求されるメモリのリニア アドレスは連続しており、物理アドレスは離散的です。 2 つのアドレスはカーネル ページ テーブルを通じてマップされます。

vmalloc() の動作は簡単に理解できます。

1)。新しい連続した線形アドレス空間を見つけます。

2)。連続していないページ フレームのセットを順番に割り当てます。

3)。線形アドレス空間と非連続ページ フレーム間のマッピング関係を確立します。つまり、カーネル ページ テーブルを変更します。

vmalloc() のメモリ割り当て原理は、ユーザー モードでのメモリ割り当てと似ています。どちらも、個別の物理メモリにアクセスするために連続した仮想メモリを使用し、仮想アドレスと物理アドレスはページ テーブルを介して接続されます。このようにして、物理メモリを効率的に使用することができます。ただし、vmalloc() が物理メモリを要求すると、カーネルはこのメモリ割り当て要求を正当かつ緊急であると見なすため、すぐに割り当てられることに注意してください。逆に、ユーザー モードでメモリ要求があった場合、カーネルは常にそれを可能な限り延期します。結局のところ、ユーザー モードとカーネル モードは同じ特権レベルではないからです。

<<:  2020 年のクラウド コンピューティングの予測: セキュリティ、AI、Kubernetes など

>>:  分散システムのRedisマスタースレーブアーキテクチャ

推薦する

クラウド ネイティブ モードでマルチノード Minio 分散ファイル システムを構築および最適化する方法を説明する 20 枚の写真

みなさんこんにちは、Bingheです〜〜 Minio は、分散ストレージ システムの構築に適したオー...

cloudcone - KVM 仮想 VPS、512 RAM、月額 1.99 ドル、IP 変更はわずか 0.50 ドル

Cloudcone は、あまり紹介する必要もなく、ホストキャットに何度も登場しており、主な事業は K...

ftpit-$5/KVM/768m メモリ/2 コア/35g ハードディスク/2T トラフィック/incero Dallas

ftpit は、主に VPS 事業を行っている小規模な民間企業です。各 VPS には、Intel S...

米国のフラッシュセールサイトFabは、立ち上げから6か月で120万人のユーザーと2億ドルの評価額を獲得した。

フラッシュセールを理解するには、まず一連の数字を見てみましょう。Fab.com という Web サイ...

iOS12のリリース後、これらのモデルはよりスムーズに動作し、バッテリー寿命も向上しました。

月収10万元の起業の夢を実現するミニプログラム起業支援プラン本日、iOS12の正式版がついにアップデ...

SEOの企業採用要件とSEOアイデア

現在、多くの企業がSEOの必要性を認識し、電子商取引の甘さを味わっています。Baidu入札とGoog...

インターネットマーケティングの専門家、陳千万氏:精密マーケティングに必要な3つのステップ

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますマーケティ...

自然、実用主義、責任が2012年のSEOに対する私の理解を構成しています

2012 年が過ぎようとしています。2013 年という新しい年を迎え、ウェブマスターの皆さんは将来に...

server-factory: オランダの VPS、年間 9 ユーロから、ギガビット帯域幅、AMD EPYC+Ryzen+DDR4+NVMe

新しいブランドである server-factory はドイツ人によって運営されており、オランダの S...

Namesilo - 6.00 ドル (通常価格) / 5.8.00 ドル (通常価格)

namesilo は、目標達成 (年間管理するドメイン名の数が前年の「何とも言えない」数倍) を記念...

企業情報化の集中構築は分散ユニットアーキテクチャに戻るべきである

この記事はWeChatの公開アカウント「Ren Yue Liao IT」から転載したもので、著者は何...

国内外の株式型クラウドファンディングプラットフォームに関する議論

1 か月前、私は起業家向けクラウドファンディングの 3 つのモデル、つまり証明書ベース、メンバーシッ...

#無制限トラフィック VPS# solvps-$13/1g メモリ/20g SSD/G ポート/Windows 2003/08/12/16

solvps は、Maya Virtual, Inc. の VPS ブランドです。中価格帯で、Xen...

中国のクラウドコンピューティング市場が急成長、国内ソフトウェア代替の傾向が顕著に

中国は10年以上も前から、国内データベースなどの独立した知的財産権とエコシステムの構築を始めていた。...

クラウドコンピューティングは AI を民主化するための鍵となるのでしょうか?

日本の収穫期には、農家の中には毎日多くの時間を費やして、農場で収穫したキュウリを種類ごとに仕分けする...