oneway
olarak işaretlenen yöntemler engellemez. oneway
olarak işaretlenmemiş yöntemler için istemcinin yöntem çağrısı, sunucu yürütmeyi tamamlayana veya eşzamanlı geri çağırma çağrısı yapana (hangisi önce gerçekleşirse) kadar engellenir.
Sunucu yöntemi uygulamaları en fazla bir eşzamanlı geri çağırma çağrısı yapabilir; fazla geri çağırma çağrıları atılır ve hata olarak kaydedilir. Bir yöntemin geri çağırma işlevi aracılığıyla değer döndürmesi gerekiyorsa ve geri çağırma işlevini çağırmıyorsa bu durum hata olarak günlüğe kaydedilir ve istemciye aktarım hatası olarak bildirilir.
Geçiş modundaki mesaj dizileri
Geçiş modunda çoğu arama senkronizedir. Ancak oneway
çağrılarının istemciyi engellememesi için istenen davranışı korumak amacıyla her işlem için bir iş parçacığı oluşturulur. Ayrıntılar için HIDL'ye genel bakış başlıklı makaleyi inceleyin.
Binderize edilmiş HAL'lerdeki mesaj dizileri
Gelen RPC çağrılarını (HAL'lerden HAL kullanıcılarına ayarsız geri çağırmalar dahil) ve sonlandırma bildirimlerini sunmak için HIDL kullanan her işlemle bir iş parçacığı havuzu ilişkilendirilir. Tek bir işlem birden fazla HIDL arayüzü ve/veya sonlandırma bildirimi işleyicisi uygularsa iş parçacığı havuzu bunların tümü arasında paylaşılır. Bir işlem, istemciden gelen bir yöntem çağrısı aldığında, iş parçacığı havuzundan ücretsiz bir iş parçacığı seçer ve çağrıyı bu iş parçacığında yürütür. Ücretsiz bir ileti dizisi yoksa kullanılabilir bir ileti dizisi bulunana kadar engelleme devam eder.
Sunucunun yalnızca bir mesaj dizisi varsa sunucuya yapılan aramalar sırayla tamamlanır. Birden fazla ileti dizisi olan bir sunucu, istemcinin yalnızca bir ileti dizisi olsa bile aramaları sırayla tamamlamayabilir. Ancak belirli bir arayüz nesnesi için oneway
çağrılarının sıralı olması garanti edilir (Sunucu mesaj dizileme modeli bölümüne bakın). Birden fazla arayüz barındıran çok iş parçacıklı bir sunucuda, farklı arayüzlere yapılan oneway
çağrıları birbiriyle veya diğer engelleyen çağrılarla eşzamanlı olarak işlenebilir.
Aynı hwbinder iş parçacığında birden fazla iç içe çağrı gönderiliyor. Örneğin, bir (A) işlemi bir hwbinder iş parçacığında (B) işlemine senkron çağrı yaparsa ve ardından (B) işlemi (A) işlemine geri senkron çağrı yaparsa çağrı, (A) işlemindeki orijinal hwbinder iş parçacığında yürütülür ve orijinal çağrıda engellenir. Bu optimizasyon, iç içe yerleştirilmiş çağrıları işleyebilecek tek bir iş parçacıklı sunucunun olmasını sağlar ancak çağrıların başka bir IPC çağrısı sırasıyla iletildiği durumlara uygulanmaz. Örneğin, (B) işlemi bir (C) işlemini çağıran bir binder/vndbinder çağrısı yaptıysa ve ardından (C) işlemi (A) işlemini geri çağırdıysa (A)'daki orijinal iş parçacığında yayınlanamaz.
Sunucu mesaj dizileri modeli
Geçiş modu hariç olmak üzere, HIDL arayüzlerinin sunucu uygulamaları istemciden farklı bir işlemde bulunur ve gelen yöntem çağrılarını bekleyen bir veya daha fazla iş parçacığına ihtiyaç duyar. Bu iş parçacıkları, sunucunun iş parçacığı havuzudur. Sunucu, iş parçacığı havuzunda kaç iş parçacığı çalıştırmak istediğine karar verebilir ve arayüzlerindeki tüm çağrıları serileştirmek için bir iş parçacığı havuzu boyutu kullanabilir. Sunucunun iş parçacığı havuzunda birden fazla iş parçacığı varsa arayüzlerinden herhangi birinde eşzamanlı gelen çağrılar alabilir (C++'da bu, paylaşılan verilerin dikkatlice kilitlenmesi gerektiği anlamına gelir).
Aynı arayüze yapılan tek yönlü çağrılar serileştirilir. Çok iş parçacıklı bir istemci, IFoo
arayüzünde method1
ve method2
'ı, IBar
arayüzünde ise method3
'ı çağırıyorsa method1
ve method2
her zaman serileştirilir ancak method3
, method1
ve method2
ile paralel olarak çalışabilir.
Tek bir istemci yürütme iş parçacığı, birden fazla iş parçacığı olan bir sunucuda eşzamanlı yürütmeye iki şekilde neden olabilir:
oneway
aramaları engellenmiyor. Bironeway
çağrısı yürütülür ve ardındanoneway
olmayan bir çağrı çağrılırsa sunucu,oneway
çağrısını veoneway
olmayan çağrıyı aynı anda yürütebilir.- Verileri senkron geri çağırmalarla geri gönderen sunucu yöntemleri, geri çağırma sunucudan çağrıldığı anda istemcinin engellemesini kaldırabilir.
İkinci yöntemde, geri çağırma işlevi çağrıldıktan sonra sunucuda çalışan tüm kodlar eşzamanlı olarak çalışabilir. Sunucu, istemciden gelen sonraki çağrıları işler. Sunucu işlevindeki kod ve işlevin sonunda çalıştırılan otomatik yıkıcılar da buna dahildir. Sunucunun iş parçacığı havuzunda birden fazla iş parçacığı varsa yalnızca tek bir istemci iş parçacığından çağrı gelmesiyle bile eşzamanlılık sorunları ortaya çıkar. (Bir işlem tarafından sunulan herhangi bir HAL'in birden fazla iş parçacığına ihtiyacı varsa iş parçacığı havuzu işlem başına paylaşıldığı için tüm HAL'lerin birden fazla iş parçası vardır.)
Sunucu, sağlanan geri çağırma işlevini çağırır çağırmaz aktarım, istemcide uygulanan geri çağırma işlevini çağırabilir ve istemcinin engellemesini kaldırabilir. İstemci, geri çağırma işlevini çağırdıktan sonra sunucu uygulamasının yaptığı işlemlere paralel olarak devam eder (yıkıcıların çalıştırılması dahil olabilir). Geri çağırma işlevi sonrasında sunucu işlevindeki kod artık istemciyi engellemez (sunucu iş parçacığı havuzunda gelen çağrıları işlemek için yeterli iş parçacığı olduğu sürece) ancak istemciden gelecek çağrılarla eşzamanlı olarak yürütülebilir (sunucu iş parçacığı havuzunda yalnızca bir iş parçacığı olmadığı sürece).
Senkron geri çağırmalara ek olarak, tek iş parçacıklı bir istemciden gelen oneway
çağrıları, iş parçacığı havuzunda birden fazla iş parçacığı bulunan bir sunucu tarafından eşzamanlı olarak işlenebilir. Ancak bu, yalnızca söz konusu oneway
çağrılarının farklı arayüzlerde yürütülmesi durumunda geçerlidir. Aynı arayüzdeki oneway
çağrıları her zaman serileştirilir.
Not: Sunucu işlevlerinin geri çağırma işlevini çağırdıktan hemen sonra dönmesini önemle tavsiye ederiz.
Örneğin (C++):
Return<void> someMethod(someMethod_cb _cb) { // Do some processing, then call callback with return data hidl_vec<uint32_t> vec = ... _cb(vec); // At this point, the client's callback is called, // and the client resumes execution. ... return Void(); // is basically a no-op };
İstemci mesaj dizileri modeli
İstemcideki mesaj dizileri modeli, engellenmeyen çağrılar (oneway
anahtar kelimesiyle işaretlenmiş işlevler) ve engelleyen çağrılar (oneway
anahtar kelimesinin belirtilmediği işlevler) arasında farklılık gösterir.
Aramaları engelle
Müşteri, aramaları aşağıdakilerden biri gerçekleşene kadar engeller:
- Aktarım hatası meydana gelir;
Return
nesnesi,Return::isOk()
ile alınabilecek bir hata durumu içerir. - Sunucu uygulaması geri aramayı (varsa) çağırır.
- Sunucu uygulaması bir değer döndürür (geri çağırma parametresi yoksa).
İşlem başarılı olursa istemcinin bağımsız değişken olarak ilettiği geri çağırma işlevi, işlev kendisi döndürülmeden önce sunucu tarafından her zaman çağrılır. Geri çağırma işlevi, işlev çağrısının yapıldığı aynı iş parçacığında yürütülür. Bu nedenle, uygulayıcıların işlev çağrıları sırasında kilitleri tutma konusunda dikkatli olmaları (ve mümkün olduğunda kilitleri tamamen kullanmamaları) gerekir. generates
ifadesi veya oneway
anahtar kelimesi olmayan bir işlev yine de engellemeye devam eder. İstemci, sunucu bir Return<void>
nesnesi döndürene kadar engellemeye devam eder.
Tek yönlü aramalar
Bir işlev oneway
olarak işaretlendiğinde istemci hemen döndürülür ve sunucunun işlev çağrısı çağırmasını beklemez. Bu, ilk bakışta (ve toplu olarak) işlev çağrısının, kodun yarısını yürüttüğü için yarı yarıya daha az zaman aldığı anlamına gelir. Ancak performansa duyarlı uygulamalar yazarken bunun bazı planlama sonuçları vardır. Normalde tek yönlü bir arama kullanılması, arayanın planlanmaya devam etmesine neden olur. Normal senkronize bir arama kullanılması ise planlayıcının arayandan aranan sürece hemen aktarılmasına neden olur. Bu, bağlayıcıdaki bir performans optimizasyonudur. Tek yönlü aramanın hedef işlemde yüksek öncelikli olarak yürütülmesi gereken hizmetlerde, alıcı hizmetin planlama politikası değiştirilebilir. C++'ta, libhidltransport
sınıfının setMinSchedulerPolicy
yöntemini sched.h
içinde tanımlanan planlayıcı öncelikleriyle ve politikalarıyla kullanmak, hizmete yapılan tüm çağrıların en azından ayarlanan planlama politikası ve önceliğinde çalıştırılmasını sağlar.