Wie kann eine Situation entstehen, in der eine Warteschlange mit niedrigerer Priorität früher Zugriff auf Ressourcen erhält als eine mit höherer Priorität?
sobes.tech KI
Antwort von AI
Dies kann aufgrund einer Prioritätsinversion auftreten.
Eine Prioritätsinversion tritt auf, wenn eine Aufgabe mit niedriger Priorität eine Ressource (z.B. einen Mutex) hält, die für eine Aufgabe mit hoher Priorität erforderlich ist. Die Aufgabe mit hoher Priorität wird blockiert, während sie auf die Freigabe der Ressource wartet. Gleichzeitig kann eine Aufgabe mit mittlerer Priorität von einer anderen Aufgabe verdrängt werden, die diese Ressource nicht benötigt. Dadurch läuft die mittlere Prioritätsaufgabe, während die Aufgabe mit niedriger Priorität, die die Ressource hält, und die Aufgabe mit hoher Priorität, die blockiert ist, warten. Die Aufgabe mit hoher Priorität wartet in Wirklichkeit darauf, dass die Aufgaben mit mittlerer Priorität und die mit niedriger Priorität die Ressource freigeben.
Lösungen für das Problem der Prioritätsinversion:
- Prioritätsvererbung (Priority Inheritance): Wenn eine Aufgabe mit niedriger Priorität eine Ressource hält, die für eine Aufgabe mit hoher Priorität notwendig ist, wird ihr vorübergehend die Priorität der blockierten Aufgabe mit hoher Priorität zugewiesen. Nach Freigabe der Ressource kehrt die Priorität zur ursprünglichen zurück.
- Prioritätsdecke-Protokoll (Priority Ceiling Protocol): Jeder Ressource wird eine "Prioritätsdecke" zugewiesen — die höchste Priorität aller Aufgaben, die diese Ressource verwenden können. Eine Aufgabe kann nur dann auf die Ressource zugreifen, wenn ihre aktuelle Priorität höher ist als die Prioritätsdecke aller momentan belegten Ressourcen (einschließlich derjenigen, die sie bereits hält).
Auf iOS verfügen Grand Central Dispatch (GCD) und Operation Queues über Mechanismen zur Minimierung der Prioritätsinversion, aber in komplexen Szenarien mit Sperren können solche Situationen immer noch auftreten, wenn sie falsch verwendet werden.