7

Öncelikli tersine çevirme, onlarla ilişkili öncelikler nedeniyle iş parçacığı/süreçlerinin zamanlaması sırasında ortaya çıkabilecek bir sorundur.Android'de öncelik dönüşümü gerçekleşebilir

Öncelik inversiyon bir yüksek öncelikli görev dolaylı "tersini" orta öncelikli görevi etkili bir tarafından önceden olduğu çizelgelemede sorunlu bir senaryodur iki görevlerin göreceli öncelikleri - Wikipedia

ben Android, farklı öncelikler, see this post farklı süreçleri sağlamak bildiğimiz gibi, Android'de öncelik inversiyon olabilir, merak ediyorum. Ayrıca, farklı önceliklerle, bu senaryoda nasıl uydukları ile birden çok iş parçacığı (etkinlik ve hizmetlerde) oluşturabiliriz? Thread Scheduling in Android'dan bahseden bir yazı gördüm. Öncelikli ters çevirme gerçekleştiyse, nasıl algılayabilir ve önleyebiliriz?

Bu soruya cevap ararken, Android'in ses sistemi bağlamında öncelikli olarak tersine çevrilmemesini nasıl önleyeceğimizi bize Android aracılığıyla this sayfasında buldum.

+1

Bu endişelenmen gereken bir şey değil. Kabaca her sistemde öncelik var. Ancak, yalnızca belirli bir sırayla/belirli önceliklerle gerçekleştirilmesini gerektiren "kötü" bir kod yazdığınızda olur. Ayrıca ses sistemi bağlantısı da sorunuzu yanıtlıyor ("* öncelikli inversiyondan kaçınmaya çalışıyor" *) :) – zapl

+0

Öncelikli tersine çevirme, genellikle kötü koddan dolayı oluşmaz, bunun yerine zamanlamanın OS (veya bazı dillerde derleyici) tarafından nasıl yapıldığına bağlıdır. ve eğer bir dil, önleme/önleme vb. ile ilgili endişelenmemize gerek duymadığından, öncelikli bir tersinme gerçekleşmeyeceğini garanti ederse, geliştiricilerle ilgilidir. – penguin

+0

s/hatalı kod/hatalı sistem tasarımı. Paylaşılan bir kaynak için eşzamanlı olarak rekabet eden kod yazmanız gerekmez. Ayrıca çekişme (sistem tasarımınız tarafından yoğun şekilde etkilenir) yeterince yüksekse, sadece kötü olur. Zaman zaman öncelikli ters zamanlamalı programlama çoğu sisteme zarar vermez. – zapl

cevap

5

sağlanan link ayrıntılı olarak

Evet, öncelik inversiyon, Android oluşabilir Kısa Cevap.

Sorun

farklı önceliklere sahip görevleri Önleyici adımlar atılmadığı takdirde aynı paylaşılan kaynak, öncelik inversiyon karşı savunmasızdır kilit sağlar herhangi bir sistem. Konu ve süreçlerden bahsettiniz - Android'de durum hem süreçler hem de iş parçacıkları arasında paylaşılabilir ve bu da onları öncelikli olarak tersine çevirmeye karşı savunmasız bırakabilir.

Öncelikli ters çevirme ile ortaya çıkan ana sorun, daha düşük öncelikli görevlerin yürütülmesi için daha az CPU döngüsü verilmesidir. Zamana bağlı yüksek öncelikli bir görev düşük öncelikli bir görev tarafından engellenirse, yürütmek için kabul edilemeyecek kadar uzun bir süre beklemek ve sisteminizde bir yere bir arızaya neden olmak veya kullanıcı deneyimini düşürmek gerekebilir.

Buna Geleneksel Çözüm

geleneksel çözüm öncelik kalıtım olduğunu. Öncelikli kalıtımla, paylaşılan kaynağı tutan görev (iş parçacığı veya işlem), bu kaynak üzerinde engellenen en yüksek öncelikli görevin önceliğini geçici olarak devralır. Düşük öncelikli görev çok daha hızlı bir şekilde yürütüldüğünden ve zamana duyarlı görev için kaynakları serbest bırakacağından bu sorunu çözer.

Bu özelliğe sahip Futex'ler (hızlı kullanıcı alanı muteksleri) Linux Kernel'de mevcuttur. Bununla birlikte, security concerns numaralı telefondan dolayı Android standart C kitaplığında değil değil ve büyük miktarlarda yükü içerdikleri için.

Android Çözüm

Android Açık Kaynak Projesi öncelik inversiyon sorununu çözmede recommends birkaç farklı yaklaşımlar. zaman aşımı ile

  • "kilit deneyin"/kilit - düşük öncelikli görev yüksek öncelikli görev sürede erişememesi daha olası hale muteksi tutabilir ne kadar bazı zaman aşımı süresi uygulamak. Dezavantajı, uzun kümülatif zaman aşımı ile ilgisiz düşük öncelikli görevler dizisi varsa.
  • Bazı durumlarda, bir muteks veya başka bir senkronizasyon primitif, Symmetric Multiprocessing ile birlikte uygun atomik işlemler kümesiyle değiştirilebilir. Bu konuda bir kılavuz here verilmektedir.
  • Ayrıca, kilitlenmeyen tek okuyucu, tek yazar FIFO görev sırası da uygulayabilirsiniz. Bu, here ve here tarif edilmektedir.

Tüm bu yöntemlerin ortak temel teması, yüksek ve düşük öncelikli raster arasında paylaşılan kaynakların kilitlerinin miktarını en aza indirgemek veya gerçekten kaldırılamıyorsa etkilerini azaltmaktır. Şu anda bu tekniklerin tümü, öncelikli inversiyon sorunlarını azaltmak için Android'de kullanılıyor.

Algılama

O oluşmadan önce otomatik olarak öncelikli inversiyon tespit etmek zordur. Bunun gerçekleştiğinden şüpheleniyorsanız, farklı işlemlerin yürütme ve engelleme için harcadığı zamanı incelemek üzere hipotezinizi systrace ve ps -t -p gibi araçları kullanarak test edebilirsiniz. En iyi öneri, sistemin uğraştığınız farklı bölümlerini ve öncelikli inversiyon problemini iyi anlamaktır.

İlgili konular