第78章 MAP_ANONYMOUS

 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