Warum spinlocks funktionieren nicht in Uniprozessor - (Einhorn -) Systeme?
Ich weiß, dass spinlocks arbeiten mit spining, verschiedene kernel Pfade existieren und Kernel präemptiv, also warum spinlocks funktionieren nicht in Uniprozessor-Systemen? (Beispiel für Linux)
- möglich, Duplikat der Ist spin-lock-sinnvoll in einem einheitlichen uni-Prozessor-core-Architektur?
- Es ist nicht so, dass spinlocks funktionieren nicht, es ist, dass Sie sehr verschwenderisch cpu-Zyklen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich Ihre Frage verstehe, fragst du dich, warum spin locks sind eine schlechte Idee, auf single-core-Maschinen.
Sollten Sie noch Arbeit, aber kann sehr viel teurer als echte thread-schlafen-Parallelität:
Wenn Sie ein spinlock, sind Sie im wesentlichen vorbringt, dass Sie nicht denken, Sie haben zu lange warten. Sie sagen, dass Sie denken, es ist besser zu pflegen, die Prozessorzeit, die Scheibe mit einer busy-loop als die Kosten der sleeping-thread und Kontext-Wechsel zu einem anderen thread oder Prozess. Wenn Sie warten müssen eine sehr kurze Zeit, können Sie schlafen und wieder geweckt werden fast sofort, aber die Kosten gehen nach oben und unten ist teurer als die nur darauf warten, um.
Dies ist eher OK zu sein, die auf multi-core-Prozessoren, da Sie viel besser die Parallelität der profile als single-core-Prozessoren. Auf multi-core-Prozessoren, zwischen schleifeniterationen, einige andere thread getroffen haben, die Pflege Ihrer Voraussetzung. Auf single-core-Prozessoren, ist es nicht möglich, dass jemand anderes könnte Ihnen geholfen haben - Sie haben gesperrt, bis die eine und einzige Kern.
Hier das problem, dass wenn Sie warten oder schlafen auf einem Schloss, Sie deuten auf das system, dass Sie nicht alles haben, was Sie noch brauchen, also sollte es gehen einige andere Sachen und kommen zurück, um Sie später. Mit einem spin-lock, Sie nie dem system mitteilen, so Sie es sperren, bis das warten für etwas anderes zu passieren - aber, mittlerweile, Sie sind halten, das gesamte system, also etwas anderes nicht passieren.
In der Natur der spinlock ist, dass es nicht deschedule der Prozess - stattdessen dreht es sich, bis der Prozess erwirbt das Schloss.
Auf einem Uniprozessor, wird es entweder unverzüglich die Sperre oder es spinnt immer - wenn die Sperre wird argumentiert, dann wird es nie eine Chance für den Prozess, die derzeit die Ressourcen um es aufzugeben. Spinlocks sind nur dann nützlich, wenn ein anderer Prozess ausgeführt werden können, während man dreht sich auf dem Schloss - was bedeutet Multiprozessor-Systeme.
gibt es in unterschiedlichen Ausführungen von spinlock:
In Uni-Prozessor
spin_lock_irqsave()
sollte verwendet werden, wenn Daten geteilt zwischen Prozess-Kontext-und interrupt-Kontext, wie in diesem Fall IRQ bekommt auch deaktiviert.spin_lock_irqsave()
unter allen Umständen funktioniert, aber teilweise weil Sie sicher sind, Sie sind auch ziemlich langsam.Für den Fall, dass Daten geschützt werden müssen zwischen verschiedenen CPUs, dann ist es besser, verwenden Sie die folgende Versionen sind diese billiger sind, als IRQs nicht bekommen, in diesem Fall deaktiviert:
In Uniprozessor-Systemen aufrufen
spin_lock_irqsave(&xxx_lock, flags);
hat den gleichen Effekt, wie das deaktivieren von interrupts, die den benötigten interrupt-Parallelität Schutz ohne unnötige SMP-Schutz. Jedoch, in Multiprozessor-Systemen ist dies deckt sowohl unterbrechen und SMP concurrency-Probleme.Spinlocks sind, durch Ihre Natur, gedacht für den Einsatz auf Multiprozessor-Systemen, obwohl ein Uniprozessor-workstation mit einem präemptiven kernel verhält sich wie SMP, soweit die Parallelität betrifft. Wenn Sie eine nonpreemptive-Uniprozessor-system jemals ging in eine Drehung auf einem Schloss, es würde Spinnen für immer; keinem anderen thread jemals in der Lage, um die CPU zu entsperren. Aus diesem Grund, spinlock-Operationen auf Uniprozessor-Systemen ohne preemption aktiviert werden optimiert, um nichts zu tun, mit Ausnahme von diejenigen, ändern Sie die IRQ-Maskierung-status. Wegen der Trennung, auch wenn Sie nie erwarten, dass Ihr code ausgeführt werden, auf einem SMP-system, die Sie noch brauchen, um zu implementieren eine ordnungsgemäße Verriegelung.
Ref:Linux-Gerätetreiber
Durch Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartma
Finden Sie die beiden folgenden Absatz in Betriebssystem Drei Leichte Stücke, die hilfreich sein könnten: