היפוך עדיפויות הוא מצב שבו טרנזקציה בעדיפות גבוהה מתעכבת בגלל משימה בעדיפות נמוכה, כי המשימה בעדיפות הנמוכה מחזיקה במשאב שנדרש למשימה בעדיפות הגבוהה. כדי לצמצם את הסיכון להיפוך עדיפות, מערכת Android תומכת בהרצת שרשורים בעדיפויות שונות באמצעות שלוש צורות שונות של ירושת עדיפות: ירושת עדיפות של טרנזקציות, ירושת עדיפות של צמתים וירושת עדיפות בזמן אמת.
בדף הזה מוסבר על סוגים שונים של ירושת עדיפות.
העברת עדיפות של עסקאות
כשמבצעים קריאה סינכרונית של קובץ, שרשור בעדיפות גבוהה יכול להיחסם על ידי שרשור בעדיפות נמוכה עד שהשרשור בעדיפות הנמוכה ישלח תשובה. לדוגמה, שרשור עם ערך 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)
.