mmap
mmap() は、UNIXのシステムコールのひとつで、ファイルやデバイスなどのオペレーティングシステム (OS) 上のリソースの一部または全部を連続したメモリ領域にマッピングする操作である。
ファイルシステム上のリソースに対するアクセス方法として、ストリームI/Oを行うシステムコールとの比較で、ユーザ空間とカーネル空間の間で読み書きされるデータのブロック転送が多くのアーキテクチャ上では発生しないことから、好まれる場合がある。
デバイスでは、ioctl()とともにメモリマップドI/OやDMAなどの操作を抽象化するものとしてドライバからファイルI/Oサービスの一部として提供されることがある。
目次 |
規格 [編集]
mmap()はPOSIXにより定義されており、POSIX準拠のOSで利用することができる。POSIXで定められた動作のほかに、各OS毎に独自の拡張が施されていることがよくあり、Linuxでも、mmap() はいくつかのOS固有のマッピングを生成可能である。
メモリ獲得手段としてのmmap操作 [編集]
無名 (Anonymous) マッピングを用いて、物理メモリ空間を仮想メモリ空間にマッピングすることができる。この機能は、アプリケーションの実行中にOSから追加のメモリリソースを獲得する方法として利用される。たとえば多くのUNIXのCライブラリのmalloc()の実装は、mmap()を内部的に使っている。
ファイルのmmap操作 [編集]
ファイルを仮想メモリ空間へマッピングした場合、まずOSはファイル上の対象となる領域のデータを、ビューとして、mmap()を呼び出したアプリケーションがアクセスできるメモリ領域にブロック転送する。そして、アプリケーションがマッピングされた領域へアクセス(書き込み)を行うと、OSはその変更を同期的あるいは非同期的にファイルへと反映する。
複数プロセス間におけるmmap [編集]
複数のプロセスで、同じリソースの同じ領域をマッピングした場合の動作は、mmap()呼び出し時のパラメータや、OSの提供するマッピングのセマンティクスによって異なる。
マッピングされたメモリ領域が複数のプロセスで共有されている状況があり、そこでは、あるプロセスがマッピングされた領域に書き込んだ内容を、他のプロセスが(同期的あるいは非同期的に)即座に読むことができるような状況がOSにより保証される。この性質は、プロセス間通信の手法の1つとして(UNIX System Vの共有メモリ機構の代替として)使われることがある。
一方で、マッピングがコピーオンライトである状況がある。そこでは、マッピングされたメモリ領域からの読み取りしか行われていない状況が続く限りプロセス間でマッピングが共有されるが、あるプロセスがメモリ領域に何かを書き込もうとした瞬間にオペレーティングシステムがマッピングを複製し、メモリ領域のコピーを生成したのち、その領域をプロセス固有のものとして位置づける。つまり、事実上、プロセス間ではマッピングが共有されていないということになり、この状況では、マッピングによるリソースへのアクセスは一貫性がないということになる。
mmap() により生成されたマッピングはforkにより生じた子プロセスにおいても保持される。
関連項目 [編集]
外部リンク [編集]
- – System Interfaces Reference, The Single UNIX® Specification, Issue 7 from The Open Group
- – JM Project Linux System Calls マニュアル