[Linuxの基本] -Linuxメモリマッピングmmapの主成分分析

私はいつもメモリマップトファイルの概念について非常に漠然としていて、それと仮想メモリの違いが何であるかわかりませんし、単語マッピングも非常に混乱しています。今日、私はついにそれを理解しました。以下では、最初に単語マッピングの理解について説明し、次にいくつかの紛らわしい概念を区別します。その後、メモリマッピングとは何かが非常に明確になります。


原理

まず、「マッピング」という言葉は、数学の授業で「1対1のマッピング」と同じ意味で、1対1の対応を確立します。ここでは、主にファイルの場所を指します。ハードディスクとプロセスの論理アドレス空間のサイズ。同じ領域間の1対1の対応は、図1のプロセス1に示されています。この対応は純粋に論理的な概念であり、プロセス自体の論理アドレス空間が存在しないため、物理的には存在しません。メモリマッピングのプロセスでは、実際のデータコピーはありません。ファイルはメモリにロードされませんが、論理的にメモリに配置されます。コードに固有の関連データ構造(struct address_space)が確立され、初期化されます。このプロセスこれはシステム呼び出しmmap()によって実装されるため、メモリマッピングを確立する効率は非常に高くなります。

                                                                           図1.メモリマッピングの原理

メモリマップの確立は実際のデータコピーを実行しないので、プロセスはどのようにしてメモリ操作を介して最終的にハードディスク上のファイルに直接アクセスできますか?これは、メモリマッピング後のいくつかの関連プロセスに依存します。

mmap()は、プロセスの論理アドレス空間内のアドレスを指すポインターptrを返すため、将来、プロセスはファイルの読み取りと書き込みのために読み取りまたは書き込みを呼び出す必要はなく、必要なのはptrを介してファイルを操作します。ただし、ptrが指すのは論理アドレスです。その中のデータを操作するには、図1のプロセス2に示すように、論理アドレスをMMUを介して物理アドレスに変換する必要があります。このプロセスは、メモリマッピングとは何の関係もありません。

前述のように、メモリマップの確立は実際にはデータをコピーしません。このとき、MMUはアドレスマッピングテーブルでptrに対応する物理アドレスを見つけることができません。つまり、MMUに障害が発生すると、ページフォールト割り込みが発生します。割り込み応答関数は、スワップ内の対応するページを検索します。ページが見つからない場合(つまり、ファイルがメモリに読み込まれたことがない場合)、マッピング関係を介してハードディスクからファイルを読み取ります。図1のプロセス3に示すように、mmap()によって物理メモリに確立されます。このプロセスは、メモリマッピングとは何の関係もありません。

データをコピーしていて、物理メモリが十分でないことがわかった場合、図1のプロセス4に示すように、一時的に使用されていない物理ページが仮想メモリメカニズム(スワップ)を介してハードディスクにスワップされます。このプロセスは、メモリマッピングとも関係ありません。

効果

コードの観点から、ハードディスクからメモリにファイルを読み取るには、データをファイルシステムを介してコピーする必要があり、データのコピー操作はファイルシステムとハードウェアドライバーによって実装されます。理論的には、コピーの効率データは同じです。しかし、メモリマッピングを介してハードディスク上のファイルにアクセスする方が、システムコールの読み取りまたは書き込みよりも効率的です。なぜですか。その理由は、read()はデータがコピーされるシステムコールであるためです。read()は、図2のプロセス1に示すように、最初にファイルの内容をハードディスクからカーネル空間のバッファーにコピーし、次に図に示すように、データをユーザースペースに送信するプロセス2では、このプロセスで2つのデータコピーが実際に完了します。mmap()はファイルをユーザースペースに直接マップするため、割り込み処理関数はファイルをユーザースペースから直接コピーします。このマッピング関係に従って、ハードディスクをユーザースペースに接続します。データのコピーは1つだけ作成されました。したがって、メモリマッピングの効率は読み取り/書き込みの効率よりも高くなります。

                                                                  図2.読み取りシステムコールの原理

次のプログラムは、ハードディスク上の「mmap_test」という名前のファイルを、readとmmapの2つの方法で操作します。ファイルには10,000個の整数があります。プログラムは、さまざまな方法を使用して2回読み取り、1を加算してから、書き戻します。ハードディスク。比較すると、読み取りにかかる時間はmmapの2〜3倍近くであることがわかります。

おすすめ

転載: blog.csdn.net/u014674293/article/details/106388822