История изменений
Исправление SZT, (текущая версия) :
Технически происходит следующее:
- файл mmap-ится в память несколькими процессами в режиме read-only.
- один из процессов обновляет фрагмент файла, например через pwrite() или writev() и затем инвалидирует mmap и/или кэш CPU.
- все процессы видят изменения в своих mmap-регионах.
Так вот, проблема в том, что на OpenBSD третий пункт выполняется не всегда. Даже если явно пнуть ядро посредством msync(MS_INVALIDATE).
Т.е. куча процессов должны читать-писать в какой-то общий файл, притом надо уметь делать это одновременно и через файловые дескрипторы, и через память(отображенный в память файл)? А зачем так делать вообще?
Исправление SZT, :
Технически происходит следующее:
- файл mmap-ится в память несколькими процессами в режиме read-only.
- один из процессов обновляет фрагмент файла, например через pwrite() или writev() и затем инвалидирует mmap и/или кэш CPU.
- все процессы видят изменения в своих mmap-регионах.
Так вот, проблема в том, что на OpenBSD третий пункт выполняется не всегда. Даже если явно пнуть ядро посредством msync(MS_INVALIDATE).
Т.е. куча процессов должны читать-писать в какой-то общий файл, притом надо уметь делать это одновременно и через файловые дескрипторы, и через отображенную в память файл? А зачем так делать вообще?
Исправление SZT, :
Технически происходит следующее:
- файл mmap-ится в память несколькими процессами в режиме read-only.
- один из процессов обновляет фрагмент файла, например через pwrite() или writev() и затем инвалидирует mmap и/или кэш CPU.
- все процессы видят изменения в своих mmap-регионах.
Так вот, проблема в том, что на OpenBSD третий пункт выполняется не всегда. Даже если явно пнуть ядро посредством msync(MS_INVALIDATE).
Т.е. куча процессов должны читать-писать в какой-то общий регион памяти, притом надо уметь делать это одновременно и через файловые дескрипторы, и через отображенную в память файл? А зачем так делать вообще?
Исходная версия SZT, :
Технически происходит следующее:
- файл mmap-ится в память несколькими процессами в режиме read-only.
- один из процессов обновляет фрагмент файла, например через pwrite() или writev() и затем инвалидирует mmap и/или кэш CPU.
- все процессы видят изменения в своих mmap-регионах.
Так вот, проблема в том, что на OpenBSD третий пункт выполняется не всегда. Даже если явно пнуть ядро посредством msync(MS_INVALIDATE).
Т.е. куча процессов должны читать-писать в какой-то общий регион памяти, притом делать это одновременно и через файловые дескрипторы, и через отображенную в память файл? А зачем так делать вообще?