Есть ли разница между mmap MAP_SHARED и MAP_PRIVATE, когда PROT_READ также используется? - программирование

Есть ли разница между mmap MAP_SHARED и MAP_PRIVATE, когда PROT_READ также используется?

Если я создаю mmap(2) файла с параметром prot только PROT_READ, а поддержка файла также доступна только для чтения и не изменяется, есть ли разница в производительности (или любая разница вообще ) между MAP_SHARED и MAP_PRIVATE? Будет ли ядро ​​делать что-то другое между двумя?

(Документация относится только к различию поведения в терминах "обновлений", но поскольку это PROT_READ, не может быть никаких обновлений. Интересно, есть ли другая разница?)

4b9b3361

Ответ 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 по-прежнему установлен, поэтому его можно использовать для изменения поведения.