Im Linux-Kernel werden Semaphore verwendet, um kritische Abschnitte von Daten gegenseitig auszuschließen, und Abschlussvariablen werden verwendet, um zwischen zwei auf ein Ereignis wartenden Threads zu synchronisieren. Warum nicht Semaphore für eine solche Synchronisation verwenden? Gibt es einen Vorteil, eine Vervollständigungsvariable über ein Semaphor zu verwenden?
Es gibt zwei Gründe, warum Sie eine Vervollständigung anstelle eines Semaphors verwenden möchten. Erstens können mehrere Threads auf einen Abschluss warten, und sie können alle mit einem Aufruf von complete_all()
freigegeben werden. Es ist komplexer, wenn ein Semaphor eine unbekannte Anzahl von Threads aktiviert.
Zweitens, wenn der wartende Thread das Synchronisationsobjekt freigibt, gibt es eine Race-Bedingung, wenn Sie Semaphore verwenden. Das heißt, dass der Kellner aufgeweckt werden und das Objekt freigeben kann, bevor der Waking-Thread mit up()
ausgeführt wird. Diese Rasse existiert nicht für die Fertigstellung. (Siehe Lasses Beitrag.)
Erklärung, warum Komplettierungen ursprünglich implementiert wurden: Ссылка
Die grundlegende Zusammenfassung ist, dass wir das hatten (ziemlich häufig) Art zu warten bestimmte Ereignisse durch Sperren Semaphor auf dem Stapel des Kellners, und dann den Kellner machen lassen "down ()", wodurch es blockiert wurde bis das Ding, auf das es wartete, tat ein "up ()".
Das funktioniert ziemlich gut, aber es hat eine wirklich kleine (und ziemlich unwahrscheinliche) Rasse bei SMP ist das nicht so sehr ein Rennen von die Idee selbst, wie von der Implementierung der Semaphore. Wir hätte die Semaphore reparieren können, aber Es gab ein paar Gründe nicht zu:
- Die Semaphore sind (für den Nichtstreitfall) (absichtlich) optimiert. Die "Warten auf Fertigstellung" -Benutzung hat der umgekehrte Standardfall
- die Semaphore sind ziemlich involviert und architekturspezifisch genau aufgrund dieser Optimierung. Versuchen ändern sie ist schmerzhaft wie die Hölle.
Also habe ich stattdessen die Idee von "Warten auf die Fertigstellung":
Neueren Thread über Vervollständigungen vs Semaphoren Ссылка
Tags und Links linux linux-kernel operating-system