При использовании mmap()
для разделяемой памяти (из Linux или других UNIX-подобных систем) возможно ли (и переносимо) использовать fcntl()
(или функции flock()
или lockf()
) для координации доступа к отображению?
Ответы на этот вопрос SO кажется, что это должно работать.
Идея, которую я имею в виду, состоит в том, чтобы общая память была структурирована с помощью карты процесса/страницы, чтобы свести к минимуму конфликты при блокировке. Процессы могли бы работать со своими страницами одновременно, и блокировку нужно было бы получить только при обновлении сопоставлений процессов и страниц. (Доступ на чтение с не принадлежащих страниц будет включать проверку серийного номера, копирование нужных данных, а затем проверку того, что серийный номер этого блока не изменился).
Концептуально каждый процесс, совместно использующий это сопоставление файлов, будет выполнять mmap()
, находить в нем свободный блок, получать блокировку области процесса/страницы, обновлять ее своим собственным назначением, снимать блокировку и затем весело продолжать свою работу. Любой процесс может искать устаревшие сопоставления (используя kill()
с нулем в качестве сигнала) и очищать сопоставление таблицы процесс/страница.
(Грубо говоря, я играю с механизмом обработки производитель/потребитель, использующим общую память из Python по сравнению с Linux; я хотел бы, чтобы решение было переносимым на BSD и на другие языки программирования --- до тех пор, пока поддержка mmap()
и необходимые интерфейсы для fcntl()
, flock()
или lockf().
. Мне также был бы интересен псевдокод, показывающий, как можно измерять конфликты блокировок и обнаруживать любые сбои синхронизации. Я знаю, что threading и многопроцессорная обработка с их соответствующими Queue()
объектами — самый простой способ реализовать модель обработки Python-производителя/потребителя).