1

次のリンクでメモリマッピングについて読みました
https://en.wikipedia.org/wiki/Memory-mapped_file
http://en.wikipedia.org/wiki/Memory-mapped_I/O

ファイルとデバイスのマッピングに使用されます。ファイルのマッピングは、ディスク/フラッシュから直接読み取るよりも高速であるという利点があると述べています。しかし、ディスク/フラッシュから仮想メモリにデータをコピーするのに同じ時間がかかるのはなぜですか?

しかし、メモリ マップド I/O を使用する利点を見つけることができません。直接読み取りと比較して、どのような利点がありますか?

メモリ マップには仮想メモリ内の特定の領域があるため、ヒープ メモリの上とスタック スペースの下にあります。プロセスのヒープとスタック スペースを制御できるためです。仮想メモリのメモリ マッピング領域を制御 (つまり、増減) するにはどうすればよいですか?

4

2 に答える 2

2

まず、ヒープとスタック自体がメモリ マップで構成されていることを理解します。各ユーザーランド プロセスにはメモリ マップのテーブルがあり、これがカーネル メモリ マネージャーと対話する方法です。メモリ マップには、さまざまな構成と機能があります。mmap(2)設定のリストについては、 man ページを参照してください。

ファイルに基づく mmap を使用すると、カーネルはファイルのキャッシュをページ サイズ (4096 バイト) 単位で高度に最適化された方法で管理します。

ファイルを順番に読み取る場合、メモリ マップには何の利点もありません。

ランダム アクセスでファイルを読み取る場合は、ほとんどのプラットフォームで CPU がサポートされているため、カーネルがキャッシュ戦略を自動的に適用するため、メモリ マップド ファイルのパフォーマンスが向上する可能性があります (通常はそうです)。

大まかに言うと、ファイルは 4096 バイトのブロック (ページ) に分割されます。メモリからバイトが読み取られると (メモリ マップ内に格納された変数が使用されます)、CPU はそれがどのブロック (ページ) にあるかを計算し、そのページ テーブルを参照して、そのページが物理メモリにあるかどうかを確認します。そうでない場合、ページ フォールトが発生し、ページがファイルから物理メモリ (4096 バイトすべて) に読み込まれます。その後、アクセスは物理メモリ アクセスに変換されます。

このようにオンデマンドでファイルをロードすることにより、多くのアクセス パターンでより高速になります。

また、ファイルをメモリ領域として (ポインター演算を使用して) アクセスし、次にファイル インターフェイス (シーク) を介してアクセスする方がはるかに便利です。

于 2013-07-19T02:04:52.923 に答える