Ich lese gerade Fuss, Futexes und Furwocks: Fast Userland Locking unter Linux und bin auf dieses Zitat gestoßen :
In einem fairen Schließschema wird die Sperre in der Reihenfolge gewährt, in der sie angefordert wurde. Dies kann sich aufgrund der erhöhten Anzahl von Kontextwechseln negativ auf den Durchsatz auswirken. Gleichzeitig kann es zum sogenannten Konvoi-Problem kommen. Da die Sperren in der Reihenfolge ihres Eintreffens gewährt werden, werden alle mit der Geschwindigkeit des langsamsten Prozesses ausgeführt, wodurch alle Wartevorgänge verlangsamt werden. Eine übliche Lösung für das Konvoi-Problem bestand darin, das bei der Freigabe verfügbare Schloss zu markieren, alle Wartevorgänge zu aktivieren und sie erneut für das Schloss zu aktivieren. Dies wird als zufällige Fairness bezeichnet. Dies führt jedoch auch zu dem donnernden Herdenproblem. Trotzdem kann es auf Uniprozessorsystemen gut funktionieren, wenn die erste Aufgabe, die aktiviert wird, die Sperre aufhebt, bevor sie vorab festgelegt oder geplant wird, sodass das zweite Herdenmitglied die Sperre erhalten kann, usw.
Ich habe ein paar Fragen zu diesem Zitat.
Erstens: Führt ein faires Sperrschema zu einer erhöhten Anzahl von Kontextwechseln, da verschiedene Aufgaben Prozesse zu unterschiedlichen Zeiten in die Warteschlange stellen. Wenn also Prozesse in der Reihenfolge bedient werden, in der sie empfangen wurden, würden wir den Kontext zwischen mehreren Aufgaben wechseln.
Zweitens, wie führt das Gewähren von Sperren in der Reihenfolge des Eintreffens dazu, dass Prozesse mit der Geschwindigkeit des langsamsten Prozesses ablaufen? Wäre dies nicht nur der Fall, wenn dem langsamsten Prozess die Sperre vor den anderen Prozessen gewährt wird? Wie löst es das Konvoi-Problem, wenn Prozesse zufällig um die Sperre kämpfen?
Schließlich verstehe ich nicht, wie zufällige Fairness auf Uniprozessorsystemen im Vergleich zu Multiprozessorsystemen besser ist. In beiden Fällen werden zum Beispiel alle wartenden Prozessoren aufgeweckt, einer bekommt das Schloss und die anderen müssen wieder einschlafen, oder? Wie funktioniert das auf Uniprozessorsystemen?