Sim, você pode implementar exclusão mútua apenas com instruções de carregamento e armazenamento de memória. Há uma longa tradição de desenvolver soluções sucessivamente mais simples para esse problema.
A versão mais antiga que eu conheço, chamada "solução de Dekker", foi introduzida em Dijkstra, Edsger W .; "Cooperating sequential process", em F. Genuys, ed., Programming Languages: NATO Advanced Study Institute , pp. 43-112, Academic Press, 1968 . Existem dezenas de soluções desde então. Vou discutir apenas alguns dos mais notáveis.
Lamport, Leslie; "Uma nova solução do problema de programação simultânea de Dijkstra", Comm ACM 17 (8): 453-455, 1974 introduz o "algoritmo de padaria" (porque é baseado na analogia de pessoas que recebem números para determinar a ordem em que serão servido na padaria). Uma das características particularmente notáveis desse algoritmo é que ele demonstra que nenhuma atomicidade de hardware é necessária para resolver o problema de exclusão mútua. As leituras que sobrepõem gravações no mesmo local podem retornar qualquer valor e o algoritmo ainda funciona. Lamport discute isso um pouco na descrição do artigo em sua home page .
Solução de Peterson, Peterson, GL; "Mitos sobre o problema da exclusão mútua", Inf. Proc. Lett. , 12 (3): 115-116, 1981 , é aquele especificamente projetado para ser fácil de entender e raciocinar. Finalmente, um dos meus favoritos em particular é Lamport, Leslie; "Um algoritmo de exclusão mútua rápida", ACM Trans. Comp. Sys. , 5 (1): 1-11, 1987. Neste artigo, Lamport estava tentando otimizar uma solução para o problema de exclusão mútua no caso (comum) de que há pouca contenção para a seção crítica. Garante exclusão mútua e liberdade de impasse, mas não justiça. É (acredito) o primeiro algoritmo de exclusão mútua usando apenas leituras e gravações normais que podem sincronizar N processadores no tempo O (1) quando não há contenção. (Quando há contenção, ele recorre a um teste O (N).) Ele dá uma demonstração informal de que o melhor que você pode fazer no caso sem contenção é sete acessos à memória. (Dekker e Peterson fazem isso com 4, mas eles só podem manipular 2 processadores, quando você estende seus algoritmos para N, eles precisam adicionar um acesso extra de O (N).)
Aparentemente, as pessoas que trabalham no problema de solucionar a exclusão mútua usando apenas leituras e gravações de memória ficam frustradas com a (falta de) compreensão de outras pessoas sobre o problema e suas soluções. Isso é demonstrado em parte pelo título do artigo de Peterson ("Mitos sobre o problema da exclusão mútua") e em parte por uma breve nota que Lamport publicou em 1991: Lamport, Leslie; "O problema da exclusão mútua foi resolvido", Comm ACM 34 (1): 110, 1991 , que Lamport descreve um tanto amargamente em sua página inicial .
Portanto, para responder à sua segunda pergunta: Não. Existem muitas mais de três categorias de soluções no nível de hardware para o problema de seção crítica (usar apenas cargas e lojas é uma, outras envolvem instruções de comparação e troca, vinculadas à carga / condicionais à loja instruções (usando o protocolo de coerência de cache para testar a atomicidade) e instruções de busca e adição.) Em outro sentido, há realmente apenas uma categoria de soluções: aquelas que envolvem a obtenção de vários processos assíncronos para concordar com uma ordem global de eventos. .
(Observe que esta resposta é uma edição (extensa) de uma resposta anterior que dei para uma pergunta muito diferente .)