قلب الأولويات هو حالة تتأخر فيها معاملة ذات أولوية عالية بسبب مهمة ذات أولوية منخفضة، لأنّ المهمة ذات الأولوية المنخفضة تحتفظ بمورد تحتاجه المهمة ذات الأولوية العالية. للحدّ من مشكلة انعكاس الأولوية، يتيح نظام التشغيل 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)
.