وارونگی اولویت وضعیتی است که در آن تراکنش با اولویت بالا بهدلیل اینکه تکلیف با اولویت پایین منبع موردنیاز تکلیف با اولویت بالا را دراختیار دارد، بهتأخیر میافتد. برای کاهش معکوس شدن اولویت، Android از اجرای رشتهها با اولویتهای مختلف ازطریق سه شکل مختلف از ارثبری اولویت پشتیبانی میکند: ارثبری اولویت تراکنش، ارثبری اولویت گره، و ارثبری اولویت زمان واقعی.
این صفحه این اشکال مختلف از ارثبری اولویت را توضیح میدهد.
وراثت اولویت تراکنش
هنگام برقرار کردن تماس چسباننده همزمان، رشته با اولویت بالا میتواند تا زمانی که رشته با اولویت پایین پاسخی ارسال نکرده است توسط رشته با اولویت پایین مسدود شود. برای مثال، رشتهای با مقدار nice ۱۹- میتواند توسط رشتهای با مقدار nice پیشفرض ۰ مسدود شود.
وراثت اولویت تراکنش این مشکل را برطرف میکند زیرا درایور binder اولویت رشته binder را که تراکنش را مدیریت میکند بهطور موقت تغییر میدهد تا با اولویت تماسگیرنده مطابقت داشته باشد. وقتی تراکنش انجام شد، درایور binder اولویت رشته binder را به مقدار قبلیاش برمیگرداند.
وراثت اولویت Node
در برخی شرایط، مثل شرایطی که به تأخیر کم نیاز است، اولویت تراکنشهای ناهمگام اهمیت دارد.
وراثت اولویت گره به شما امکان میدهد حداقل اولویتی را که همه تراکنشهای یک گره باید با آن اجرا شوند پیکربندی کنید. پساز پیکربندی اولویت گره، همه تراکنشهای گره با این اولویت حداقلی اجرا میشوند.
قوانین مربوط به ارثبری اولویت گره عبارتاند از:
اگر تراکنش همزمان باشد، اولویت به
max(min_node_priority, caller_priority);تبدیل میشود.اگر تراکنش ناهمزمان باشد، اولویت به
max(default_priority (nice 0), min_node_priority);تبدیل میشود.
پیکربندی توارث اولویت گره
برای پیکربندی کردن توارث اولویت گره، از BBinder::setMinSchedulerPolicy استفاده کنید.
وراثت اولویت همزمان
Android از خطمشیهای زمانبندی همزمان، مثل SCHED_FIFO، استفاده میکند تا
رشتههای حساس به تأخیر کارشان را بهموقع تکمیل کنند. علاوهبراین، برخیاز
کارهای حساس به تأخیر Android به دو یا چند فرایند تقسیم میشود.
وراثت اولویت بیدرنگ دقیقاً مانند مقادیر nice عمل میکند، با این تفاوت که:
- وراثت اولویت همزمان بهطور پیشفرض غیرفعال است.
- مقادیر اولویت آنی بزرگتر نسبت به مقادیر کوچکتر اولویت بالاتری دارند.
فعال کردن وراثت اولویت همزمان
وراثت اولویت همزمان باید برای گرههای تکی
بااستفاده از فراخوانی BBinder::setInheritRt(true) فعال شود.