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