Есть ли разница между mmap MAP_SHARED и MAP_PRIVATE, когда PROT_READ также используется?
Если я создаю mmap(2)
файла с параметром prot
только PROT_READ
, а поддержка файла также доступна только для чтения и не изменяется, есть ли разница в производительности (или любая разница вообще ) между MAP_SHARED
и MAP_PRIVATE
? Будет ли ядро делать что-то другое между двумя?
(Документация относится только к различию поведения в терминах "обновлений", но поскольку это PROT_READ
, не может быть никаких обновлений. Интересно, есть ли другая разница?)
Ответы
Ответ 1
В MAP_PRIVATE
на странице руководства Linux указано, что неуказано, будут ли изменения, внесенные в файл после вызова mmap(), видны в отображаемой области. Это не относится к MAP_SHARED
. Поэтому, если вам необходимо обновить содержимое сопоставления вместе с содержимым файла, вам лучше использовать MAP_SHARED
. Если основной файл сам по себе доступен только для чтения и не может измениться, то, конечно, ничто из этого не применимо.
Если используется PROT_READ
, я не вижу ничего другого, что должно отличаться между MAP_PRIVATE
и MAP_SHARED
. На самом деле, несмотря на вышеописанное предупреждение о неуказанном поведении, моя догадка (которую я не тестировал) будет состоять в том, что на практике между ними нет никаких различий в PROT_READ
.
Ответ 2
Syscall mmap
в конечном итоге вызывает do_mmap_pgoff
для установки вызова 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
по-прежнему установлен, поэтому его можно использовать для изменения поведения.