Oui, vous pouvez implémenter l'exclusion mutuelle avec uniquement des instructions de chargement de mémoire et de stockage. Il existe une longue tradition de conception de solutions successivement plus simples à ce problème.
La première version que je connaisse, appelée "la solution de Dekker", a été introduite à Dijkstra, Edsger W .; «Cooperating sequential process», dans F. Genuys, éd., Programming Languages: NATO Advanced Study Institute , pp. 43-112, Academic Press, 1968 . Il y a eu des dizaines de solutions depuis lors. Je ne discuterai que de quelques-uns des plus notables.
Lamport, Leslie; "Une nouvelle solution du problème de programmation simultanée de Dijkstra", Comm ACM 17 (8): 453-455, 1974 introduit "l'algorithme de boulangerie" (car il est basé sur l'analogie des personnes prenant des nombres pour déterminer l'ordre dans lequel elles seront servi à la boulangerie). L'une des caractéristiques particulièrement remarquables de cet algorithme est qu'il démontre qu'aucune atomicité matérielle n'est requise pour résoudre le problème d'exclusion mutuelle. Les lectures qui chevauchent les écritures au même emplacement peuvent renvoyer n'importe quelle valeur et l'algorithme fonctionne toujours. Lamport en discute un peu dans la description du document sur sa page d'accueil .
La solution de Peterson, Peterson, GL; "Mythes sur le problème de l'exclusion mutuelle", Inf. Proc. Lett. , 12 (3): 115-116, 1981 , est spécifiquement conçu pour être facile à comprendre et à raisonner. Enfin, un de mes favoris en particulier est Lamport, Leslie; «Un algorithme d'exclusion mutuelle rapide», ACM Trans. Comp. Sys. , 5 (1): 1-11, 1987. Dans cet article, Lamport essayait d'optimiser une solution au problème d'exclusion mutuelle dans le cas (commun) où il y avait peu de conflits pour la section critique. Il garantit l'exclusion mutuelle et la liberté de l'impasse, mais pas l'équité. C'est (je crois) le premier algorithme d'exclusion mutuelle utilisant uniquement des lectures et des écritures normales qui peut synchroniser N processeurs en temps O (1) lorsqu'il n'y a pas de conflit. (Lorsqu'il y a conflit, il retombe sur un test O (N).) Il donne une démonstration informelle que le mieux que vous puissiez faire dans le cas sans conflit est de sept accès à la mémoire. (Dekker et Peterson le font tous les deux avec 4, mais ils ne peuvent gérer que 2 processeurs, lorsque vous étendez leurs algorithmes à N, ils doivent ajouter un accès O (N) supplémentaire.)
Apparemment, les gens qui travaillent sur le problème de la résolution de l'exclusion mutuelle en utilisant uniquement les lectures et les écritures de mémoire sont frustrés par la compréhension (insuffisante) des autres du problème et de ses solutions. Ceci est démontré en partie par le titre de l'article de Peterson ("Mythes sur le problème d'exclusion mutuelle") et en partie par une courte note que Lamport a publiée en 1991: Lamport, Leslie; "Le problème d'exclusion mutuelle a été résolu", Comm ACM 34 (1): 110, 1991 , que Lamport décrit un peu amèrement sur sa page d'accueil .
Donc, pour répondre à votre deuxième question: Non. Il existe bien plus de trois catégories de solutions de niveau matériel au problème de la section critique (en utilisant uniquement les charges et les magasins en est une, d'autres impliquent des instructions de comparaison et d'échange, liées à la charge / conditionnelles au magasin instructions (en utilisant le protocole de cohérence du cache pour tester l'atomicité) et les instructions de récupération et d'ajout.) Dans un autre sens, il n'y a vraiment qu'une seule catégorie de solutions: celles qui impliquent d'obtenir un tas de processus asynchrones pour convenir d'un ordre global des événements .
(Notez que cette réponse est une modification (complète) d'une réponse antérieure que j'ai donnée pour une question très différente .)