היפוך עדיפויות הוא מצב שבו טרנזקציה בעדיפות גבוהה מתעכבת בגלל משימה בעדיפות נמוכה, כי המשימה בעדיפות הנמוכה מחזיקה במשאב שנדרש למשימה בעדיפות הגבוהה. כדי לצמצם את הסיכון להיפוך עדיפויות, מערכת Android תומכת בהרצת שרשורים בעדיפויות שונות באמצעות שלוש צורות שונות של ירושת עדיפויות: ירושת עדיפויות של טרנזקציות, ירושת עדיפויות של צמתים וירושת עדיפויות בזמן אמת.
בדף הזה מוסבר על סוגי הירושה השונים של העדיפות.
העברת עדיפות של עסקאות
כשמבצעים קריאה סינכרונית של binder, שרשור בעדיפות גבוהה יכול להיחסם על ידי שרשור בעדיפות נמוכה עד שהשרשור בעדיפות הנמוכה ישלח תשובה. לדוגמה, יכול להיות ששרשור עם ערך nice של -19 ייחסם על ידי שרשור עם ערך nice של 0 (ברירת מחדל).
העברת עדיפות של טרנזקציות פותרת את הבעיה הזו כי מנהל ההתקן של Binder משנה באופן זמני את העדיפות של השרשור של Binder שמטפל בטרנזקציה כך שתתאים לעדיפות של המתקשר. כשהעסקה מסתיימת, מנהל ההתקן של ה-binder משחזר את העדיפות של השרשור של ה-binder לערך הקודם שלו.
העברת עדיפות של צומת
במצבים מסוימים, כמו כאלה שדורשים השהיה נמוכה, חשובה העדיפות של עסקאות אסינכרוניות.
העברת עדיפות של צומת מאפשרת להגדיר את העדיפות המינימלית שבה כל העסקאות בצומת צריכות לפעול. אחרי שמגדירים את העדיפות של הצומת, כל העסקאות בצומת פועלות בעדיפות המינימלית הזו.
הכללים להעברת עדיפות של צומת הם:
אם העסקה סינכרונית, העדיפות היא
max(min_node_priority, caller_priority);.אם העסקה היא אסינכרונית, העדיפות הופכת ל-
max(default_priority (nice 0), min_node_priority);.
הגדרת העברת עדיפות של צומת
כדי להגדיר את העברת העדיפות של הצומת, משתמשים ב-BBinder::setMinSchedulerPolicy.
העברת עדיפות בזמן אמת
מערכת Android משתמשת במדיניות תזמון בזמן אמת, כמו SCHED_FIFO, כדי לגרום לשרשורים קריטיים לזמן האחזור להשלים את העבודה שלהם בזמן. בנוסף, חלק מהפעולות הקריטיות לזמן האחזור ב-Android מחולקות בין שני תהליכים או יותר.
העברת עדיפות בזמן אמת פועלת באופן זהה לערכי nice, למעט:
- התכונה 'העברת עדיפות בזמן אמת' מושבתת כברירת מחדל.
- ערכי עדיפות גבוהים יותר בזמן אמת מקבלים עדיפות גבוהה יותר מערכים נמוכים יותר.
הפעלת העברת עדיפות בזמן אמת
צריך להפעיל את התכונה 'העברת עדיפות בזמן אמת' עבור צמתים נפרדים באמצעות הקריאה BBinder::setInheritRt(true).