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マスタースレーブアーキテクチャ

推薦する

Hujiang.com の教育方法: オンライン スクールはビデオだけではない

文 | CBN記者 ゾウ・トン、インターン記者 ソン・ジン3年前、Hujiang.comの創設者であ...

関連性の高い外部リンクの重み値が高い理由を分析する2つの側面

外部リンクはウェブサイトの最適化に欠かせない要素であるため、多くの友人が外部リンクに興味を持っている...

アンカーテキストを正しく設定してウェブサイトの重量を着実に改善する

ウェブマスターは一日中ウェブサイトの構築に取り組んでいますが、彼らが最も気にするのはウェブサイトの重...

クラウドプロバイダーが教えてくれないクラウドアーキテクチャに関する3つの秘密

[51CTO.com クイック翻訳] 最適化されたアーキテクチャはありますか?つまり、ソリューション...

2020年:世界のクラウドコンピューティングにおける11の主要年間トピックのレビュー

毎年、整理し、まとめ、努力し、そしてまた始める必要があります。 2020年、今年はさらに振り返る価値...

kirincomm: 50%割引、日本ソフトバンク回線クラウドサーバー、200Mbps帯域幅、月額44元から

Hostcatは、主に日本の東京(Equinix、COLT)と大阪(Equinix)データセンターで...

ビットコイン価格が1ヶ月で40%近く下落、仮想通貨熱がリスクを生む

ビットコイン、ライトコイン、元宝コインのいずれにしても、国内市場での熱狂的な投機の時期と監督強化の後...

ニュースソースを使用してウェブサイトを最適化する際に避けるべき問題の簡単な分析

ウェブサイトの外部リンクの最適化がますます困難になるにつれて、低コストで高品質の外部リンクを取得する...

ホームページがないのに、Baidu 検索エンジンからの何十万ものトラフィックはどこから来るのでしょうか?

「10日間で体重7を減らす神話を解読する」という記事を読みました。記事で言及されているウェブサイトに...

SEO に関する 4 つのよくある誤解の分析 (パート 3)

最初の 2 つの章では、SEO に関する 4 つのよくある誤解を紹介しました。具体的なアドレスは、h...

レシピウェブサイトのコンテンツを作成するいくつかの方法についてお話ししましょう

レシピ ウェブサイトのコンテンツを最新かつ優れたものにするにはどうすればよいでしょうか。著者は、ウェ...

皆さん、SEOを正しく理解してください

実は、これは長い間私の心の中に抑え込まれていた考えであり、今日はそれを皆さんと議論するために持ち出さ...

百度ランキングにおけるさまざまな要素の割合についての簡単な議論

最近、インターネットで百度ランキングにおけるさまざまな要素の割合についての記事をたくさん見つけました...

中国のカレンダーメーカー、秦涛:他社が評価しない製品をゼロから1億元の製品に変える方法

はじめに: 私たちは、当時誰も関心を持っていなかった市場に参入し、非常に小さな市場セグメントに 2 ...

SEO 技術と SEO 雇用開発の見通しはどうですか?

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