Podział na wątki w modelu

Metody oznaczone jako oneway nie są blokowane. W przypadku metod nieoznaczonych jako oneway, wywołanie metody klienta zablokuje się do czasu, aż serwer zakończone wykonanie lub wywołanie synchronicznego wywołania zwrotnego (w zależności od tego, co nastąpi wcześniej). Implementacje metody serwera mogą wywoływać maksymalnie jedno synchroniczne wywołanie zwrotne. dodatkowe są odrzucane i rejestrowane jako błędy. Jeśli metoda powinna zwraca wartości przez wywołanie zwrotne i nie wywołuje swojego wywołania zwrotnego, jest to rejestrowane jako i zgłoszony do klienta jako błąd przesyłania.

Wątki w trybie przekazywania

W trybie przekazywania większość wywołań jest synchroniczna. Aby jednak zachować zamierzone działanie, które wywołania funkcji oneway nie blokują klienta, dla każdego procesu jest tworzony wątek. Więcej informacji: Informacje o HIDL.

Wątki w powiązanych zestawach HAL

Do obsługi przychodzących wywołań RPC (w tym asynchronicznych wywołań zwrotnych z list HAL do użytkowników HAL) i powiadomienia o śmierci, z każdym procesem jest powiązana pula wątków. wykorzystujący HIDL. Jeśli w jednym procesie zaimplementowano wiele interfejsów HIDL lub obsługi powiadomień o śmierci, pula wątków jest wspólna dla każdego z nich. Kiedy proces odbiera połączenie przychodzące od klienta, wybiera wolny wątek z puli wątków i wykonuje wywołanie w tym wątku. Jeśli nie ma wolnego wątku będzie on zablokowany do momentu, aż użytkownik będzie dostępny.

Jeśli serwer ma tylko jeden wątek, wywołania serwera są realizowane. w określonej kolejności. Serwer z większą liczbą wątków może wykonywać wywołania w niewłaściwej kolejności nawet jeśli klient ma tylko jeden wątek. Jednak dla danego obiektu interfejsu Gwarantujemy kolejność oneway połączeń (zobacz Model podziału na wątki serwera). Serwer wielowątkowy, hostuje wiele interfejsów, oneway wywołania różnych interfejsów mogą być przetwarzane równocześnie ze sobą lub z innymi blokującymi połączenia.

W tym samym wątku Hwbinder wysyłanych jest wiele zagnieżdżonych wywołań. Przykład: jeśli proces (A) wykonuje synchroniczne wywołanie z wątku hwbinder w procesie (B), a następnie proces (B) przeprowadza synchroniczne wywołanie z powrotem do procesu (A), zostało wykonane w pierwotnym wątku Hwbinder w (A) i zablokowanym . Dzięki tej optymalizacji serwer z jednym wątkiem może obsługuje zagnieżdżone wywołania, ale nie dotyczy to przypadków, w których te połączenia kolejną sekwencję wywołań IPC. Jeśli na przykład proces (B) utworzył wywołanie binder/vndbindera, które jest wywołaniem procesu (C), a następnie przetwarza wywołania (C) z powrotem do źródła (A), nie można go przesłać w pierwotnym wątku w (A).

Model podziału na wątki serwera

Z wyjątkiem trybu przekazywania aktywne implementacje interfejsów HIDL są uruchomione w innym procesie niż klient i potrzebują co najmniej jednego wątku połączeń przychodzących. Te wątki stanowią pulę wątków serwera. serwer może decyduje, ile wątków ma być uruchomionych w puli wątków, i może użyć funkcji rozmiar puli wątków równą 1, aby zserializować wszystkie wywołania jego interfejsów. Jeśli serwer ma więcej niż jeden wątek w puli wątków, może odbierać równocześnie przychodzące rozmowy w dowolnym jego interfejsie (w C++ oznacza to, że udostępniane dane muszą być ostrożnie zablokowany).

Wywołania jednokierunkowe do tego samego interfejsu są serializowane. Jeśli wielowątkowość klient wywołuje method1 i method2 w interfejsie IFoo i method3 w interfejsie IBar, method1 i method2 są zawsze serializowane, ale method3 może działać równolegle z method1 i method2

Pojedynczy wątek wykonania klienta może powodować równoczesne wykonywanie serwer z wieloma wątkami na dwa sposoby:

  • oneway połączenia nie są blokowane. Jeśli połączenie oneway jest a następnie wywołanie inne niż oneway, serwer może wykonać połączenie oneway i połączenie spoza oneway jednocześnie.
  • Metody serwera przekazujące dane z powrotem za pomocą synchronicznych wywołań zwrotnych mogą odblokować do klienta natychmiast po wywołaniu wywołania zwrotnego z serwera.

W drugim przypadku dowolny kod w funkcji serwera, który jest wykonywany po może być wykonywane równocześnie, przy czym serwer obsługuje kolejne ze strony klienta. Obejmuje to kod w funkcji serwera i automatyczne destruktory wykonywane na końcu funkcji. Jeśli serwer ma więcej niż jednego wątku w puli wątków, problemy z równoczesnością pojawiają się nawet wtedy, gdy przychodzą wywołania tylko z jednego wątku klienta. (Jeśli HAL obsługiwana przez proces wymaga wiele wątków, wszystkie HAL mają wiele wątków, ponieważ pula wątków jest udostępniane dla poszczególnych procesów).

Gdy tylko serwer wywoła podane wywołanie zwrotne, system transportowy może wywołać metodę Wdrożenie wywołania zwrotnego i odblokowanie klienta. Klient kontynuuje równolegle ze wszystkimi działaniami implementacji serwera po wywołaniu wywołanie zwrotne (może ono obejmować uruchamianie destruktorów). Kod w funkcji serwera gdy wywołanie zwrotne nie będzie już blokować klienta (o ile serwer pula wątków ma wystarczającą liczbę wątków do obsługi połączeń przychodzących, ale może zostać wykonana jednocześnie z przyszłymi wywołaniami klienta (chyba że pula wątków serwera ma tylko jeden wątek).

Oprócz synchronicznych wywołań zwrotnych funkcja oneway wywołuje klient jednowątkowy może być obsługiwany jednocześnie przez serwer z wieloma wątki w puli wątków, ale tylko wtedy, gdy te wywołania funkcji oneway wykonywane w różnych interfejsach. oneway połączenia w tym samym czasie są zawsze serializowane.

Uwaga: zdecydowanie zalecamy, aby funkcje serwera natychmiast po wywołaniu funkcji wywołania zwrotnego.

Na przykład (w 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
};

Model podziału klienta na wątki

Model podziału na wątki na kliencie różni się w przypadku wywołań nieblokujących (funkcje oznaczone słowem kluczowym oneway) i blokowanie (funkcje, które nie mają określonego słowa kluczowego oneway).

Blokuj połączenia

W przypadku blokowania połączeń klient blokuje połączenia, dopóki nie wystąpi jedna z tych sytuacji:

  • Występuje błąd związany z transportem. obiekt Return zawiera błąd stan, który można pobrać za pomocą Return::isOk().
  • Implementacja serwera wywołuje wywołanie zwrotne (jeśli takie było).
  • Implementacja serwera zwraca wartość (jeśli nie ma parametru wywołania zwrotnego).

W przypadku powodzenia funkcja wywołania zwrotnego, którą klient przekazuje jako argument, to zawsze wywoływane przez serwer przed zwróceniem samej funkcji. Oddzwanianie to są wykonywane w tym samym wątku, w którym wywoływane jest wywołanie funkcji, więc funkcje implementujące należy zachować ostrożność przy przytrzymywaniu blokad podczas wywoływania funkcji (i unikać ich w miarę możliwości). Funkcja bez instrukcji generates lub słowo kluczowe oneway wciąż jest blokowane; blokowane przez klienta do czasu serwer zwraca obiekt Return<void>.

Połączenia w jedną stronę

Gdy funkcja jest oznaczona jako oneway, klient wraca natychmiast i nie czeka na zakończenie wywołania funkcji przez serwer. Na na powierzchnię (i w postaci zbiorczej), oznacza to, że wywołanie funkcji zajmuje połowę ponieważ wykonuje ona połowę kodu, ale przy pisaniu implementacji, które są wrażliwe na wydajność, może to mieć wpływ na harmonogramy. Zwykle podczas połączenia jednokierunkowego osoba dzwoniąca jest nadal zaplanowana, użycie normalnego wywołania synchronicznego powoduje natychmiastowe przejście przez algorytm szeregowania z rozmówcy do procesu wywołującego. To jest optymalizacja skuteczności w separatora. W przypadku usług, w których proces docelowy musi zostać wykonane wywołanie jednokierunkowe zasadą szeregowania usługi odbierającej może być została zmieniona. W C++ z użyciem metody libhidltransport setMinSchedulerPolicy z priorytetami i zasadami algorytmu szeregowania zdefiniowaną w sched.h gwarantuje, że wszystkie wywołania usługi są wykonywane a przynajmniej ustaw zasadę planowania i priorytet.