Atomic Instruction
Was meinst du mit Atomaren Anweisungen?
Wie funktioniert das folgende Atomic?
TestAndSet
int TestAndSet(int *x){
register int temp = *x;
*x = 1;
return temp;
}
Aus der software-Perspektive, wenn man Sie nicht verwenden möchten, non-blocking synchronization primitives, wie kann man sicherstellen Unteilbarkeit des Unterrichts? ist es möglich nur an der Hardware oder einige Montage-Ebene Richtlinie Optimierung verwendet werden können?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Maschinenbefehle sind untrennbar atomic - zum Beispiel das Lesen und schreiben richtig ausgerichtet ist-Werte der nativen Prozessor-word-size ist atomic auf vielen Architekturen.
Dies bedeutet, dass hardware-interrupts, andere Prozessoren und hyper-threads, die nicht unterbrochen werden kann, die zu Lesen oder zu speichern und Lesen oder schreiben eines teilwertes an der gleichen Stelle.
Kompliziertere Dinge wie Lesen und schreiben zusammen atomar erreicht werden kann durch explizite Atomare Maschinenbefehle z.B. LOCK CMPXCHG auf x86.
Sperren und andere high-level-Konstrukte gebaut werden, auf diese Atomare primitive, die in der Regel nur Wache ein single-Prozessor-Wort.
Einige clevere gleichzeitige algorithmen gebaut werden kann, mit nur das Lesen und schreiben von Pointern z.B. in verknüpften Listen geteilt zwischen einem einzigen Leser und Schreiber, oder mit Mühe, mehrere Leser und Schreiber.
Atomic kommt aus dem griechischen ἄτομος (atomos) was bedeutet "unteilbar". (Vorsicht: ich spreche kein Griechisch, also vielleicht ist es wirklich etwas anderes, aber die meisten Englisch-Sprecher unter Berufung auf Etymologien interpretieren es auf diese Weise. 🙂
In computing, dies bedeutet, dass der Betrieb, nun, kommt vor. Es gibt keinen Zwischenzustand, die sichtbar ist, bevor es abgeschlossen ist. Also, wenn deine CPU unterbrochen wird, um service-hardware (IRQ), oder wenn eine andere CPU liest den gleichen Speicher, es hat keinen Einfluss auf das Ergebnis, und diese anderen Vorgänge beobachten, entweder als abgeschlossen oder noch nicht gestartet.
Als Beispiel... sagen wir, Sie wollten, um eine variable zu setzen, um etwas, aber nur, wenn es nicht gesetzt wurde, bevor. Man könnte geneigt sein, dies zu tun:
Aber was ist, wenn diese parallel laufen? Es könnte sein, dass das Programm holt
foo
, sehen es als null, derweil thread 2 kommt zusammen und tut das gleiche und setzt den Wert auf etwas. Zurück in den ursprünglichen thread, der code immer noch denkt, dassfoo
null ist, und die variable erhält zweimal vergeben.Für Fälle wie diese, die CPU enthält einige Anweisungen, die das können der Vergleich und der bedingte Zuordnung als eine Atomare Einheit. Daher, test-and-set, compare-and-swap-und load-linked/store-conditional. Sie können diese implementieren, sperren (Ihr Betriebssystem und Ihre C-Bibliothek gemacht hat.) Oder Sie können schreiben, ein-aus-algorithmen, die sich auf die primitive, etwas zu tun. (Es gibt Coole Sachen die hier gemacht werden, aber die meisten Normalsterblichen vermeiden, aus Angst, falsch verstanden haben.)
Atomarität ist ein wichtiges Konzept, wenn Sie haben irgendeine form von paralleler Verarbeitung (einschließlich der verschiedenen Anwendungen kooperieren oder teilen von Daten) mit freigegebenen Ressourcen.
Das problem ist gut illustriert mit einem Beispiel. Angenommen, Sie haben zwei Programme, die wollen, um eine Datei zu erstellen, aber nur, wenn die Datei nicht bereits vorhanden ist. Jede der zwei Programm erstellen können die Datei an einem beliebigen Punkt in der Zeit.
Wenn Sie das tun (werde ich C benutzen, da es ist, was ist in Ihrem Beispiel):
können Sie nicht sicher sein, dass das andere Programm noch nicht erstellt, die Datei zwischen Ihrem öffnen für Lesen und Ihr zum schreiben geöffnet werden.
Es gibt keine Weise können Sie tun dies auf Ihre eigenen, Sie benötigen Hilfe aus dem Betriebssystem, die in der Regel bieten syncronization-primitiven für diesen Zweck, oder eine andere Methode, die garantiert atomar sind (zum Beispiel eine relationale Datenbank, in der die lock-operation atomar ist, oder einen niedrigeren Ebene Mechanismus wie Prozessoren "test & set" - Anweisungen).
Unten sind einige meiner Hinweise auf die Atomarität, die helfen können Sie verstehen die Bedeutung. Die Notizen sind die Quellen aufgelistet, am Ende, und ich empfehle die Lektüre einige von Ihnen, wenn Sie brauchen eine Gründliche Erklärung eher als Punkt-form-Kugeln, die ich habe. Bitte jegliche Fehler, so dass ich Sie korrigieren.
Definition :
nie auf halbem Weg getan.
alle.
mutierte direkt, ohne "auf halbem Weg mutiert" Werte
Beispiel 1 : Atomare Operationen
Betrachten Sie die folgenden ganzen zahlen verwendet, die von verschiedenen threads :
Im obigen Beispiel werden zwei threads nutzen von X -, Y-und Z -
Beispiel 2 : Nicht-Atomare Operationen : ++/-- Operationen
Betrachten Sie die Inkrement - /Dekrement-Ausdrücke :
Operationen übersetzen :
Beispiel 3 - Nicht-Atomare Operationen : Werte, die größer als 4-Byte -
Schaffen wir Felder mit bestimmten Werten des Typs MyLong :
Ändern wir unsere Felder in separate threads ohne thread-Sicherheit :
In .NET, beim kopieren einen Wert geben, wird die CLR nicht an einen Konstruktor - es verschiebt die bytes einer atomaren operation zu einem Zeitpunkt,
Betrachten Sie die folgende Reihenfolge der Ausführung von Operationen :
Lesen und schreiben Werte, die größer sind als 32-bit auf mehrere threads auf einem 32-bit-Betriebssystem ohne Zusatz von irgendeine Art von Verriegelung, um die operation atomar ist, die wahrscheinlich zu korrupten Daten wie oben
Prozessor Operationen
Auf allen modernen Prozessoren, können Sie davon ausgehen, dass lese-und Schreibvorgänge der natürlich ausgerichtet nativen Typen sind atomar, solange :
Auf x86-und X64-es gibt keine Garantie, dass liest und schreibt, die größer als acht Byte sind Atomare
Sprache Unterschiede
C#
C++
Java
Quellen
http://www.evernote.com/shard/s10/sh/c2735e95-85ae-4d8c-a615-52aadc305335/99de177ac05dc8635fb42e4e6121f1d2
Unteilbarkeit kann nur garantiert werden, wenn das OS. Das OS nutzt die zugrunde liegende Prozessor verfügt, dies zu erreichen.
So erstellen Sie Ihre eigenen testandset Funktion ist unmöglich. (Obwohl ich bin mir nicht sicher, ob man die Verwendung einer inline-asm-snippet, und verwenden Sie die testandset Merksatz direkt (Könnte sein, dass diese Aussage kann nur gemacht werden mit OS Privilegien))
BEARBEITEN:
Laut den Kommentaren unter diesem post, dass Sie Ihr eigenes 'bittestandset' - Funktion mithilfe eines ASM-Richtlinie direkt möglich ist (auf intel x86). Allerdings, wenn diese tricks funktionieren auch auf anderen Prozessoren, ist nicht klar.
Ich stehe zu meinem Punkt: wenn Du möchtest, atmoic Dinge, die OS Funktionen und don ' T do it yourself