Model iş parçacığı oluşturma

oneway olarak işaretlenen yöntemler engellemez. Şu şekilde işaretlenmemiş yöntemler için: oneway, istemcinin yöntem çağrısı, sunucu yürütme veya eşzamanlı geri çağırma (hangisi önce gelirse) çağrılır. Sunucu yöntemi uygulamaları en fazla bir eşzamanlı geri çağırma yapabilir; ekstra geri çağırma çağrıları silinir ve hata olarak günlüğe kaydedilir. Bir yöntemin geri çağırma ile değerleri döndürür ve geri çağırmaz. Bu işlem, hatası ile müşteriye aktarım hatası olarak bildirilir.

Geçiş modundaki mesaj dizileri

Geçiş modunda, çoğu çağrı eşzamanlıdır. Ancak oneway çağrısının istemciyi engellememesi, her işlem için ileti dizisi oluşturulur. Ayrıntılar için HIDL'ye genel bakış.

Birleştirilmiş HAL'lerdeki iş parçacıkları

Gelen RPC çağrılarını sunmak için (HAL'lerden HAL kullanıcıları) ve ölüm bildirimleri olduğunda, her işlemle bir ileti dizisi havuzu bir uygulamadır. Tek bir işlem birden fazla HIDL arayüzü uyguluyorsa ve/veya ileti dizisi deposu, hepsi arasında paylaşılır. Zaman Bir işlem istemciden gelen yöntem çağrısı aldığında, ücretsiz bir iş parçacığı seçer çağrıyı ileti dizisinde yürütür. Ücretsiz iş parçacığı yoksa kullanılabilir ise bunlardan bir tanesi hazır olana kadar engellenir.

Sunucuda yalnızca bir iş parçacığı varsa sunucuya yapılan çağrılar tamamlanır tıklayın. Birden fazla iş parçacığına sahip bir sunucu, çağrıları hatalı tamamlayabiliyor müşteri tek bir ileti dizisine sahip olsa bile. Ancak, belirli bir arayüz nesnesi için, oneway aramasının sipariş edilmesi garanti edilir (bkz. Sunucu iş parçacığı modeli). Çok iş parçacıklı bir sunucu için birden çok arayüz barındırır, oneway farklı arayüzlere çağrı yapar Bunlar, birbiriyle veya diğer engelleyici çağrılarla eş zamanlı olarak işlenebilir.

İç içe yerleştirilmiş birden çok çağrı, aynı hwbinder ileti dizisinde gönderilir. Örneğin, Bir işlem (A), bir hwbinder iş parçacığından işleme (B) eşzamanlı bir çağrı yaparsa, ve ardından (B) işlemi (A) eşzamanlı bir geri arama yaparsa, çağrı (A) içindeki orijinal hwbinder iş parçacığında yürütüldüğünden çağrısına bir tıklama URL'si eklemeniz gerekir. Bu optimizasyon, tek bir iş parçacığının iç içe geçmiş aramaları işler ancak aramaların ilerlediği durumlarda geçerli değildir. başka bir IPC çağrısı dizisidir. Örneğin, (B) süreci bir sürece (C) çağrılan ve ardından (C) çağrılarını işleyen bağlayıcı/vndbinder çağrısı sonra (A) içindeki orijinal ileti dizisinde sunulamaz.

Sunucu iş parçacığı modeli

Geçiş modu hariç, HIDL arayüzlerinin sunucu uygulamaları her zaman için geçerlidir bir veya daha fazla iş parçacığının kullanılabilmesi için gereken gelen yöntem çağrılarına karşılık gelir. Bu iş parçacıkları, sunucunun iş parçacığı havuzudur. sunucu ileti dizisinde kaç tane iş parçacığının çalıştırılmasını istediğine karar verebilir ve tüm çağrıları serileştirmek için bir iş parçacığı havuzu boyutu. Sunucu, ileti dizisinde birden fazla ileti dizisi varsa eşzamanlı olarak gelen ileti alabilir üzerinde çağrı yaptığından (C++ ürününde, paylaşılan verinin şekilde kilitleyebilirsiniz).

Aynı arayüze yapılan tek yönlü çağrılar serileştirilir. Çok iş parçacıklı bir istemci arayüzde method1 ve method2 çağrısı yapıyor IBar arayüzünde IFoo ve method3, method1 ve method2 her zaman serileştirilir ancak method3, method1 ve method2.

Tek bir istemci iş parçacığının yürütme sırasında eş zamanlı yürütülmesine neden olabilir. iki şekilde birden çok iş parçacığı üzerinde çalışan bir sunucuya gönderilir:

  • oneway aramaları engellenmez. oneway araması yürütüldüğünden ve oneway olmayan bir parametre çağrıldığında, sunucu oneway görüşmesi ve oneway dışı arama olanak tanır.
  • Eşzamanlı geri çağırmalarla verileri geri ileten sunucu yöntemleriyle ilgili engellemeler kaldırılabilir geri çağırma sunucudan çağrılır çağrılmaz istemciyi çağırın.

İkinci yöntemde, çağrılan geri çağırma eşzamanlı olarak yürütülebilir ve sunucu sonraki ve müşteriden gelen aramaları içerir. Buna, sunucu işlevindeki kod ve otomatik yıkıcı olarak yürütülür. Sunucuda bir ileti dizisinde bir ileti dizisinde; aramalar gelse bile eşzamanlılık sorunları ortaya çıkıyor. tek bir istemci iş parçacığından değiştirilebilir. (Bir süreç tarafından sunulan herhangi bir HAL tüm HAL'lerde birden çok iş parçacığı bulunur, çünkü ileti dizisi işlem başına paylaşılır.)

Sunucu sağlanan geri çağırmayı çağırır almaz, aktarım ve engellemesi kaldırılmış olabilir. Müşteri, çağırdıktan sonra sunucu uygulaması ne yaptığına paralel olarak geri çağırma (çalışan yıkıcıları içerebilir). Sunucu işlevindeki kod geri çağırmanın istemciyi engellememesinden sonra (sunucu ileti dizisinde, gelen aramaları işlemek için yeterli ileti dizisi bulunur), ancak istemciden gelecek çağrılarla eşzamanlı olarak (sunucu iş parçacığının yalnızca bir ileti dizisinde).

Eşzamanlı geri çağırmalara ek olarak oneway, tek iş parçacıklı istemci birden fazla iş parçacığı bulunan bir sunucu tarafından eş zamanlı olarak işlenebilir. (ancak bu oneway çağrılarının farklı arayüzlerde çalıştırıldı. Aynı anda oneway arama her zaman seri hâlindedir.

Not: Sunucu işlevlerinin geri çağırma işlevini çağırdıkları andan itibaren geri gelecektir.

Örneğin (C++ ürününde):

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 iş parçacığı modeli

İstemcideki ileti dizisi modeli, engellemeyen çağrılar arasında farklılık gösteriyor (oneway anahtar kelimesiyle işaretlenmiş işlevler) ve engelleme çağrıları (oneway anahtar kelimesinin belirtilmediği işlevler).

Aramaları engelle

İstemci, aramaları engellemek için aşağıdakilerden biri gerçekleşene kadar aramaları engeller:

  • Aktarım hatası oluşur; Return nesnesi hata içeriyor Return::isOk() ile alınabilecek bir durum belirtir.
  • Sunucu uygulaması, geri çağırmayı (varsa) çağırır.
  • Sunucu uygulaması bir değer döndürür (callback parametresi yoksa).

Başarılı olursa istemcinin bağımsız değişken olarak aktardığı geri çağırma işlevi her zaman işlevin kendisi döndürülmeden önce sunucu tarafından çağrılır. Geri çağırma: gerçekleştirildiği için fonksiyon çağrısının yapıldığı iş parçacığında işlev çağrıları sırasında kilitlerin basılı tutulmasına dikkat etmelidir (ve (mümkün olduğunca birlikte). generates ifadesi olmayan fonksiyon veya oneway anahtar kelime engelleme işlemi devam ediyordur; gerçekleşene kadar sunucu bir Return<void> nesnesi döndürür.

Tek yönlü aramalar

Bir işlev oneway olarak işaretlendiğinde istemci hemen geri döner ve sunucunun işlev çağrısı çağrısını tamamlamasını beklemez. Şurada: yüzeyde (ve toplu olarak) bu, fonksiyon çağrısının zaman alır çünkü kodun yarısını çalıştırır, ancak hassasiyeti vardır. Bunun programlama açısından bazı etkileri vardır. Normalde tek yönlü arama kullanmak arayanın planlanmış olmasına neden olur ancak normal eşzamanlı çağrı kullanılması planlayıcının aktarma işlemini sürecin işleyişini ifade eder. Bu, bağlayıcı. Tek yönlü çağrının hedef süreçte yürütülmesi gereken hizmetler için alıcı hizmetin zamanlama politikası ise değiştirildi. C++'ta, libhidltransport yöntemini kullanarak Planlayıcı öncelikleri ve politikaları ile setMinSchedulerPolicy sched.h politikasında tanımlandığında hizmete yapılan tüm çağrıların şurada çalıştırılmasını sağlar: en azından belirlediğiniz planlama politikasına ve önceliğe sahip olmalıdır.