only のパラメーターを使用mmap(2)してファイルのを作成し、ファイルのバッキングも読み取り専用で変更されない場合、 と の間にパフォーマンスの違い (またはまったく違い) はありますか? カーネルは 2 つの間で何か違うことをしますか?protPROT_READMAP_SHAREDMAP_PRIVATE
(ドキュメンテーションでは、「更新」に関する動作の違いのみが言及されていますが、このままではPROT_READ更新はあり得ません。他に何か違いがあるのでしょうか?)
only のパラメーターを使用mmap(2)してファイルのを作成し、ファイルのバッキングも読み取り専用で変更されない場合、 と の間にパフォーマンスの違い (またはまったく違い) はありますか? カーネルは 2 つの間で何か違うことをしますか?protPROT_READMAP_SHAREDMAP_PRIVATE
(ドキュメンテーションでは、「更新」に関する動作の違いのみが言及されていますが、このままではPROT_READ更新はあり得ません。他に何か違いがあるのでしょうか?)
の下MAP_PRIVATEで、Linux マンページには、mmap() 呼び出し後にファイルに加えられた変更がマップされた領域に表示されるかどうかが指定されていないと記載されています。の場合はそうではありませんMAP_SHARED。したがって、マッピングの内容をファイルの内容と一緒に更新する必要がある場合は、MAP_SHARED. 基になるファイル自体が読み取り専用で変更できない場合は、もちろんこれは適用されません。
が使用されている場合、 と の間でPROT_READ異なるはずのものは他に何もありません。実際、不特定の動作に関する上記の警告にもかかわらず、私の推測 (テストはしていません) では、実際には の下の 2 つの間にまったく違いはありません。MAP_PRIVATEMAP_SHAREDPROT_READ
mmapsyscall は最終的にdo_mmap_pgoffsetup を呼び出し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、これは動作を変更するために使用できるようにまだ設定されています。