@@ -7,8 +7,8 @@ Der Brain Fuck Scheduler (BFS) wurde als bewusst einfach gehaltener Gegenentwurf
...
@@ -7,8 +7,8 @@ Der Brain Fuck Scheduler (BFS) wurde als bewusst einfach gehaltener Gegenentwurf
Im Gegensatz zum CFS, der für jede CPU einen eigenen Scheduler verwendet, werden beim BFS alle lauffähigen Prozesse in einer einzigen globalen doppelt verketteten Liste verwaltet (vgl. \[8\]). Eine unter den CPUs geteilte Runqueue hat den Vorteil, dass Prozesse schnell von überlasteten auf weniger ausgelasteten CPU-Kernen verlagert werden können (vgl. \[8\]). Dadurch wird eine niedrige Latenz und gute Performance bei kleinem bis mittlerem CPU-Count erzielt (vgl. \[10\]).
Im Gegensatz zum CFS, der für jede CPU einen eigenen Scheduler verwendet, werden beim BFS alle lauffähigen Prozesse in einer einzigen globalen doppelt verketteten Liste verwaltet (vgl. \[8\]). Eine unter den CPUs geteilte Runqueue hat den Vorteil, dass Prozesse schnell von überlasteten auf weniger ausgelasteten CPU-Kernen verlagert werden können (vgl. \[8\]). Dadurch wird eine niedrige Latenz und gute Performance bei kleinem bis mittlerem CPU-Count erzielt (vgl. \[10\]).
Das Einfügen eines Prozesses in diese Liste besitzt eine konstante Laufzeit von O(1), während die Auswahl des nächsten Prozesses jedoch im ungünstigsten Fall eine vollständige Durchsuchung der Liste erfordert und somit eine lineare Laufzeit von O(n) besitzt. Bei sehr vielen Vorgängen wirkt sich dies jedoch negativ auf die Laufzeit, des BFS aus (vgl. \[8\], \[9\]).
Das Einfügen eines Prozesses in diese Liste besitzt eine konstante Laufzeit von O(1), während die Auswahl des nächsten Prozesses jedoch im ungünstigsten Fall eine vollständige Durchsuchung der Liste erfordert und somit eine lineare Laufzeit von O(n) besitzt. Bei sehr vielen Vorgängen wirkt sich dies negativ auf die Laufzeit des BFS aus (vgl. \[8\], \[9\]).
Jeder Prozess besitzt neben seiner Priorität eine Zeitscheibe und eine sogenannte „virtual deadline“. Diese beschreibt die maximale Zeit, die ein Task im Vergleich zu einem anderen Vorgang gleicher Priorität warten muss, bis er zum ersten Mal oder erneut CPU-Zeit erhält. Im Unterschied zur virtuellen Laufzeit des CFS stellt diese Deadline keinen kontinuierlichen Fairness-Wert dar. „Virtual“ verdeutlicht, dass keine zeitliche Garantie für die Ausführung besteht. Prozesse mit einer früheren virtuellen Deadline werden früher eingeplant als welche mit höherer (vgl. \[8\], \[9\]).
Jeder Prozess besitzt neben seiner Priorität eine Zeitscheibe und eine „virtual deadline“. Diese beschreibt die maximale Zeit, die ein Task im Vergleich zu einem anderen Vorgang gleicher Priorität warten muss, bis er zum ersten Mal oder erneut CPU-Zeit erhält. Im Unterschied zur virtuellen Laufzeit des CFS stellt diese Deadline keinen kontinuierlichen Fairness-Wert dar. „Virtual“ verdeutlicht, dass keine zeitliche Garantie für die Ausführung besteht. Prozesse mit einer früheren virtuellen Deadline werden früher eingeplant als welche mit höherer (vgl. \[8\], \[9\]).
Prozesse mit höherer Priorität erhalten entsprechend frühere virtuelle Deadlines, somit rücken sie in der Runqueue weiter nach vorne und erhalten damit schneller CPU-Zeit. Auf diese Weise entsteht Fairness innerhalb gleicher Prioritätsstufen sowie eine gezielte Bevorzugung höherer priorisierter Prozesse. Wird die Zeitscheibe eines Prozesses nach dem Aufruf vollständig aufgebraucht, wird er gemäß dem beschriebenen Verfahren erneut in die Runqueue einsortiert. Mit der Verwendung einer einzigen globalen Runqueue besitzt BFS im Vergleich zum CFS jedoch eine geringe Skalierbarkeit. Dadurch verschlechtert sich die Performance deutlich bei mehrkernigen oder parallelen Systemen (vgl. \[11\]).
Prozesse mit höherer Priorität erhalten entsprechend frühere virtuelle Deadlines, somit rücken sie in der Runqueue weiter nach vorne und erhalten damit schneller CPU-Zeit. Auf diese Weise entsteht Fairness innerhalb gleicher Prioritätsstufen sowie eine gezielte Bevorzugung höherer priorisierter Prozesse. Wird die Zeitscheibe eines Prozesses nach dem Aufruf vollständig aufgebraucht, wird er gemäß dem beschriebenen Verfahren erneut in die Runqueue einsortiert. Mit der Verwendung einer einzigen globalen Runqueue besitzt der BFS im Vergleich zum CFS jedoch eine geringe Skalierbarkeit. Dadurch verschlechtert sich die Performance deutlich bei mehrkernigen oder parallelen Systemen (vgl. \[11\]).