Sobes.tech
Middle+

Daha düşük öncelikli kuyruğun, daha yüksek öncelikli kuyruktan önce kaynaklara erişim sağladığı bir durum nasıl oluşabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bu, önceliklerin tersine çevrilmesi nedeniyle olabilir.

Önceliklerin tersine çevrilmesi, düşük öncelikli bir görevin, yüksek öncelikli bir görev için gerekli olan bir kaynağı (örneğin, bir mutex) tuttuğu durumlarda meydana gelir. Yüksek öncelikli görev, kaynağın serbest bırakılmasını beklerken engellenir. Aynı zamanda, orta öncelikli bir görev, bu kaynağı kullanmayan başka bir görev tarafından kesilebilir. Sonuç olarak, orta öncelikli görev, düşük öncelikli görev kaynağı tutarken ve yüksek öncelikli görev engellenmişken çalışmaya devam eder. Yüksek öncelikli görev, aslında, orta öncelikli ve düşük öncelikli görevlerin kaynağı serbest bırakmasını bekler.

Önceliklerin tersine çevrilmesi sorununa çözümler:

  • Öncelik Mirası (Priority Inheritance): Düşük öncelikli bir görev, yüksek öncelikli bir görev için gerekli olan kaynağı tuttuğunda, ona geçici olarak engellenen yüksek öncelikli görevin önceliği atanır. Kaynak serbest bırakıldıktan sonra, öncelik eski haline döner.
  • Öncelik Tavan Protokolü (Priority Ceiling Protocol): Her kaynağa, bu kaynağı kullanabilecek tüm görevler arasındaki en yüksek öncelik olan "tavan öncelik" atanır. Bir görev, yalnızca şu durumda kaynağa erişebilir: mevcut önceliği, o anda kullanılan tüm kaynakların tavan önceliğinden yüksek ise (kendi tuttuğu kaynaklar dahil).

iOS'ta, Grand Central Dispatch (GCD) ve Operation Queues bu öncelik tersine çevrilmesini en aza indirmek için mekanizmalar içerir, ancak karmaşık senaryolarda, yanlış kullanıldığında bu tür durumlar hala ortaya çıkabilir.