only のパラメーターを使用mmap(2)
してファイルのを作成し、ファイルのバッキングも読み取り専用で変更されない場合、 と の間にパフォーマンスの違い (またはまったく違い) はありますか? カーネルは 2 つの間で何か違うことをしますか?prot
PROT_READ
MAP_SHARED
MAP_PRIVATE
(ドキュメンテーションでは、「更新」に関する動作の違いのみが言及されていますが、このままではPROT_READ
更新はあり得ません。他に何か違いがあるのでしょうか?)
only のパラメーターを使用mmap(2)
してファイルのを作成し、ファイルのバッキングも読み取り専用で変更されない場合、 と の間にパフォーマンスの違い (またはまったく違い) はありますか? カーネルは 2 つの間で何か違うことをしますか?prot
PROT_READ
MAP_SHARED
MAP_PRIVATE
(ドキュメンテーションでは、「更新」に関する動作の違いのみが言及されていますが、このままではPROT_READ
更新はあり得ません。他に何か違いがあるのでしょうか?)
の下MAP_PRIVATE
で、Linux マンページには、mmap() 呼び出し後にファイルに加えられた変更がマップされた領域に表示されるかどうかが指定されていないと記載されています。の場合はそうではありませんMAP_SHARED
。したがって、マッピングの内容をファイルの内容と一緒に更新する必要がある場合は、MAP_SHARED
. 基になるファイル自体が読み取り専用で変更できない場合は、もちろんこれは適用されません。
が使用されている場合、 と の間でPROT_READ
異なるはずのものは他に何もありません。実際、不特定の動作に関する上記の警告にもかかわらず、私の推測 (テストはしていません) では、実際には の下の 2 つの間にまったく違いはありません。MAP_PRIVATE
MAP_SHARED
PROT_READ
mmap
syscall は最終的にdo_mmap_pgoff
setup を呼び出しmmap_region
て実際の作業を行います。
フラグを通過してVM_SHARED
、共有マッピングかプライベート マッピングかを示しますvm_flags
。mmap_region
そこにdo_mmap_pgoff
は:
if (file)
{
switch (flags & MAP_TYPE)
{
case MAP_SHARED:
if ((prot&PROT_WRITE) && !(file->f_mode&FMODE_WRITE))
return -EACCES; /* error */
...
vm_flags |= VM_SHARED | VM_MAYSHARE;
if (!(file->f_mode & FMODE_WRITE))
vm_flags &= ~(VM_MAYWRITE | VM_SHARED);
/* fall through */
case MAP_PRIVATE:
...
break;
...
}
...
}
ファイルバッキングがあり、マッピングがあり、ファイルが読み取り専用の場合は、共有フラグMAP_SHARED
をオフにします。VM_SHARED
ただしVM_MAYSHARE
、これは動作を変更するために使用できるようにまだ設定されています。