Linux:mmap()関数

3775 ワード

mmap関数はunix/linuxでのシステム呼び出しであり、mmapシステム呼び出しはメモリ共有のために完全に設計されているわけではありません.それ自体は、通常のファイルとは異なるアクセス方法を提供し、プロセスは読み書きメモリのように通常のファイルに対する操作を行うことができます.一方、PosixやシステムVの共有メモリIPCは純粋に共有目的に用いられており、もちろんmmap()が共有メモリを実現することも主な応用の一つである.
mmapシステム呼び出しにより、プロセス間で同じ一般ファイルをマッピングすることによって共有メモリが実現される.通常ファイルがプロセスアドレス空間にマッピングされると、read()、write()などの操作を呼び出すことなく、通常メモリにアクセスするようにファイルにアクセスできます.
我々のプログラムではmmapを大量に運用しており,mmapのこのような「通常のメモリにアクセスするようにファイルにアクセスする」機能を用いている.1つのファイルに頻繁にアクセスし、ポインタが往復移動する場合、mmapを呼び出すのは従来の方法よりずっと速いことが実証されています.
1.mmapの定義を見てみましょう.
 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

パラメータfdはプロセス空間にマッピングされるファイル記述語であり、一般的にopen()によって返されるが、fdは-1として指定でき、flagsパラメータのMAP_を指定する必要がある.ANONは、匿名マッピングが行われていることを示しています(具体的なファイル名にかかわらず、ファイルの作成や開くことを回避し、親縁関係のあるプロセス間通信にのみ使用できることは明らかです).
lenは、呼び出されたプロセスアドレス空間にマッピングされたバイト数であり、マッピングされたファイルの先頭offsetバイトから算出される.
protパラメータは共有メモリのアクセス権を指定します.次の値またはPROT_READ(読み取り可能)、PROT_WRITE(書き込み可能)、PROT_EXEC(実行可能)、PROT_NONE(アクセス不可).
flagsは次の定数で指定されます:MAP_SHARED, MAP_PRIVATE, MAP_FIXED.そのうち、MAP_SHARED,MAP_PRIVATEは必ずその1つを選択し、MAP_FIXEDは推奨されていません.MAP_として指定した場合SHAREDでは、マッピングされたメモリに対する変更もファイルに影響します.MAPならPRIVATEでは、マッピングされたメモリに対する変更は、そのプロセスにのみ表示され、ファイルには影響しません.
offsetパラメータは一般に0に設定され、ファイルヘッダからマッピングが開始されることを示す.
パラメータaddrは、ファイルがプロセス空間にマッピングされるべき開始アドレスを指定し、一般的に空のポインタを指定します.このとき、開始アドレスを選択したタスクはカーネルに残して完了します.関数の戻り値は、最後のファイルがプロセス空間にマッピングされたアドレスであり、プロセスは、開始アドレスが値の有効なアドレスであることを直接操作することができる.
2.機能説明:
mmapは、1つのファイルまたは他のオブジェクトをメモリにマッピングします.ファイルは複数のページにマッピングされ、ファイルのサイズがすべてのページのサイズの和でない場合、最後のページが使用されないスペースはゼロになります.munmapは逆の操作を実行し,特定のアドレス領域のオブジェクトマッピングを削除する.
ファイルのマッピングに基づいて、mmapとmunmapがプロセスを実行する任意の時点で、マッピングされたファイルのst_atimeが更新される可能性があります.もしst_atimeフィールドは前述の場合更新されず、マッピング領域の最初のページにインデックスを付けるとフィールドの値が更新されます.PROT_でWRITEとMAP_SHAREDフラグが作成したファイルマッピング、そのst_ctimeとst_mtimeはマッピング領域への書き込み後、msync()でMS_を通過するSYNCとMS_ASYNCの2つのフラグが呼び出される前に更新されます.
3.使い方:
#include 

void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);
int munmap(void *start, size_t length);

パラメータ:start:マッピング領域の開始アドレス.length:マッピング領域の長さ.prot:ファイルのオープンモードと競合しないメモリ保護フラグが望ましい.以下のいずれかの値であり、or演算で合理的に組み合わせることができる
PROT_EXEC //        
PROT_READ  //        
PROT_WRITE //      
PROT_NONE  //     

flags:マッピング・オブジェクトのタイプ、マッピング・オプション、マッピング・ページが共有できるかどうかを指定します.その値は、1つまたは複数の下位のコンポジットであってもよい
MAP_FIXED //           ,   start len                  ,         。            ,      。               。
MAP_SHARED //                    。       ,        。  msync()  munmap()   ,          。
MAP_PRIVATE //              。               。             ,        。
MAP_DENYWRITE //       。
MAP_EXECUTABLE //  
MAP_NORESERVE //             。        ,              。         ,      ,               。
MAP_LOCKED //        ,            。
MAP_GROWSDOWN //    ,    VM  ,         。
MAP_ANONYMOUS //    ,           。
MAP_ANON //MAP_ANONYMOUS   ,     。
MAP_FILE //    ,   。
MAP_32BIT //              2GB,MAP_FIXED       。        x86-64       。
MAP_POPULATE //                 。                 。
MAP_NONBLOCK //  MAP_POPULATE         。     ,                  。

fd:有効なファイル記述語.MAP_ANONYMOUSは設定されており、互換性の問題のため、その値は-1であるべきである.offset:マッピングされたオブジェクトのコンテンツの開始点.4.戻り説明:正常に実行された場合、mmap()はマッピングされた領域のポインタを返し、munmap()は0を返します.失敗した場合、mmap()はMAP_を返します.FAILED[その値は(void*)−1]であり、munmapは−1を返す.errnoは、以下の値に設定されます.
EACCES:    
EAGAIN:      ,           
EBADF:fd          
EINVAL:          
ENFILE:             
ENODEV:                  
ENOMEM:    ,               
EPERM:    ,     
ETXTBSY:         ,    MAP_DENYWRITE  
SIGSEGV:        
SIGBUS:             

記事の転載:http://www.52rd.com/Blog/Detail_RD.Blog_wuyaya_67495.html