Каково точное значение флага MS_INVALIDATE в msyn c? - PullRequest
0 голосов
/ 05 марта 2020

Прочитав руководство из msync, я думаю, что точное значение MS_INVALIDATE выглядит следующим образом:

При условии, что существует три процесса p1 p2 и p3 .

p1 и p2 оба используют mmap с MAP_SHARED для одновременного чтения и записи файла /tmp/data.txt.

p3 использует fread для чтения того же файла.

Предположим, что p1 изменили файл, p2 сразу увидим модификацию. Однако p3 с использованием fread не обязательно увидит модификацию.

Если p1 , позвоните msync с MS_INVALIDATE|MS_SYNC после модификации, тогда p3 с использованием fread означает SURE , чтобы увидеть модификацию. Вот и все значения флага MS_INVALIDATE.

Правильно ли мое понимание?

1 Ответ

1 голос
/ 09 марта 2020

AFAIK, на linux ядре, MS_INVALIDATE на самом деле мало что делает, это от мсин c. c

Единственное использование - эта проверка.

        /* Here vma->vm_start <= start < vma->vm_end. */
        if ((flags & MS_INVALIDATE) &&
                (vma->vm_flags & VM_LOCKED)) {
            error = -EBUSY;
            goto out_unlock;
        }

Раньше linux системы имели отдельные хранилища для ввода / вывода, поступающих через системные вызовы записи / чтения (так называемый буферный кэш), и другое (кэш страницы), на которое отображает mmap. Однако сейчас большинство систем на базе unix имеют глобальный унифицированный кеш, то есть, независимо от того, откуда поступает ввод / вывод, он попадает в один и тот же внутренний буфер памяти. Конечно, реализация намного сложнее, чем кажется, но MS_INVALIDATE кажется мне бесполезным на большинстве UNIX систем.

Некоторые ссылки: link1 link2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...