2016-07-19 13 views
-1

Wie bekannt ist, Prioritätsumkehrungsproblem - wenn ein Thread mit höherer Priorität für einen Faden mit niedrigerer Priorität wartet: https://en.wikipedia.org/wiki/Priority_inversionVerwendet Linux einige der Lösungen der Prioritätsinversion?

Es passiert, wenn wir 3 Fäden haben: L (niedrig), M (mittel), H (high -Priorität). L und H benutzen den gleichen Mutex, aber L erwirbt es früh als H, und H blockiert und geht schlafen. Und dann besetzt M den CPU-Kern, weil es eine höhere Priorität als L hat, und L geht schlafen, aber der Mutex wird immer noch akquiriert. L & H schlafen, aber M arbeitet.

Es gibt einige solutions Prioritätsinversion:

  • alle Interrupts Deaktivieren kritische Abschnitte
  • Eine Priorität Decke
  • Prioritätsvererbung
  • Zufalls Steigerung zu schützen - Bereit Aufgaben Halteverriegelungen werden nach dem Zufallsprinzip verstärkt, bis sie den kritischen Bereich verlassen. Diese Lösung wird in Microsoft Windows verwendet.
  • Vermeiden

Does Linux verwenden, um einige der Lösungen von Prioritätsinversion und welche seiner blockiert?

Antwort

0

Linux verwendet Priorität Vererbung.

Prioritätsinversion kann durch die Verwendung Funktion int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr, int protocol);

lösen Wo ist:

  • PTHREAD_PRIO_NONE - nichts geht, wenn erwirbt das Eigentum Mutex
  • PTHREAD_PRIO_INHERIT-Priority inheritance
  • PTHREAD_PRIO_PROTECT - verwendet eine feste Level der Priorität nach prioceiling Wert, der durch die Funktion 01 erhalten wurde

Wenn ein Thread ein oder mehr mutexes mit dem PTHREAD_PRIO_PROTECT Protokoll initialisiert besitzt, ist es bei den höheren seiner Priorität oder den höchsten der Priorität Decken alle mutexes im Besitz von diesem Thread ausführen soll und mit diesem Attribut initialisiert werden, unabhängig davon, ob andere Threads auf einem dieser Mutexe blockiert sind oder nicht .