2017-01-08 6 views
-1
  • ファイルバックアップマッピングの主な違いは何ですか&匿名 マッピング。
  • プロセス間でIPCが必要な場合、File-backedマッピングまたはAnonymous
    マッピングのどちらを選択できますか。
  • これらを使用する利点、欠点は何ですか?

答えて

1

のmmap()システムコールは、ファイル・バック・マッピングまたは匿名マッピングのいずれかのために行くことができます。

のvoid *のMMAP(ボイド* addrに、size_tのlengthint "PROT"、int型」のフラグ、int型FD、 オフセットoff_t型)

ファイル担保マッピング - Linuxでは、Aが存在します0バイトの無限の源であるは/ dev /ゼロを提出。あなたはこのファイルを開くと、あなたはメモリになりたい場合はのmmap()適切なフラグとコール、すなわち、MAP_SHAREDにその記述子を渡します他のプロセスまたは012と共有共有したくない場合はを入力してください。 mmapのマンページ()引用

EX-

 . 
    . 
if ((fd = open("/dev/zero", O_RDWR)) < 0) 
printf("open error"); 
if ((area = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,fd, 0)) == MAP_FAILED) 
    { 
     printf("Error in memory mapping"); 
     exit(1); 
    } 
close(fd); //close the file because memory is mapped 
    //create child process 
    . 
    . 

: - (匿名マッピングとは反対に、 以下MAP_ANONYMOUSを参照してください)ファイルマッピングの内容

を、ファイル 記述子fdによって参照されるファイル(または他のオブジェクト)のオフセットオフセットで を開始する長さバイトを使用して初期化されます。 offsetは、sysconf(_SC_PAGE_SIZE)によって返されるページサイズの倍数でなければなりません。

ここでは、ゼロ(0)で初期化されています。

使用しての/ dev /私たちは「のようにゼロの利点W.リチャードスティーヴンス、スティーブンA. Rago II版によるUNIX環境でのブック高度なプログラミングからテキストを引用示された は、mmapを呼び出して のマップされた領域を作成する前に、実際のファイルが存在する必要はありません。/dev/zeroをマッピングすると、指定されたサイズのマップされた領域 が自動的に作成されます。この方法の欠点は、関連するプロセス間でのみ動作することです。 しかし、関連するプロセスでは、 スレッドを使用する方が簡単で効率的です(章11 と12)。かかわらずmmap()への呼び出しが成功した後、共有データへ

へのアクセスを同期するために使用される技術、我々はまだ 必要があるため、私たちはマップされた領域に書き込みを見ることができるようになり、子プロセスを作成することに注意してください(我々はMAP_SHAREDフラグを指定しました)。

匿名マッピング - 上で行った同様のことは、匿名mapping.For匿名マッピングを使用して行うことができ、我々はmmapのにMAP_ANONフラグを指定してファイル記述子を指定する-1。 結果の領域は匿名です(ファイル記述子によるパス名に関連付けられていないため)、子孫プロセスと共有できるメモリ領域を作成します。 利点は、メモリのマッピングにファイルを必要としないので、ファイルのオープンおよびクローズのオーバーヘッドも回避されます。

if ((area = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0)) == MAP_FAILED) 
    printf("Error in anonymous memory mapping"); 

したがって、これらのファイルバックアップマッピングと匿名マッピングは、必ず関連プロセスでのみ機能します。

無関係なプロセスの間にこれが必要な場合は、shm_open()を使用して名前付き共有メモリを作成し、返されたファイル記述子をmmap()に渡す必要があります。

+0

あなたは「これらのファイルバックアップマッピングと匿名マッピングは、必ず関連プロセスでのみ機能する」と述べています。なぜファイルマップされたmmapが必要なのでしょうか?匿名マッピングと比較してどのように役立ちますか? – user1762571

+0

ファイルバッキングマッピングの場合、プロセスの仮想アドレス空間はファイルにマップされます。したがって、そのメモリにアクセスすると、その領域にマップされているファイルが読み込まれます。一方、匿名マッピングは、どのファイルでもサポートされていないプロセスの仮想メモリの領域をマッピングします。内容はゼロに初期化されます。この点で、匿名マッピングはmallocに似ており、特定の割り当てのためにいくつかのmalloc(3)実装で使用されます。 –

+0

/dev/zeroを使って 'mmap()'すると、匿名マッピングと同じことになります。 –

関連する問題