Önceliğin ters dönmesi, düşük öncelikli görev, yüksek öncelikli görev için gereken bir kaynağı tuttuğu için yüksek öncelikli bir işlemin geciktiği durumdur. Android, öncelik ters çevrilmesini azaltmak için üç farklı öncelik devralma biçimi (işlem önceliği devralma, düğüm önceliği devralma ve gerçek zamanlı öncelik devralma) aracılığıyla iş parçacıklarının farklı önceliklerde çalıştırılmasını destekler.
Bu sayfada, öncelik devralmanın farklı biçimleri açıklanmaktadır.
İşlem önceliği devralma
Senkron bağlayıcı çağrısı yapılırken, düşük öncelikli ileti dizisi yanıt gönderene kadar yüksek öncelikli ileti dizisi engellenebilir. Örneğin, -19 değerine sahip bir iş parçacığı, varsayılan değeri 0 olan bir iş parçacığı tarafından engellenebilir.
İşlem önceliği devralma, bu sorunu düzeltir. Bunun nedeni, bağlayıcı sürücüsünün, işlemi işleyen bağlayıcı iş parçacığının önceliğini, arayanın önceliğiyle eşleşecek şekilde geçici olarak değiştirmesidir. İşlem tamamlandığında bağlayıcı sürücüsü, bağlayıcı iş parçacığının önceliğini önceki değerine geri yükler.
Düğüm önceliği devralma
Düşük gecikme süresi gerektiren durumlar gibi bazı durumlarda, asenkron işlemlerin önceliği önemlidir.
Düğüm önceliği devralma, bir düğümdeki tüm işlemlerin çalışması gereken minimum önceliği yapılandırmanıza olanak tanır. Düğüm önceliği devralma işlemi yapılandırıldıktan sonra, düğümdeki tüm işlemler bu minimum öncelikte çalışır.
Düğüm önceliği devralma kuralları şunlardır:
İşlem senkronize ise öncelik
max(min_node_priority, caller_priority);
olur.İşlem eşzamansızsa öncelik
max(default_priority (nice 0), min_node_priority);
olur.
Düğüm önceliği devralmayı yapılandırma
Düğüm önceliği devralmayı yapılandırmak için BBinder::setMinSchedulerPolicy
kullanın.
Gerçek zamanlı öncelik devralma
Android, gecikme açısından kritik olan iş parçacıklarının çalışmalarını zamanında tamamlamasını sağlamak için SCHED_FIFO
gibi gerçek zamanlı planlama politikaları kullanır. Ayrıca, Android'in gecikme açısından kritik olan bazı çalışmaları iki veya daha fazla işleme bölünür.
Gerçek zamanlı öncelik devralma, aşağıdaki istisnalar dışında, nice değerleriyle aynı şekilde çalışır:
- Gerçek zamanlı öncelik devralma özelliği varsayılan olarak devre dışıdır.
- Daha yüksek gerçek zamanlı öncelik değerleri, daha düşük değerlere göre daha yüksek önceliğe sahiptir.
Gerçek zamanlı öncelik devralmayı etkinleştirme
BBinder::setInheritRt(true)
çağrısı kullanılarak tek tek düğümler için gerçek zamanlı öncelik devralma etkinleştirilmelidir.