Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 12132|Odpowiedź: 1

[Komunikacja] Zrozumienie BIO i NIO

[Skopiuj link]
Opublikowano 17.05.2019 15:34:50 | | |

Streszczenie: Zrozumienie BIO i NIO
Ostatnio prawdopodobnie sprawdziłem kod źródłowy ZooKeepera i Miny i zauważyłem, że oba są zaimplementowane w Java NIO, więc trzeba ustalić, czym jest NIO. Poniżej znajduje się moje własne podsumowanie oparte na informacjach online, aby zaoszczędzić czas, narysowałem diagram swobodnie, o ile mogę odgadać sens.

Wprowadzenie:
BIO: Synchronous Blocking IO, tryb implementacji serwera, polega na łączeniu jednego wątku na raz, czyli gdy klient ma żądanie połączenia, serwer musi rozpocząć wątek do przetwarzania; jeśli to połączenie nic nie robi, spowoduje niepotrzebny narzut wątku, oczywiście można to poprawić za pomocą mechanizmu puli wątków.
NIO: Synchroniczny nieblokujący IO, tryb implementacji serwera to jedno żądanie na wątek, czyli żądanie połączenia wysyłane przez klienta jest rejestrowane w multiplekserze, a multiplekser rozpoczyna wątek do przetwarzania, gdy połączenie ma żądanie I/O.
AIO (NIO.2): Asynchroniczny, nieblokujący IO, tryb implementacji serwera polega na skutecznym żądaniu jednego wątku, a żądania I/O klienta są najpierw realizowane przez system operacyjny, a następnie powiadamia aplikację serwerową o rozpoczęciu wątku do przetwarzania.

BIOGRAFIA
Synchronous Blocking IO, o ile pamiętam, każdy, kto znał programowanie sieci systemu operacyjnego lub jakiegokolwiek innego języka, jest zaznajomiony, w pętli while serwer wywołuje metodę akceptacji, aby oczekiwać na żądanie połączenia od odbiorcy, po otrzymaniu żądania połączenia można utworzyć gniazdo komunikacyjne na tym gnieździe komunikacyjnym do operacji odczytu i zapisu, w tym momencie nie może już odbierać innych żądań połączenia klienta, może jedynie czekać na wykonanie operacji z aktualnie podłączonym klientem.
Jeśli BIO chce przetwarzać wiele żądań klientów jednocześnie, musi stosować wielowątkowość, czyli za każdym razem, gdy bloki akceptują, czekają na żądanie klienta, po otrzymaniu żądania połączenia ustanawia się gniazdo komunikacyjne i otwiera się nowy wątek do przetwarzania żądań odczytu i zapisu danych tego gniazda, a następnie natychmiast kontynuuje przyjmowanie i oczekiwanie na inne żądania połączenia klienta, czyli tworzy się wątek dla każdego żądania połączenia klienta do przetwarzania indywidualnie, schemat prawdopodobnie wygląda tak:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg

Chociaż serwer ma obecnie dużą równocześność, czyli może obsługiwać wiele żądań klientów jednocześnie, pojawia się problem, ponieważ wraz ze wzrostem liczby otwartych wątków zużywa zbyt dużo zasobów pamięci, co powoduje spowolnienie lub nawet awarię serwera, a NIO może rozwiązać ten problem do pewnego stopnia.

NIO
Kluczem do synchronicznego nieblokującego IO jest przyjęcie pomysłu opartego na zdarzeniach do implementacji multipleksera.
Największa różnica między NIO a BIO polega na tym, że wystarczy otworzyć wątek, aby obsługiwać zdarzenia IO od wielu klientów.
Jest to multiplekser, który może odsłuchiwać zdarzenia IO od wielu klientów:
A. Jeśli serwer wysłucha żądania połączenia klienta, ustanowi dla niego gniazdo komunikacyjne (kanał w Javi), a następnie wróci, aby kontynuować nasłuch.
B. Jeśli serwer nasłuchuje danych przesłanych od klienta, który utworzył gniazdo komunikacyjne, wywoła odpowiadający mu interfejs, aby przetworzyć odebrane dane, a jeśli jest wielu klientów jednocześnie, dane mogą być przetwarzane z kolei.
C. Słuchaj wielu żądań połączenia klientów i otrzymuj dane oraz sprawdzaj, kiedy masz dane do wysłania.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg


Krótko mówiąc, w jednym wątku możesz wywołać interfejs multipleksujący (select w Javie), aby blokować i nasłuchiwać żądań IO od wielu klientów jednocześnie, a po otrzymaniu żądania IO zostanie wywołana odpowiadająca mu funkcja do jego przetwarzania.

Odpowiednie scenariusze zastosowań
Do tego momentu mogłeś zauważyć, że gdy pojawi się żądanie (niezależnie od tego, czy jest to kilka jednocześnie, czy tylko jedno), odpowiadająca mu funkcja przetwarzania IO zostanie wywołana, więc:
(1) NIO nadaje się do obsługi scenariuszy z dużą liczbą połączeń, ale połączenia są stosunkowo krótkie (lekkie działanie), takie jak Jetty, Mina, ZooKeeper itd., które wszystkie są zaimplementowane w oparciu o java nio.
(2) Metoda BIO jest odpowiednia w sytuacjach, gdy liczba połączeń jest stosunkowo mała i stała, co wymaga dużych zasobów serwera i ogranicza się do aplikacji.





Poprzedni:Różnica między Ajaxem a Axios i fetchem
Następny:Open source framework do harmonogramowania zadań Quartz
Opublikowano 21.05.2019 19:32:33 |
Naucz się uczyć
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com