wie kann ich umwandeln nicht atomic operation, atomic
Ich versuche zu verstehen, Atomare und nicht Atomare Operationen.Mit Bezug auf das Betriebssystem und auch mit Bezug auf C.
Gemäß der wikipedia-Seite hier
Betrachten Sie einen einfachen Zähler, der die verschiedenen Prozesse erhöhen.
Nicht-atomaren
Den naiven, nicht-Atomare Umsetzung:
liest den Wert in der Speicherstelle;
fügt man den Wert;
schreibt den neuen Wert zurück in den Speicher.
Nun, stellen Sie sich zwei Prozesse, die ausgeführt werden Inkrementieren eines einzelnen shared memory location:
der erste Prozess liest den Wert in Speicherstelle;
der erste Prozess fügt man den Wert;
aber bevor Sie können, schreiben Sie den neuen Wert zurück auf die memory location, in der es ausgesetzt ist, und der zweite Prozess ausgeführt werden darf:
der zweite Prozess liest den Wert im Speicher, der denselben Wert wie der erste Prozess Lesen;
der zweite Prozess fügt man den Wert;
der zweite Prozess schreibt den neuen Wert in den Speicherbereich.
Wie kann die obige operation ein atmoic Betrieb.
Mein Verständnis atomarer Vorgang ist, dass jede Sache, die ausgeführt wird, ohne Unterbrechung atomar ist.
So zum Beispiel
int b=1000;
b+=1000;
Sollte eine Atomare operation sein gemäß meinem Verständnis, da sowohl die Anweisungen ausgeführt, ohne eine Unterbrechung,wie auch immer, ich habe von jemandem, der in C ist nichts bekannt, die als Atomare operation, also über beide Aussagen sind nicht atomic.
Also, was ich verstehen will ist, was ist die Atomarität ist anders, wenn es um Programmier-Sprachen Betriebssysteme?
warum ist asm die Antwort?
Heffernan, wenn Sie wissen wollen, und die Kontrolle der Ausführung, die Sie verwenden müssen, asm, sonst werden bei den Compilern Barmherzigkeit.
die meisten Menschen nutzen die Bibliotheken in der Tat
Heffernan geht hier -1 für die klare Einsicht
InformationsquelleAutor Registered User | 2011-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
gedreht wird in mehreren Stellungnahmen auf Weisung Ebene. Zumindest die Vorbereitung ein register oder Speicher, die Zuordnung von 1000, dann bekommen Sie den Inhalt dieses Registers/Speicher, hinzufügen von 1000, um den Inhalt, und re-Zuweisung den neuen Wert (2000) zu registrieren. Ohne sperren, das OS kann die Aussetzung der Prozess - /thread-an jedem Punkt in diesem Vorgang. Darüber hinaus multiproc-Systeme, einen anderen Prozessor zugreifen konnten, dass der Speicher (wäre nicht ein register, in diesem Fall), während Ihr Vorgang ist in Bearbeitung.
Wenn Sie ein lock-out ist (was Sie machen würde, diese atomaren), Sie sind zum Teil informiert die OS, dass es nicht ok auszusetzen, dieser Prozess/thread, und, dass dieser Speicher nicht zugegriffen werden soll, die durch andere Prozesse.
Nun der obige code würde wahrscheinlich optimiert werden, indem der compiler für eine einfache Zuordnung der 2000 den Speicherort für b, aber ich Ignoriere, dass für die Zwecke dieser Antwort.
InformationsquelleAutor Jim Deville
C99 keinen Weg, um Variablen atomic mit Bezug auf andere threads. C99 hat kein Konzept von mehreren Ausführungsthreads. Daher müssen Sie die Verwendung von compiler-spezifischen Erweiterungen und/oder CPU-level-Anweisungen zu erreichen Unteilbarkeit.
Die nächste C-standard, derzeit bekannt als C1x, gehören Atomare Operationen.
Selbst dann, bloße Atomarität nur garantiert, dass eine operation atomar ist, es garantiert nicht, wenn Sie, dass der Betrieb sichtbar auf anderen CPUs. Zu erreichen ist die Sichtbarkeit gewährleistet, in C99 würden Sie brauchen, um zu studieren Ihre CPU-Speicher-Modell, und möglicherweise verwenden Sie eine spezielle Art von CPU-Instruktionen bekannt als Zäune oder memory-Barrieren. Sie müssen auch sagen, der compiler darüber, mit einigen compiler-spezifischen compiler-Barriere. C1x definiert mehrere Speicher kauft, und wenn Sie eine Atomare operation können Sie entscheiden, welche Speicher der Bestellung zu verwenden.
Einige Beispiele:
All dies ist so Komplex, wie es scheint, so dass Sie sollten in der Regel stick an Mutexe, das macht die Sache einfacher.
InformationsquelleAutor ninjalj
b+=1000
zusammengestellt, auf allen Systemen, die ich kenne, um mehrere Anweisungen. Es ist also nicht atomar.Sogar
b=1000
kann nicht atomic, obwohl Sie hart arbeiten müssen, konstruieren Sie eine situation, wo es ist nicht atomar.In der Tat C hat kein Konzept von threads und so gibt es nichts, das ist atomic in C. Sie brauchen um sich auf die Umsetzung von spezifischen details Ihrer compiler und tools.
Nein, ich meine nicht, zu sagen, dass
so ist eine von
int b;
oderb=1000;
atomic?int b nicht Anweisungen erzeugen, so dass die Frage sinnlos ist. Nichts in C ist garantiert atomar.
Benutzer: Ob
b = 1000
atomar ist, hängt von der CPU und eventuell auf b Ausrichtung und Größe. Selbst dann, Sie können nicht (oder sehr schwach) Sichtbarkeit garantiert.InformationsquelleAutor David Heffernan
Die oben genannten Aussagen sind nicht atomic, weil es wird eine move-Anweisung zu laden b in ein register (wenn es nicht), dann fügen Sie 1000 und den laden wieder in Erinnerung. Viele instruction-sets ermöglichen für Atomarität durch Atomare Inkrement einfachste als x86 mit Schloss addl dest, src; einige andere Befehlssätze verwenden, cmpxchg, um das gleiche Ergebnis zu erzielen.
InformationsquelleAutor Jesus Ramos
Ich bin ein wenig verwirrt von dieser Frage. Was meinst du genau? Die Atomarität Konzept ist das gleiche sowohl in prog. Sprachen und OS.
Bezüglich der Unteilbarkeit und der Sprache, hier ist zum Beispiel ein link über die Unteilbarkeit in JAVA, das kann Ihnen eine andere Perspektive: Welche Operationen in Java werden als atomar?
InformationsquelleAutor Marc Polizzi