メモリマップトファイル(mmap)
メモリマップトファイルは、ファイルをプロセスのメモリ空間に対応づけ、ポインタ経由でメモリのように読み書きする手法です。read/write 呼び出しを介さず効率よく扱えます。
- 1.メモリマップトファイルは、ファイルを仮想アドレス空間に対応づけ、メモリとして直接読み書きする仕組みです。
- 2.read/write のシステムコールを介さず、ページフォルト契機で必要部分だけが読み込まれます。
- 3.巨大ファイルのランダムアクセスやプロセス間の共有メモリに向きますが、扱いには注意も要ります。
メモリマップトファイルとは
通常、ファイルを読むときは read、書くときは write という システムコール を呼び、カーネルのバッファとアプリのバッファの間でデータをコピーします。
メモリマップトファイル は発想が異なります。ファイルの中身を、プロセスの 仮想アドレス空間の一区画に対応づけ(マッピング)、以後は ポインタ経由でメモリのように直接 読み書きします。Linux では mmap システムコールで実現します。
int fd = open("data.bin", O_RDWR);
char *p = mmap(NULL, len, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
p[0] = 'A'; /* ファイルの先頭を書き換えたのと同じ */
マッピングした後は、配列のように p[i] でアクセスするだけ。明示的な read/write は要りません。ファイルがあたかも 巨大なバイト配列としてメモリ上にある かのように扱えます。
mmap の核心は、ファイル I/O をアドレス空間への対応づけに置き換えることです。アクセスは通常のメモリ操作になり、面倒なオフセット計算や逐次の読み書き呼び出しから解放されます。
仕組み:ページフォルトで遅延読み込み
マッピングした瞬間に、ファイル全体がメモリに読み込まれるわけではありません。実際の読み込みは アクセスされたときに初めて 起こります(前提は 仮想記憶(ページング))。
1. mmap でファイルを仮想アドレス空間に対応づける(まだ読まない)
2. プログラムが p[i] にアクセス
3. そのページが物理メモリに無い → ページフォルト発生
4. OS が該当部分をファイルから1ページ読み込む
5. 命令を再実行 → 何事もなくアクセス成功
つまり mmap は デマンドページング で動き、触った部分だけ がページ単位でメモリに乗ります。書き込んだ内容は、OS が適当なタイミング(または msync)でファイルへ書き戻します。
read/write との比較
| 観点 | read/write | mmap |
|---|---|---|
| アクセス方法 | システムコール呼び出し | ポインタで直接 |
| データのコピー | カーネル↔ユーザ間で発生 | 同じページを共有でき削減 |
| 読み込み単位 | 呼び出しごと | ページ単位の遅延読み込み |
| ランダムアクセス | オフセット指定が必要 | 添字アクセスで自然 |
| 小さな逐次処理 | 素直で十分 | オーバーヘッドが見合わないことも |
mmap が効くのは、システムコール回数とコピーを減らせる からです。read を何度も呼ぶ代わりに、ポインタ操作で済みます。
主な用途
mmap が向く場面は明確です。
- 巨大ファイルのランダムアクセス:必要なページだけ読み込めるので、全体をメモリに載せなくて済む
- プロセス間の共有メモリ:同じファイルを複数プロセスが
MAP_SHAREDで対応づければ、メモリを共有でき高速な IPC になる - 実行ファイル/ライブラリのロード:OS はプログラムやライブラリをまさに mmap で読み込んでいる
小さなファイルの素直な逐次読み出しでは、マッピングの準備コストが見合わず read のほうが速いことがあります。また、アクセス中にファイルが別プロセスから切り詰められると、その領域に触れた瞬間に SIGBUS でプロセスが落ちる、という事故も起こり得ます。書き戻しのタイミングを保証したい場合は msync を明示的に呼ぶ必要があります。
まとめ
- メモリマップトファイルは、ファイルを 仮想アドレス空間に対応づけ、ポインタで直接読み書きする手法。
- 読み込みは ページフォルト契機の遅延 で行われ、触った部分だけがメモリに乗る。
- 巨大ファイルのランダムアクセス や プロセス間共有メモリ に強い。
- 小さな逐次処理や切り詰め時の事故には注意し、用途を見極めて使う。
土台は 仮想記憶(ページング)、他の通信手段は プロセス間通信(IPC) も合わせてどうぞ。
OS Article
メモリマップトファイル(mmap)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
mmap
比較で見る軸
難易度: advanced / カテゴリ: OS / タグ数: 4
導入後に効く点
read/write のシステムコールを介さず、ページフォルト契機で必要部分だけが読み込まれます。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- OS
- タグ数
- 4
判断チェックリスト
- 自社の用途が「mmap / メモリ管理」に近いか確認する。
- 強みである「メモリマップトファイルは、ファイルを仮想アドレス空間に対応づけ、メモリとして直接読み書きする仕組みです。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。