Да, вы можете реализовать взаимное исключение только с помощью загрузки памяти и сохранения инструкций. Существует давняя традиция разработки последовательно более простых решений этой проблемы.
Самая ранняя из известных мне версий, называемая «решением Деккера», была представлена в Dijkstra, Edsger W .; «Сотрудничество последовательных процессов», в F. Genuys, ed. Языки программирования: Институт перспективных исследований НАТО , стр. 43-112, Academic Press, 1968 . С тех пор было множество решений. Я буду обсуждать только некоторые из наиболее заметных.
Лампорт, Лесли; «Новое решение проблемы параллельного программирования Дейкстры», Comm ACM 17 (8): 453-455, 1974, вводит «Алгоритм пекарни» (потому что он основан на аналогии людей, принимающих числа, чтобы определить порядок, в котором они будут подается в булочной). Одна из особенно заметных особенностей этого алгоритма заключается в том, что он демонстрирует, что для решения проблемы взаимного исключения вообще не требуется аппаратная атомарность. Читает, что перекрывающиеся записи в одно и то же местоположение могут вернуть любое значение, и алгоритм все еще работает. Лэмпорт обсуждает это немного в описании статьи на своей домашней странице .
Решение Петерсона, Peterson, GL; «Мифы о проблеме взаимного исключения», инф. Proc. Lett. , 12 (3): 115-116, 1981 , это тот, который специально разработан, чтобы быть легким для понимания и рассуждений. Наконец, мой любимый Лампорт, Лесли; «Быстрый алгоритм взаимного исключения», ACM Trans. Комп. Sys. 5 (1): 1-11, 1987, В этой статье Лэмпорт пытался оптимизировать решение проблемы взаимного исключения в (общем) случае, когда для критической секции мало споров. Это гарантирует взаимное исключение и тупиковую свободу, но не справедливость. Это (я считаю) первый алгоритм взаимного исключения, использующий только обычные операции чтения и записи, которые могут синхронизировать N процессоров за O (1) время, когда нет конфликтов. (Когда возникает конфликт, он возвращается к тесту O (N).) Он дает неофициальную демонстрацию того, что лучшее, что вы можете сделать в случае отсутствия конкуренции, - это семь обращений к памяти. (Деккер и Петерсон оба делают это с 4, но они могут обрабатывать только 2 процессора, когда вы расширяете их алгоритмы до N, они должны добавить дополнительные O (N) доступы.)
Очевидно, что люди, которые работают над проблемой решения взаимного исключения с использованием только памяти, читают и пишут, разочарованы (нехваткой) понимания другими людьми проблемы и ее решений. Это частично подтверждается названием статьи Петерсона («Мифы о проблеме взаимного исключения») и частично краткой заметкой, опубликованной Лампортом в 1991 году: Лампорт, Лесли; «Проблема взаимного исключения была решена», Comm ACM 34 (1): 110, 1991 , которую Лампорт несколько горько описывает на своей домашней странице .
Итак, чтобы ответить на ваш второй вопрос: Нет. Существует более трех категорий аппаратных решений для решения проблемы критической секции (использование только загрузок и хранилищ - это одна, другие включают инструкции сравнения и замены, связанные с нагрузкой / условно сохраненные). инструкции (использующие протокол когерентности кэша для проверки на атомарность) и инструкции извлечения и добавления.) В другом смысле на самом деле существует только одна категория решений: те, которые предполагают получение группы асинхронных процессов для согласования глобального порядка событий. ,
(Обратите внимание, что этот ответ является (обширным) редактированием более раннего ответа, который я дал на совершенно другой вопрос .)