Ja, Sie können den gegenseitigen Ausschluss nur mit Anweisungen zum Laden und Speichern des Speichers implementieren. Es hat eine lange Tradition, sukzessive einfachere Lösungen für dieses Problem zu entwickeln.
Die früheste mir bekannte Version mit der Bezeichnung "Dekkers Lösung" wurde in Dijkstra, Edsger W .; "Cooperating Sequential Processes", F. Genuys, Hrsg., Programming Languages: NATO Advanced Study Institute , S. 43-112, Academic Press, 1968 . Seitdem gab es Dutzende von Lösungen. Ich werde nur einige der bemerkenswerteren diskutieren.
Lamport, Leslie; "Eine neue Lösung für Dijkstra's Concurrent Programming Problem", Comm ACM 17 (8): 453-455, 1974, führt den "Bäckereialgorithmus" ein (da er auf der Analogie von Personen basiert, die Zahlen zur Bestimmung der Reihenfolge verwenden, in der sie sich befinden werden im Bäckerladen serviert). Eines der besonders bemerkenswerten Merkmale dieses Algorithmus ist, dass er zeigt, dass überhaupt keine Hardware-Atomizität erforderlich ist, um das Problem des gegenseitigen Ausschlusses zu lösen. Lesevorgänge, bei denen überlappende Schreibvorgänge an dieselbe Stelle erfolgen, können einen beliebigen Wert zurückgeben, und der Algorithmus funktioniert weiterhin. Lamport diskutiert dies ein wenig in der Beschreibung des Papiers auf seiner Homepage .
Petersons Lösung, Peterson, GL; "Mythen über das Problem der gegenseitigen Ausgrenzung", Inf. Proc. Lette. , 12 (3): 115-116, 1981 , ist eine, die speziell dazu entworfen wurde, leicht zu verstehen und zu begründen. Schließlich ist Lamport, Leslie , ein besonderer Favorit von mir ; "Ein schneller Algorithmus zum gegenseitigen Ausschluss", ACM Trans. Comp. Sys. 5 (1), 1-11 (1987). In diesem Artikel versuchte Lamport, eine Lösung für das Problem des gegenseitigen Ausschlusses im (häufigen) Fall zu optimieren, dass für den kritischen Abschnitt wenig Streit besteht. Es garantiert gegenseitigen Ausschluss und Freiheit, aber keine Fairness. Es ist (glaube ich) der erste Algorithmus zum gegenseitigen Ausschluss, der nur normale Lese- und Schreibvorgänge verwendet und N Prozessoren in O (1) -Zeit synchronisieren kann, wenn keine Konflikte vorliegen. (Bei Konflikten wird auf einen O (N) -Test zurückgegriffen.) Er demonstriert informell, dass Sie im konkurrenzfreien Fall am besten sieben Speicherzugriffe durchführen können. (Dekker und Peterson machen es beide mit 4, aber sie können nur mit 2 Prozessoren umgehen. Wenn Sie ihre Algorithmen auf N erweitern, müssen sie zusätzliche O (N) -Zugriffe hinzufügen.)
Offensichtlich sind Menschen, die an dem Problem der Lösung gegenseitiger Ausgrenzung mit nur Gedächtnislesen und -schreiben arbeiten, frustriert darüber, dass andere Menschen das Problem und seine Lösungen (nicht) verstehen. Dies wird zum Teil durch den Titel von Petersons Artikel ("Mythen über das Problem der gegenseitigen Ausgrenzung") und zum Teil durch eine kurze Notiz belegt, die Lamport 1991 veröffentlichte: Lamport, Leslie; "Das Problem des gegenseitigen Ausschlusses wurde gelöst", Comm ACM 34 (1): 110, 1991 , das Lamport auf seiner Homepage etwas bitter beschreibt .
Zur Beantwortung Ihrer zweiten Frage: Nein. Es gibt mehr als drei Kategorien von Hardwarelösungen für das Problem des kritischen Abschnitts (nur Laden und Speichern ist eine, andere umfassen Vergleichs- und Austauschanweisungen, Laden-Verknüpfen / Speichern-Bedingt Anweisungen (Verwenden des Cache-Kohärenzprotokolls zum Testen der Atomizität) und Abrufen und Hinzufügen von Anweisungen.) In einem anderen Sinne gibt es nur eine Kategorie von Lösungen: diejenigen, bei denen eine Reihe von asynchronen Prozessen eine globale Reihenfolge von Ereignissen festlegen .
(Beachten Sie, dass diese Antwort eine (umfangreiche) Bearbeitung einer früheren Antwort ist, die ich für eine ganz andere Frage gegeben habe .)