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