mmap
ファイル名ではなく、ファイル記述子を取ります。これは、いわゆるメモリ マッピングを実行します。つまり、プロセスの仮想メモリ空間内のページを、ファイル記述子によって表されるファイルのようなオブジェクトの部分に関連付けます。これは次のことができるため、非常に強力な操作です。
- 単純にメモリ内の配列としてファイルのコンテンツにアクセスする。
- サウンドカードのバッファやグラフィックスアダプタのフレームバッファなど、特殊な I/O ハードウェアのメモリにアクセスする (Unix のファイル記述子は抽象化されており、通常のファイルの代わりにデバイスノードを参照することもできるため、これが可能です)。
- 同じオブジェクトの共有マップを実行することにより、プロセス間でメモリを共有します。
Unix で共有メモリを使用する POSIX 以前の古い方法は、System V IPC 共有メモリを使用することでした。まず共有メモリ セグメントを で作成しshmget(2)
、次に でプロセスにアタッチする必要がありましたshmat(2)
。SysV 共有メモリ セグメント (および他の IPC オブジェクト) には名前がなく、むしろ数値 ID があるため、ftok(3)
パス名文字列とプロジェクト ID 整数の組み合わせを数値キー ID に変換する特別なハッシュ関数が提供されますが、衝突は発生します。可能。
共有メモリを使用する最新の POSIX の方法は、ファイルのようなメモリ オブジェクトを で開き、 でshm_open(2)
目的のサイズにサイズ変更してから、そのサイズに変更ftruncate(2)
するmmap(2)
ことです。この場合のメモリ マッピングはshmat(2)
、SysV IPC API からの呼び出しのように機能shm_open(2)
し、初期サイズがゼロのオブジェクトを作成するため、切り捨てが必要です。
(これらは C API の一部です。Python モジュールが提供するのは、多かれ少なかれそれらの呼び出しの薄いラッパーであり、多くの場合、ほとんど同じ署名を持っています)
メモリを共有する必要があるすべてのプロセスで同じ通常ファイルをメモリ マッピングすることで、共有メモリを取得することもできます。実際のところ、Linux は、特別なtmpfs
ファイル システム上にファイルを作成することにより、POSIX 共有メモリ操作を実装しています。ドライバはtmpfs
、ファイルの内容を保持するページを、実行するプロセスのアドレス空間に直接マッピングすることにより、非常に軽量なメモリ マッピングを実装しますmmap(2)
。は通常のファイルシステムとして動作するため、やその他のシェル ツールtmpfs
を使用してその内容を調べることができます。この方法で共有メモリ オブジェクトを作成したり、既存のオブジェクトの内容を変更したりすることもできます。のファイルの違いls
cat
tmpfs
通常のファイルシステム ファイルは、後者がストレージ メディア (ハードディスク、ネットワーク ストレージ、フラッシュ ドライブなど) に永続化され、変更がこのストレージ メディアにフラッシュされることがあり、前者は完全に RAM に保存されます。Solaris も同様の RAM ベースのファイルシステムを提供しており、これは とも呼ばれtmpfs
ます。
最新のオペレーティング システムでは、メモリ マッピングが広く使用されています。実行可能ファイルは、実行可能コードと静的データを保持するページのコンテンツを提供するためにメモリ マップされます。また、共有ライブラリはメモリ マップされます。これにより、これらのマッピングが共有されるため、物理メモリが節約されます。たとえば、実行可能ファイルまたは共有ライブラリのコンテンツを保持する同じ物理メモリが各プロセスの仮想メモリ空間にマップされます。