Sì, è possibile implementare l'esclusione reciproca solo con il caricamento della memoria e le istruzioni di archiviazione. Esiste una lunga tradizione nell'elaborare soluzioni successivamente più semplici a questo problema.
La prima versione che conosco, chiamata "soluzione di Dekker", fu introdotta in Dijkstra, Edsger W .; "Cooperare processi sequenziali", in F. Genuys, ed., Linguaggi di programmazione: NATO Advanced Study Institute , pp. 43-112, Academic Press, 1968 . Da allora ci sono state decine di soluzioni. Discuterò solo alcuni dei più importanti.
Lamport, Leslie; "Una nuova soluzione del problema di programmazione concorrente di Dijkstra", Comm ACM 17 (8): 453-455, 1974 introduce l'algoritmo "Bakery" (perché si basa sull'analogia delle persone che prendono i numeri per determinare l'ordine in cui saranno servito nel negozio di panetteria). Una delle caratteristiche particolarmente notevoli di questo algoritmo è che dimostra che per risolvere il problema dell'esclusione reciproca non è richiesta alcuna atomicità hardware. Le letture che si sovrappongono alle scritture nella stessa posizione possono restituire qualsiasi valore e l'algoritmo funziona ancora. Lamport ne discute un po 'nella descrizione dell'articolo sulla sua home page .
La soluzione di Peterson, Peterson, GL; "Miti sul problema dell'esclusione reciproca", Inf. Proc. Lett. , 12 (3): 115-116, 1981 , è uno che è specificamente progettato per essere facile da capire e ragionare. Infine, uno dei miei preferiti in particolare è Lamport, Leslie; "Un rapido algoritmo di esclusione reciproca", ACM Trans. Comp. Sys. , 5 (1): 1-11, 1987. In questo articolo Lamport stava cercando di ottimizzare una soluzione al problema dell'esclusione reciproca nel caso (comune) che vi fosse poca contesa per la sezione critica. Garantisce l'esclusione reciproca e la libertà di deadlock, ma non l'equità. È (credo) il primo algoritmo di esclusione reciproca che utilizza solo letture e scritture normali in grado di sincronizzare N processori in O (1) in assenza di contese. (Quando c'è contesa, ricade su un test O (N).) Dà una dimostrazione informale che il meglio che puoi fare nel caso senza contesa sono sette accessi alla memoria. (Dekker e Peterson lo fanno entrambi con 4, ma possono gestire solo 2 processori, quando estendi i loro algoritmi a N devono aggiungere un ulteriore accesso O (N).)
Apparentemente le persone che lavorano sul problema di risolvere l'esclusione reciproca usando solo letture e scritture di memoria sono frustrate dalla (mancanza di) comprensione delle altre persone del problema e delle sue soluzioni. Ciò è dimostrato in parte dal titolo dell'articolo di Peterson ("Miti sul problema dell'esclusione reciproca") e in parte da una breve nota che Lamport ha pubblicato nel 1991: Lamport, Leslie; "Il problema dell'esclusione reciproca è stato risolto", Comm ACM 34 (1): 110, 1991 , che Lamport descrive in qualche modo amaramente sulla sua homepage .
Quindi, per rispondere alla tua seconda domanda: No. Esistono molte più di tre categorie di soluzioni a livello di hardware per il problema della sezione critica (usare solo carichi e negozi è uno, altri comportano istruzioni di confronto e scambio, carico-collegato / negozio-condizionale istruzioni (utilizzando il protocollo di coerenza della cache per verificare l'atomicità) e istruzioni di recupero e aggiunta. In un altro senso, esiste davvero solo una categoria di soluzioni: quelle che comportano l'acquisizione di un insieme di processi asincroni per concordare un ordine globale di eventi .
(Nota che questa risposta è una modifica (estesa) di una risposta precedente che ho dato per una domanda molto diversa .)