Ses gecikmesine katkıda bulunanlar

Bu sayfa çıkış gecikmesine katkıda bulunanlara odaklanmaktadır ancak benzer bir tartışma giriş gecikmesi için de geçerlidir.

Analog devrenin önemli ölçüde katkıda bulunmadığını varsayarsak, ses gecikmesine yüzey düzeyinde katkıda bulunan başlıca faktörler şunlardır:

  • Başvuru
  • İşlem hattındaki toplam arabellek sayısı
  • Çerçeve cinsinden her arabelleğin boyutu
  • DSP gibi uygulama işlemcisinden sonra ek gecikme

Yukarıdaki katkıda bulunanların listesi ne kadar doğru olsa da yanıltıcıdır. Bunun nedeni, arabellek sayısı ve arabellek boyutunun bir nedenden çok bir sonuç olmasıdır. Genellikle belirli bir arabellek şemasının uygulanması ve test edilmesi, ancak test sırasında sesin yetersiz çalışması veya taşması "tıklama" veya "çıtırtı" olarak duyulmasıdır. Bunu telafi etmek için sistem tasarımcısı arabellek boyutlarını veya arabellek sayısını artırır. Bu, alt koşuları veya aşımları ortadan kaldırmak gibi istenen sonuca sahiptir, ancak aynı zamanda gecikmenin artması gibi istenmeyen bir yan etkiye de sahiptir. Arabellek boyutları hakkında daha fazla bilgi için Ses gecikmesi: arabellek boyutları videosuna bakın.

Daha iyi bir yaklaşım, alt ve üst limitlerin nedenlerini anlamak ve ardından bunları düzeltmektir. Bu, duyulabilir yapaylıkları ortadan kaldırır ve daha küçük veya daha az arabelleğe izin verebilir ve böylece gecikmeyi azaltabilir.

Deneyimlerimize göre, alt ve üst limitlerin en yaygın nedenleri şunlardır:

  • Linux CFS (Tamamen Adil Zamanlayıcı)
  • SCHED_FIFO zamanlamasına sahip yüksek öncelikli iş parçacıkları
  • öncelikli dönüşüm
  • uzun planlama gecikmesi
  • uzun süre çalışan kesme işleyicileri
  • uzun kesinti devre dışı kalma süresi
  • güç yönetimi
  • güvenlik çekirdekleri

Linux CFS ve SCHED_FIFO zamanlaması

Linux CFS, ortak bir CPU kaynağını paylaşan rakip iş yüklerine karşı adil olacak şekilde tasarlanmıştır. Bu adalet, iş parçacığı başına güzel bir parametreyle temsil edilir. Nice değeri -19 (en az hoş veya ayrılan en fazla CPU zamanı) ile 20 (ayrılan en iyi veya en az CPU zamanı) arasında değişir. Genel olarak, belirli bir güzel değere sahip tüm iş parçacıkları yaklaşık olarak eşit CPU zamanı alır ve sayısal olarak daha düşük güzel değere sahip iş parçacıkları daha fazla CPU zamanı almayı beklemelidir. Bununla birlikte, CFS yalnızca nispeten uzun gözlem süreleri boyunca "adildir". Kısa süreli gözlem pencerelerinde CFS, CPU kaynağını beklenmedik şekillerde tahsis edebilir. Örneğin, CPU'yu sayısal olarak düşük hoşluğa sahip bir iş parçacığından sayısal olarak yüksek hoşluğa sahip bir iş parçacığına götürebilir. Ses durumunda bu, yetersiz veya fazla çalışmaya neden olabilir.

Açık çözüm, yüksek performanslı ses iş parçacıkları için CFS'den kaçınmaktır. Android 4.1'den başlayarak, bu tür iş parçacıkları artık CFS tarafından uygulanan SCHED_NORMAL ( SCHED_OTHER olarak da bilinir) planlama politikası yerine SCHED_FIFO planlama politikasını kullanıyor.

SCHED_FIFO öncelikleri

Yüksek performanslı ses iş parçacıkları artık SCHED_FIFO kullanıyor olsa da, diğer yüksek öncelikli SCHED_FIFO iş parçacıklarına hâlâ duyarlıdırlar. Bunlar genellikle çekirdek çalışan iş parçacıklarıdır, ancak SCHED_FIFO politikasına sahip birkaç ses olmayan kullanıcı iş parçacığı da olabilir. Kullanılabilir SCHED_FIFO öncelikleri 1 ila 99 arasındadır. Ses iş parçacıkları öncelik 2 veya 3'te çalışır. Bu, düşük öncelikli iş parçacıkları için öncelik 1'i ve yüksek öncelikli iş parçacıkları için öncelik 4 ila 99'u kullanılabilir bırakır. Mümkün olduğunda öncelik 1'i kullanmanızı ve sınırlı bir süre içinde tamamlanması garanti edilen, ses dizilerinin süresinden daha kısa bir süre ile yürütülen ve zamanlamayı etkilemediği bilinen iş parçacıkları için 4 ila 99 arasındaki öncelikleri ayırmanızı öneririz. ses dizilerinden.

Hız-monotonik planlama

Sabit önceliklerin atanması teorisi hakkında daha fazla bilgi için Hız-monotonik planlama (RMS) adlı Wikipedia makalesine bakın. Önemli bir nokta, sabit önceliklerin kesinlikle döneme dayalı olarak tahsis edilmesi, daha yüksek önceliklerin algılanan "öneme" dayalı değil, daha kısa dönemli iş parçacıklarına atanması gerektiğidir. Periyodik olmayan iş parçacıkları, maksimum yürütme frekansı ve yürütme başına maksimum hesaplama kullanılarak periyodik iş parçacıkları olarak modellenebilir. Periyodik olmayan bir iş parçacığı periyodik bir iş parçacığı olarak modellenemiyorsa (örneğin, sınırsız frekansla veya yürütme başına sınırsız hesaplamayla çalıştırılabilirse), o zaman gerçek periyodik iş parçacıklarının zamanlaması ile uyumsuz olacağından ona sabit bir öncelik atanmamalıdır. .

Öncelik dönüşümü

Önceliği ters çevirme, daha yüksek öncelikli bir görevin sınırsız bir süre boyunca engellendiği, daha düşük öncelikli bir görevin bir mutex (paylaşılan durum tarafından korunan) gibi bir kaynağı serbest bırakmasını beklediği, gerçek zamanlı sistemlerin klasik bir arıza modudur. Bunu hafifletmeye yönelik teknikler için " Önceliğin tersine çevrilmesinden kaçınma " makalesine bakın.

Gecikmeyi planlama

Zamanlama gecikmesi, bir iş parçacığının çalışmaya hazır hale gelmesi ile iş parçacığının gerçekten bir CPU üzerinde çalışması için ortaya çıkan içerik anahtarının tamamlanması arasındaki süredir. Gecikme süresi ne kadar kısa olursa o kadar iyidir ve iki milisaniyenin üzerindeki herhangi bir şey ses sorunlarına neden olur. Uzun planlama gecikmesi büyük olasılıkla bir CPU'yu açmak veya kapatmak, bir güvenlik çekirdeği ile normal çekirdek arasında geçiş yapmak, tam güçten düşük güç moduna geçiş yapmak veya CPU saat frekansını ve voltajını ayarlamak gibi mod geçişleri sırasında meydana gelir. .

Kesintiler

Birçok tasarımda CPU 0 tüm harici kesintilere hizmet eder. Bu nedenle, uzun süre çalışan bir kesme işleyicisi diğer kesmeleri, özellikle de doğrudan ses hafıza erişimi (DMA) tamamlama kesintilerini geciktirebilir. Hızlı bir şekilde bitirmek ve uzun işleri bir iş parçacığına (tercihen bir CFS iş parçacığı veya öncelik 1 olan SCHED_FIFO iş parçacığı) ertelemek için kesme işleyicileri tasarlayın.

Benzer şekilde, CPU 0'daki kesintilerin uzun süre devre dışı bırakılması, ses kesintilerinin servisinin geciktirilmesiyle aynı sonucu doğurur. Uzun kesinti devre dışı bırakma süreleri genellikle çekirdek döndürme kilidini beklerken meydana gelir. Sınırlı olduklarından emin olmak için bu döndürme kilitlerini inceleyin.

Güç, performans ve termal yönetim

Güç yönetimi, performansı optimize ederken güç tüketimini izleme ve azaltma çabalarını kapsayan geniş bir terimdir. Termal yönetim ve bilgisayar soğutma benzerdir ancak aşırı ısıdan kaynaklanan hasarı önlemek için ısıyı ölçmeye ve kontrol etmeye çalışırlar. Linux çekirdeğinde, CPU yöneticisi düşük seviyeli politikadan sorumludur, kullanıcı modu ise yüksek seviyeli politikayı yapılandırır. Kullanılan teknikler şunları içerir:

  • dinamik voltaj ölçeklendirme
  • dinamik frekans ölçeklendirme
  • dinamik çekirdek etkinleştirme
  • küme değiştirme
  • güç geçidi
  • Çalışırken takılabilir (çalışırken değiştirilebilir)
  • çeşitli uyku modları (durdurma, durdurma, boşta kalma, askıya alma vb.)
  • süreç geçişi
  • işlemci benzeşimi

Bazı yönetim işlemleri "iş kesintilerine" veya uygulama işlemcisi tarafından hiçbir yararlı işin gerçekleştirilmediği zamanlara neden olabilir. Bu iş kesintileri sese müdahale edebilir; dolayısıyla bu tür bir yönetim, ses etkinken kabul edilebilir en kötü iş durdurma durumuna göre tasarlanmalıdır. Elbette termal kaçak yaklaştığında kalıcı hasarı önlemek sesten daha önemlidir!

Güvenlik çekirdekleri

Dijital haklar yönetimine (DRM) yönelik bir güvenlik çekirdeği, ana işletim sistemi çekirdeği ve uygulama kodu için kullanılanlarla aynı uygulama işlemci çekirdeği/çekirdekleri üzerinde çalışabilir. Bir güvenlik çekirdeği işleminin bir çekirdek üzerinde aktif olduğu herhangi bir süre, normalde o çekirdek üzerinde çalışacak olan sıradan işin fiilen durdurulması anlamına gelir. Özellikle bu, ses çalışmasını içerebilir. Doğası gereği, bir güvenlik çekirdeğinin iç davranışı üst düzey katmanlar tarafından anlaşılamaz ve bu nedenle bir güvenlik çekirdeğinin neden olduğu performans anormallikleri özellikle tehlikelidir. Örneğin, güvenlik çekirdeği işlemleri genellikle bağlam anahtarı izlemelerinde görünmez. Geçen ancak gözlemlenemeyen zamana "karanlık zaman" diyoruz. Güvenlik çekirdekleri, ses etkinken kabul edilebilir en kötü iş kesintisi için tasarlanmalıdır.