Sobes.tech
Middle+

Πώς μπορεί να συμβεί μια κατάσταση όπου μια ουρά με χαμηλότερη προτεραιότητα λαμβάνει πρόσβαση στους πόρους νωρίτερα από μια ουρά με υψηλότερη προτεραιότητα;

sobes.tech AI

Απάντηση από AI

Αυτό μπορεί να συμβεί λόγω αντιστροφής προτεραιότητας.

Η αντιστροφή προτεραιότητας συμβαίνει όταν μια εργασία χαμηλής προτεραιότητας κατέχει έναν πόρο (π.χ., ένα mutex) που είναι απαραίτητος για μια εργασία υψηλής προτεραιότητας. Η εργασία υψηλής προτεραιότητας μπλοκάρεται περιμένοντας να απελευθερωθεί ο πόρος. Ταυτόχρονα, μια εργασία με μεσαία προτεραιότητα μπορεί να προκληθεί από μια άλλη εργασία που δεν χρειάζεται αυτόν τον πόρο. Ως αποτέλεσμα, η εργασία με μεσαία προτεραιότητα εκτελείται ενώ η εργασία χαμηλής προτεραιότητας, που κατέχει τον πόρο, και η εργασία υψηλής προτεραιότητας, που είναι μπλοκαρισμένη, περιμένουν. Στην πραγματικότητα, η εργασία υψηλής προτεραιότητας περιμένει να απελευθερωθούν οι πόροι από τις εργασίες με μεσαία και χαμηλή προτεραιότητα.

Λύσεις στο πρόβλημα της αντιστροφής προτεραιότητας:

  • Κληρονομιά προτεραιότητας (Priority Inheritance): Όταν μια εργασία χαμηλής προτεραιότητας κατέχει έναν πόρο που είναι απαραίτητος για μια εργασία υψηλής προτεραιότητας, της αποδίδεται προσωρινά η προτεραιότητα της μπλοκαρισμένης εργασίας υψηλής προτεραιότητας. Μετά την απελευθέρωση του πόρου, η προτεραιότητα επιστρέφει στην αρχική.
  • Πρωτόκολλο οροφής προτεραιότητας (Priority Ceiling Protocol): Σε κάθε πόρο αποδίδεται μια "οροφή προτεραιότητας" — η υψηλότερη προτεραιότητα μεταξύ όλων των εργασιών που μπορούν να χρησιμοποιήσουν αυτόν τον πόρο. Μια εργασία μπορεί να αποκτήσει πρόσβαση στον πόρο μόνο αν η τρέχουσα προτεραιότητά της είναι υψηλότερη από την οροφή προτεραιότητας όλων των ενεργών πόρων (συμπεριλαμβανομένων αυτών που ήδη κατέχει).

Στο iOS, το Grand Central Dispatch (GCD) και οι Operation Queues διαθέτουν μηχανισμούς για τη μείωση της αντιστροφής προτεραιότητας, αλλά σε πολύπλοκα σενάρια με μπλοκαρίσματα, τέτοιες καταστάσεις μπορούν να συμβούν ακόμα και αν χρησιμοποιούνται λανθασμένα.