mmap

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングmmap(2)は、ファイルまたはデバイスをメモリにマップするPOSIX準拠のUnix システムコールです。これは、メモリマップトファイルI / Oの方法です。ファイルの内容がディスクから直接読み取られず、最初は物理RAMをまったく使用しないため、デマンドページングが実装されます。ディスクからの実際の読み取りは、特定の場所にアクセスした後、 「怠惰な」方法で実行されます。メモリが不要になった後は、メモリへmunmap(2)のポインタが重要になります。保護情報はを使用して管理できmprotect(2)、特別な処理はを使用して実施できますmadvise(2)

LinuxではmacOSBSDmmapいくつかのタイプのマッピングを作成できます。他のオペレーティングシステムは、これらのサブセットのみをサポートする場合があります。たとえば、共有マッピングは、グローバルVFSまたはI / Oキャッシュのないオペレーティングシステムでは実用的でない場合があります。

歴史

メモリマップトファイルの元の設計は、TOPS-20オペレーティングシステムからのものです。mmapおよび関連するシステムコールは、UnixのBerkeley Software Distribution(BSD)バージョンの一部として設計されました。それらのAPIは、そのリリースでも4.3BSDでも実装されていませんが、4.2BSDシステムマニュアルですでに説明されています。[1] ただし、SunMicrosystemsはSunOSオペレーティングシステムにこのAPIを実装していましカリフォルニア大学バークレー校のBSD開発者は、Sunにその実装を寄付するように要求しましたが、これらの話し合いによってコードが転送されることはありませんでした。4.3BSD-Renoは、代わりにMachの仮想メモリシステムに基づく実装とともに出荷されました[2]

ファイルに裏打ちされた匿名

ファイルに基づくマッピングは、プロセスの仮想メモリの領域をファイルにマップします。つまり、メモリのこれらの領域を読み取ると、ファイルが読み取られます。これはデフォルトのマッピングタイプです。

匿名マッピングは、ファイルに裏打ちされていないプロセスの仮想メモリの領域をマップします。内容はゼロに初期化されます。[3]この点で、匿名マッピングはに似ており、特定の割り当てmallocの一部のmalloc(3)実装で使用されます。ただし、匿名マッピングはPOSIX標準の一部ではありませんが、ほとんどすべてのオペレーティングシステムでMAP_ANONYMOUSおよびMAP_ANONフラグによって実装されています。

メモリの可視性

マッピングが共有されている場合(MAP_SHAREDフラグが設定されている場合)、fork(2)システムコール全体でマッピングが保持されます。これは、1つのプロセスでマップされた領域への書き込みが、関連するすべての(親、子、または兄弟)プロセスですぐに表示されることを意味します。マッピングが共有され、ファイルによってバックアップされている場合(ではなくMAP_ANONYMOUS)、基になるファイルメディアは、msync(2)された後にのみ書き込まれることが保証されます。

マッピングがプライベートの場合(MAP_PRIVATEフラグが設定されている場合)、変更は他のプロセスに表示されたり、ファイルに書き込まれたりすることはありません。

ファイルのセグメントがRAMにコピーされ、定期的にディスクにフラッシュされるため、基になるファイルの読み取りまたは書き込みを行うプロセスは、ファイルをマップしたプロセスと同じデータを常に表示するとは限りません。msyncシステムコール で同期を強制することができます。

mmap(2)ingファイルは、同じファイルにアクセスするアプリケーションのメモリオーバーヘッドを大幅に削減できます。アクセスしたいアプリケーションごとにファイルをロードする代わりに、ファイルに含まれるメモリ領域を共有できます。これは、mmap(2)がプロセス間通信(IPC)に使用される場合があることを意味します。最新のオペレーティングシステムでは、通常、mmap(2)がSystem VIPC共有メモリ機能よりも優先されます。[4]

System V共有メモリ(shmem)とメモリマップドI / O(mmap)の主な違いは、System V共有メモリが永続的であるということです。プロセスによって明示的に削除されない限り、メモリに保持され、システムがシャットダウンされるまで使用可能です。 。mmapされたメモリは、アプリケーションの実行間で永続的ではありません(ファイルによってバックアップされている場合を除く)。

Cプログラミング言語での使用例

#include <sys / types.h> 
#include <sys / mman.h> 
#include <err.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

/ *この例は、/ dev / zeroのmmapが、
   どのファイルにも接続されていない匿名メモリ(MAP_ANON)を使用することとどのように同等であるかを示しています。
   注意:MAP_ANONYMOUSまたはMAP_ANONは、ほとんどのUNIX
   バージョンでサポートされており、/ dev / zeroの本来の目的を削除しています。
* /
/ * / dev / zeroをmmapできないOSXまたはmacOSでは機能しません* /
int main void  
{{
        const char str1 [] = "string 1" ;    
        const char str2 [] = "string 2" ;    
        pid_t parpid = getpid ()、childpid ;    
        int fd = -1 ;   
        char * anon *ゼロ;  

        if ((fd = open "/ dev / zero" O_RDWR 0 ))== -1        
                err 1 "open" ); 

        anon = char * mmap NULL 4096 PROT_READ | PROT_WRITE MAP_ANON | MAP_SHARED -1、0 ; _       
        ゼロ= char * mmap NULL 4096 PROT_READ | PROT_WRITE MAP_SHARED fd 0 );       

        if anon == MAP_FAILED || zero == MAP_FAILED        
                errx 1 "いずれかのmmap" ); 

        strcpy anon str1 ); 
        strcpy ゼロstr1 ); 

        printf "PID%d:\ t匿名%s、ゼロバック%s \ n " parpid anon zero );   
        スイッチ((childpid = fork ())){    
        ケース-1  
                err 1 "フォーク" ); 
                /* 届いていない */
        ケース0  
                childpid = getpid ();  
                printf "PID%d:\ t匿名%s、ゼロバック%s \ n " childpid anon zero );   
                睡眠3 );

                printf "PID%d:\ t匿名%s、ゼロバック%s \ n " childpid anon zero );   
                munmap anon 4096 ); 
                munmap ゼロ4096 ); 
                close fd );
                EXIT_SUCCESSを返します; 
        }

        睡眠2 );
        strcpy anon str2 ); 
        strcpy ゼロstr2 ); 

        printf "PID%d:\ t匿名%s、ゼロバック%s \ n " parpid anon zero );   
        munmap anon 4096 ); 
        munmap ゼロ4096 ); 
        close fd );
        EXIT_SUCCESSを返します; 
}

サンプル出力:

PID 22475:匿名文字列1、ゼロバック文字列1
PID 22476:匿名文字列1、ゼロバック文字列1
PID 22475:匿名文字列2、ゼロバック文字列2
PID 22476:匿名文字列2、ゼロバック文字列2

も参照してください

参考文献

  1. ^ ウィリアムジョイ; エリッククーパー; ロバートファブリ; サミュエル・レフラー; カーク・マックシック; デビッドモッシャー(1983)。4.2BSDシステムマニュアル (PDF)(レポート)。カリフォルニア大学バークレー校コンピュータシステム研究グループ
  2. ^ McKusick、マーシャルカーク(1999)。「バークレーUnixの20年:AT&T所有から自由に再配布可能まで」。オープンソース:オープンソース革命からの声オライリー。
  3. ^ "mmap(2)-Linuxのマニュアルページ"
  4. ^ ケリスク、マイケル(2010)。Linuxプログラミングインターフェイス:LinuxおよびUNIXシステムプログラミングハンドブックサンフランシスコ:ノースターチプレス。p。1116. ISBN 978-1-59327-291-3OCLC728672600 _

さらに読む