Atomare Operationen: unter der Haube

8

Wie funktionieren atomare Operationen unter der Haube?

Sind Atomoperationen sozusagen "wartefrei"?

Ich suche nach einer Beschreibung des "kleinsten gemeinsamen Teilers" atomarer Operationen. Was teilen alle atomaren Operationen?

    
Pindatjuh 28.07.2011, 18:08
quelle

3 Antworten

4

Atomarität als Konzept tritt an mehreren Stellen auf, ich vermute, Sie denken über atomare Operationen im Code nach, aber es gibt andere Bedeutungen.

Eine Fundamantal-Eigenschaft einer Datenbanktransaktion ist Atomicity, siehe Beschreibung ACID Eigenschaften von Transaktionen.

In diesem Fall haben Sie eine Menge an Datenbank-Cleverness, Locks usw., was fast sicher bedeutet, dass Sie warten müssen, wenn zwei Threads der Kontrolle (oder zwei Prozesse) die gleichen Daten erhalten wollen.

Wenn Sie zu Codezeilen kommen, denke ich, dass Sie über eine Erklärung (in einer fiktiven Sprache) nachdenken.

%Vor%

in einem Thread

%Vor%

und in einem anderen

%Vor%

Können wir etwas darüber sagen, was der zweite Thread drucken wird? Wir könnten entweder 7 oder 25000 akzeptieren, wir wären weniger glücklich, eine Zahl zu erhalten, die das höherwertige Byte von 25.000 und ein niederwertiges Byte von 7 ist - was konzeptionell das Ergebnis einer nicht atomaren Ganzzahl-Zuweisung wäre.

>

Unterschiedliche Programmiersprachen können frei definieren, welche Semantik sie wünschen, es ist denkbar, dass einige einfach das natürliche Verhalten akzeptieren, an dem die CPU arbeitet (sagen wir 32 bit int war atomar, 64 lang nicht) oder sie könnten etwas viel tun klüger, und wenn die CPU selbst keine atomaren Operationen bereitstellt, dann sehe ich keine Alternative zu irgendeiner Art von Warten, wenn sie Atomizität vortäuschen wollen - z. Java synchronisiertes Schlüsselwort.

    
djna 28.07.2011, 18:20
quelle
8

Wenn wir von atomaren Operationen sprechen, die vom Synchronisationsmechanismus verwendet werden (Mutexe, Semaphore usw.), müssen sie vom Betriebssystem auf Einzel-CPU-Maschinen und von der Hardware auf Multi-CPU unterstützt werden.

Auf einer einzelnen CPU-Maschine kann eine Befehlssequenz "atomar" in dem Sinne gemacht werden, dass sie nicht in der Mitte unterbrochen werden kann (beispielsweise die Zeitgeberunterbrechung, die zu einem anderen Thread wechselt), wenn Interrupts abgeschaltet werden. Dies bedeutet, dass Synchronisationsprimitive ganz einfach geschrieben werden können, sobald die CPU in den Kernel-Modus eintritt und auf die Interrupt-Steuerregister zugreifen kann.

In einer Multi-Core-Maschine ist es komplexer. Dann müssen die Anweisungen über alle CPUs hinweg wirklich atomar sein. Dies erfordert alle CPUs, nicht nur die, die die atomaren Befehle ausführen, um relevante Teile ihres Cache in den RAM zu spülen. Diese Spülung macht die Synchronisation auf diesen Architekturen so teuer.

Die Anweisungen selbst nehmen die Form von "Bit test and set" in einem Vorgang an. Dies reicht aus, um einen einfachen Mutex zu implementieren. Selbst wenn zwei Threads auf verschiedenen CPUs / Kernen den Test ausführen und den Vorgang zur selben Zeit auf dieselbe Adresse setzen, erhält nur einer das Ergebnis, dass das Bit nicht gesetzt war und jetzt gesetzt ist. Dieser Thread ist derjenige, der den Mutex besitzt.

    
Anders Abel 28.07.2011 18:22
quelle
0

Hängt von der atomaren Operation ab, von der du sprichst. Wenn Sie über ISA-Level-Zeug reden, sind "Test und Set" -Anweisungen in einigen populären ISAs enthalten, denke ich.

    
Patrick87 28.07.2011 18:13
quelle

Tags und Links