mmap紹介
mmap関数はunix/linuxの下のシステム呼び出しで、「Unix Netword programming」巻二12.2節のmmapの紹介を見てみましょう.
The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes: 1. with a regular file to provide memory-mapped I/O 2. with special files to provide anonymous memory mappings 3. with shm_open to provide Posix shared memory between unrelated processes
mmapシステム呼び出しは、メモリを共有するために完全に設計されているわけではありません.それ自体は、通常のファイルとは異なるアクセス方法を提供し、プロセスは読み書きメモリのように通常のファイルに対する操作を行うことができます.一方、PosixやシステムVの共有メモリIPCは純粋に共有目的に用いられており、もちろんmmap()が共有メモリを実現することも主な応用の一つである.mmapシステム呼び出しにより、プロセス間で同じ一般ファイルをマッピングすることによって共有メモリが実現される.通常ファイルがプロセスアドレス空間にマッピングされると、read()、write()などの操作を呼び出すことなく、通常メモリにアクセスするようにファイルにアクセスできます.
我々のプログラムではmmapを大量に運用しており,mmapのこのような「通常のメモリにアクセスするようにファイルにアクセスする」機能を用いている.1つのファイルに頻繁にアクセスし、ポインタが往復移動する場合、mmapを呼び出すのは従来の方法よりずっと速いことが実証されています.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は、ファイルがプロセス空間にマッピングされるべき開始アドレスを指定し、一般的に空のポインタを指定します.このとき、開始アドレスを選択したタスクはカーネルに残して完了します.関数の戻り値は、最後のファイルがプロセス空間にマッピングされたアドレスであり、プロセスは、開始アドレスが値の有効なアドレスであることを直接操作することができる.次の図(「Unix Netword programming」巻二12.2節から)を見て、mmapについてさらに印象を深めます.
ここではmmapのパラメータについて詳しく説明しません.読者はmmapマニュアルページまたは「Unix Netword programming」巻二12.2節を参照して、さらなる情報を得ることができます.最後に、例を挙げて本節を終了します.4.2節では、Fileinformation配列はinforindexというファイルにバイナリ形式で書かれていると述べています.では、Fileinformation配列にアクセスする場合、コードは次のようになります.
The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes: 1. with a regular file to provide memory-mapped I/O 2. with special files to provide anonymous memory mappings 3. with shm_open to provide Posix shared memory between unrelated processes
mmapシステム呼び出しは、メモリを共有するために完全に設計されているわけではありません.それ自体は、通常のファイルとは異なるアクセス方法を提供し、プロセスは読み書きメモリのように通常のファイルに対する操作を行うことができます.一方、PosixやシステムVの共有メモリIPCは純粋に共有目的に用いられており、もちろんmmap()が共有メモリを実現することも主な応用の一つである.mmapシステム呼び出しにより、プロセス間で同じ一般ファイルをマッピングすることによって共有メモリが実現される.通常ファイルがプロセスアドレス空間にマッピングされると、read()、write()などの操作を呼び出すことなく、通常メモリにアクセスするようにファイルにアクセスできます.
我々のプログラムではmmapを大量に運用しており,mmapのこのような「通常のメモリにアクセスするようにファイルにアクセスする」機能を用いている.1つのファイルに頻繁にアクセスし、ポインタが往復移動する場合、mmapを呼び出すのは従来の方法よりずっと速いことが実証されています.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は、ファイルがプロセス空間にマッピングされるべき開始アドレスを指定し、一般的に空のポインタを指定します.このとき、開始アドレスを選択したタスクはカーネルに残して完了します.関数の戻り値は、最後のファイルがプロセス空間にマッピングされたアドレスであり、プロセスは、開始アドレスが値の有効なアドレスであることを直接操作することができる.次の図(「Unix Netword programming」巻二12.2節から)を見て、mmapについてさらに印象を深めます.
ここではmmapのパラメータについて詳しく説明しません.読者はmmapマニュアルページまたは「Unix Netword programming」巻二12.2節を参照して、さらなる情報を得ることができます.最後に、例を挙げて本節を終了します.4.2節では、Fileinformation配列はinforindexというファイルにバイナリ形式で書かれていると述べています.では、Fileinformation配列にアクセスする場合、コードは次のようになります.
struct stat st;
char buffer=” inforindex”;
Fileinformation *_fileinfoIndexptr = NULL;
if(stat(buffer,&st)<0)
{
fprintf(stderr,"error to stat %s
",buffer);
exit(-1);
}
// mmap the inforindex to _fileinfoIndexptr
int fd=open(buffer, O_RDONLY);
if(fd<0)
{
printf("error to open %s
",buffer);
exit(-1);
}
_fileinfoIndexptr = (Fileinformation*)mmap(NULL,st.st_size,
PROT_READ,MAP_SHARED,fd,0);
if(MAP_FAILED == _fileinfoIndexptr)
{
printf("error to mmap %s
",buffer);
close(fd);
exit(-1);
}