コンピューティングにおいて、mmap(2)はPOSIX準拠のUnixシステムコールであり、ファイルまたはデバイスをメモリにマッピングします。これはメモリマップファイルI/Oの手法です。ファイルの内容はディスクからすぐに読み取られず、初期状態では物理 RAM を一切使用しないため、デマンドページングが実装されています。ディスクからの実際の読み取りは、特定の場所にアクセスした後に、遅延的に実行されます。マッピングが不要になったら、を使用してポインタをアンマップする必要がありますmunmap(2)。保護情報(マップされた領域を実行可能としてマークするなど)は を使用して管理できmprotect(2)、特別な処理は を使用して強制できますmadvise(2)。
Linux、macOS、BSDでは、複数の種類のマッピングを作成できます。他のオペレーティングシステムでは、これらのマッピングのサブセットのみをサポートする場合があります。例えば、グローバルVFSmmapやI/Oキャッシュを持たないオペレーティングシステムでは、共有マッピングは実用的ではない場合があります。
歴史
メモリマップファイルの元々の設計はTOPS-20オペレーティングシステムに由来し、関連するシステムコールはBerkeley Software Distributionmmap (BSD)版Unixの一部として設計されました。そのAPIは4.2BSDシステムマニュアルに既に記載されていましたが、そのリリースにも4.3BSDにも実装されていませんでした。[ 1 ]サン・マイクロシステムズは、このAPIをSunOSオペレーティングシステムの4.0リリースに実装していました。[ 2 ]カリフォルニア大学バークレー校のBSD開発者は、サンに実装の寄贈を要請しましたが、却下されました。4.3BSD-Renoには、代わりにMachの仮想記憶システムに基づく実装が同梱されました。[ 3 ]
ファイルバックアップと匿名
ファイルバックアップマッピングは、プロセスの仮想メモリ領域をファイルにマッピングします。つまり、メモリのその領域を読み取ると、ファイルも読み取られます。これはデフォルトのマッピングタイプです。
匿名マッピングMAP_ANONYMOUSは、 /フラグを介してアクセス可能な、ファイルの裏付けのないプロセスの仮想メモリ領域をマッピングしますMAP_ANON。その内容はゼロに初期化されます。[ 4 ]この点において、匿名マッピングはmallocに似ており、一部の malloc 実装では、特に大規模なメモリ割り当てに使用されます。
メモリの可視性
マッピングが共有されている場合(MAP_SHAREDフラグが設定されている場合)、マッピングへの書き込みは、同じファイルをマッピングした他のプロセスから参照できます。マッピングが共有されており、かつファイルによってバックアップされている場合( ではない場合MAP_ANONYMOUS)、基礎となるファイル媒体への書き込みはmsync(2)、システムコールに渡された後にのみ保証されますが、それ以外の時点でシステムによってフラッシュされる可能性もあります。一方、マッピングがプライベートである場合(MAP_PRIVATEフラグが設定されている場合)、変更は他のプロセスから参照できず、ファイルにも書き込まれません。
基となるファイルから読み書きするプロセスは、そのファイルをマップした別のプロセスと常に同じデータを参照するとは限りません。これは、ファイルのセグメントがRAMにコピーされ、定期的にディスクにフラッシュされるためです。同期は を呼び出すことで強制的に実行できますmsync(2)。
ファイルに対してmmapを使用すると、同じファイルにアクセスするアプリケーションのメモリオーバーヘッドを大幅に削減できます。つまり、ファイルにアクセスするアプリケーションごとにファイルを読み込むのではなく、ファイルが包含するメモリ領域を共有できるのです。そのため、mmap(2)はプロセス間通信(IPC)に使用されることがあります。最近のオペレーティングシステムでは、 System V IPC共有メモリ機能よりもmmap(2)が一般的に推奨されています。 [ 5 ]
System V 共有メモリ (shmem) とメモリ マップ I/O (mmap) の主な違いは、System V 共有メモリは永続的である点です。つまり、プロセスによって明示的に削除されない限り、メモリ内に保持され、システムがシャットダウンされるまで使用可能です。mmap されたメモリは、アプリケーションの実行間では永続的ではありません (ファイルによってバックアップされていない限り)。
Cプログラミング言語での使用例
#include <stdio.h>#include <stdlib.h>#include <文字列.h>#include <err.h>#include <fcntl.h>#include <sys/types.h>#include <sys/mman.h>#include <unistd.h>/* この例では、/dev/zero の mmap が次のものと同等であることを示しています。 どのファイルにも接続されていない匿名メモリ (MAP_ANON) を使用しています。 注:MAP_ANONYMOUSまたはMAP_ANONはほとんどのUNIXでサポートされています。 バージョンにより、/dev/zero の本来の目的が失われました。*//* OS X または macOS では /dev/zero を mmap できないため動作しません */int main ( void ) {const char str1 [] = "文字列 1" ;const char str2 [] = "文字列 2" ;pid_t parpid = getpid ();pid_t子pid ;整数fd = -1 ;if (( fd = open ( "/dev/zero" , O_RDWR , 0 )) == -1 ) {err ( 1 , "オープン" );}char * anon = ( char * ) mmap ( NULL 、4096 、PROT_READ | PROT_WRITE 、MAP_ANON | MAP_SHARED 、-1 、0 );char *ゼロ= ( char * ) mmap ( NULL 、4096 、PROT_READ | PROT_WRITE 、MAP_SHARED 、fd 、0 );if (匿名== MAP_FAILED ||ゼロ== MAP_FAILED ) {errx ( 1 , "どちらかの mmap" );}strcpy (匿名, str1 );strcpy (ゼロ, str1 );printf ( "PID %d: \t匿名 %s、ゼロバック %s \n " 、parpid 、anon 、zero );スイッチ((子pid = fork ())) {ケース-1 :err ( 1 , "フォーク" );// 到達していないケース0 :子pid = getpid ();printf ( "PID %d: \t匿名 %s、ゼロバックアップ %s \n " 、childpid 、anon 、zero );睡眠(3 )printf ( "PID %d: \t匿名 %s、ゼロバックアップ %s \n " 、childpid 、anon 、zero );munmap (匿名、4096 );munmap (ゼロ, 4096 );閉じる( fd );EXIT_SUCCESS を返します。}睡眠(2 )strcpy (匿名, str2 );strcpy (ゼロ, str2 );printf ( "PID %d: \t匿名 %s、ゼロバック %s \n " 、parpid 、anon 、zero );munmap (匿名、4096 );munmap (ゼロ, 4096 );閉じる( fd );EXIT_SUCCESS を返します。}サンプル出力:
PID 22475: 匿名文字列 1、ゼロバック文字列 1 PID 22476: 匿名文字列 1、ゼロバック文字列 1 PID 22475: 匿名文字列 2、ゼロバック文字列 2 PID 22476: 匿名文字列 2、ゼロバック文字列 2
データベース実装での使用
mmapシステムコールは、バッファプールを実装する代わりにさまざまなデータベース実装で使用されてきましたが、これはバッファプールを使用することでのみ現実的に解決できる別の一連の問題を引き起こしました。[ 6 ]
参照
- 物理メモリよりもアドレス空間が大きい場合の仮想メモリ
- 仮想記憶の実装のためのページング
- mmap が利用するディスク キャッシュ メカニズムのページ キャッシュ
- mmap によって実装されたスキームの要求ページング
参考文献
- ^ William Joy ; Eric Cooper; Robert Fabry ; Samuel Leffler ; Kirk McKusick ; David Mosher (1983). 4.2BSD システムマニュアル(PDF) (レポート).コンピュータシステム研究グループ,カリフォルニア大学バークレー校.
- ^ Gingell, Robert A.; Moran, Joseph P.; Shannon, William A. 「SunOS の仮想メモリアーキテクチャ」。
- ^ McKusick, Marshall Kirk (1999). 「Berkeley Unixの20年:AT&T所有から自由に再配布可能へ」Open Sources: オープンソース革命の声. O'Reilly.
- ^ "mmap(2) - The Open Group 基本仕様書 第8号" .
- ^ケリスク、マイケル (2010). 『Linuxプログラミング・インターフェース:LinuxおよびUNIXシステムプログラミング・ハンドブック』サンフランシスコ: No Starch Press. p. 1116. ISBN 978-1-59327-291-3. OCLC 728672600 .
- ^ 「データベース管理システムでMMAPを使用しますか?」db.cs.cmu.edu . 2023年7月4日閲覧。
さらに読む
- POSIX標準からの説明
- 違い:
- ウィンドウズ
- MapViewOfFile win32 関数は mmap とほぼ同等です。
- その他のソースコードの例:
- SharedHashFile、 mmap() を使用して実装されたオープンソースの共有メモリハッシュテーブル。