MAP_ANONYMOUS はファイルをマッピングしない mmap() 関数のコールにつかいます。
MAP_ANONYMOUS を指定した一定以上のバイトサイズ割り当ての malloc() に相当します。
大きめのメモリーを割り当てたい時には malloc() は mmap() 関数を裏で使うのですが、 mmap のメモリー領域( Memory Region )にメモリーアドレスを割り当てたい場合に使うことができます。
インメモリーのデータベースとまでは言いませんが、かなり大きめなキャッシュを割り当てるには役に立つと思います。
main.c.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <fcntl.h> 5 #include <sys/mman.h> 6 7 int main() 8 { 9 int *buf; 10 11 buf = mmap(NULL,sizeof(int)*2,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); 12 if(buf == MAP_FAILED) { 13 perror("MAP_FAILED"); 14 exit(1); 15 } 16 17 *buf = 100; 18 ++buf; 19 *buf = 200; 20 21 printf("0x%lx : %d\n",(long)buf,*buf); 22 --buf; 23 printf("0x%lx : %d\n",(long)buf,*buf); 24 25 if(munmap(buf,sizeof(int)*2)==-1){ 26 perror("munmap"); 27 exit(1); 28 } 29 30 return 0; 31 }
ビルドと実行結果.
$ gcc main.c $ ./a.out 0x7f120a2d6004 : 200 0x7f120a2d6000 : 100
考え方としてはヒープ領域では大きすぎるメモリーを独自の領域に確保したい場合に使うと良いでしょう。
11 buf = mmap(NULL,sizeof(int)*2,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); 12 if(buf == MAP_FAILED) { 13 perror("MAP_FAILED"); 14 exit(1); 15 }
このような mmap() の使い方は通常はあまり意味はないです。
malloc() が裏でコールしてるからですが、利点としては munmap によってメモリーがきれいに解放できるのでフラグメンテーションの心配がいらないことですかね。
Copyright 2018-2019, by Masaki Komatsu