Блокировка свободы / атомарные операции между двумя процессами вместо потоков
Я делюсь некоторыми данными между несколькими процессами, используя общую память; Я использую межпроцессные мьютексы для достижения синхронизации.
Мой вопрос заключается в следующем: возможно ли использовать структуры данных без блокировки И / ИЛИ атомарные операции для достижения более быстрой синхронизации без использования взаимных исключений между двумя процессами?
Если нет, то знаете ли вы, что является основной причиной этого?
Они используются только для синхронизации потоков одного и того же процесса. Являются ли эти концепции переносимыми на процессы? Если нет, знаете ли вы какой-нибудь более быстрый способ обмена / синхронизации данных между процессами?
2 ответа
Являются ли эти концепции переносимыми на процессы?
Да, атомарные операции универсальны как для потоков, так и для процессов, IIF атомная память используется совместно.
Атомарная операция - это специфическая инструкция самого процессора, и она ничего не знает о потоках или процессах, это просто комплекс действий "все или ничего" (неделимый) (чтение, сравнение, сохранение) с аппаратной реализацией низкого уровня.
Таким образом, вы можете настроить разделяемую память между процессами и поместить в нее atomic_t.
безблокировочного
Да, если без блокировки реализовано только с атомарным. (Должно)
структуры данных
Вы должны убедиться, что разделяемая память отображается на один и тот же адрес в обоих процессах, когда она используется для хранения указателей (в структурах данных).
Если память будет сопоставлена с другим адресом, указатели будут нарушены в другом процессе. В этом случае вам нужно использовать относительные адреса и выполнять простой перевод памяти.
межпроцессные мьютексы
И я должен сказать, что glibc>2.4 (NPTL) использует futex в сочетании с атомарными операциями для неконтролируемой блокировки (для общих мьютексов процесса = мьютексов процесса). Итак, вы уже используете атомарные операции в разделяемой памяти.
На платформе x86 с NPTL большинство примитивов синхронизации используют в качестве быстрого пути только одну блокированную операцию с полным барьером памяти. Поскольку платформы x86 на самом деле не имеют ничего более легкого, они уже являются лучшим из того, что вы можете сделать. Если существующие атомарные операции не сделают именно то, что вам нужно, не будет никакого повышения производительности, чтобы окупить затраты на использование семантически более легкого примитива.