Abstrakt: Porozumění BIO a NIO
Nedávno jsem se pravděpodobně podíval na zdrojový kód ZooKeeperu a Miny a zjistil jsem, že oba jsou implementovány v Java NIO, takže je nutné zjistit, co NIO vlastně je. Následuje mé vlastní shrnutí založené na online informacích, abych ušetřil čas, nakreslil jsem diagram nenuceně, pokud dokážu pochopit význam.
Úvod:
BIO: Synchronous blocking IO, režim implementace serveru spočívá v připojení jednoho vlákna najednou, tedy když má klient požadavek na připojení, server musí spustit vlákno ke zpracování; pokud toto spojení nic nedělá, způsobí zbytečné zatížení vláken, samozřejmě lze to zlepšit mechanismem poolu vláken.
NIO: Synchronní neblokující IO, režim implementace serveru je jeden požadavek na vlákno, tedy požadavek na připojení odeslaný klientem je registrován na multiplexoru a multiplexor zahájí vlákno ke zpracování, když má spojení I/O požadavek.
AIO (NIO.2): Asynchronní neblokující IO, serverový implementační režim spočívá v tom, že efektivně požádá o jedno vlákno, přičemž klientské I/O požadavky jsou nejprve dokončeny OS a poté upozorní serverovou aplikaci, aby zahájila vlákno ke zpracování.
ŽIVOTOPIS
Synchronous blocking IO, věřím, že každý, kdo se naučil programování operačních systémů nebo jakýkoli jazyk síťového programování, je obeznámen, v while smyčce server volá metodu accept a čeká na požadavek na připojení přijímajícího klienta, jakmile je požadavek na spojení přijat, lze na tomto komunikačním socketu vytvořit komunikační socket pro čtení a zápis, v tomto okamžiku již nemůže přijímat další požadavky na připojení klienta, může pouze čekat na spuštění operace s aktuálně připojeným klientem.
Pokud chce BIO zpracovat více klientských požadavků současně, musí použít vícevláknové zpracování, tedy pokaždé při přijímání bloků čekat na klientský požadavek, jakmile je požadavek na spojení přijat, je vytvořen komunikační socket a otevře se nové vlákno pro zpracování požadavků na čtení a zápis dat tohoto socketu, a pak okamžitě pokračovat v přijímání a čekání na další požadavky na připojení klienta, tedy je vytvořeno vlákno pro zpracování každého požadavku na připojení klienta zvlášť, schéma je pravděpodobně takovéto:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Ačkoliv má server v tuto chvíli vysokou souběžnost, tedy může zpracovávat více klientských požadavků současně, přináší to problém, protože s rostoucím počtem otevřených vláken dochází k nadměrnému spotřebování paměťových zdrojů, což způsobuje zpomalení nebo dokonce pád serveru, a NIO tento problém do určité míry vyřeší.
NIO
Klíčem k synchronnímu neblokujícímu IO je přijmout nápad řízený událostmi pro implementaci multiplexoru.
Největší rozdíl mezi NIO a BIO je, že stačí otevřít vlákno pro zpracování IO událostí od více klientů.
Jedná se o multiplexor, který dokáže naslouchat IO událostem od více klientů:
A. Pokud server naslouchá požadavku na připojení klienta, zřídí pro něj komunikační socket (kanál v Javě) a poté se vrátí k pokračování v poslechu.
B. Pokud server poslouchá data odeslaná klientem, který vytvořil komunikační socket, zavolá příslušné rozhraní ke zpracování přijatých dat, a pokud je současně více klientů, mohou být data také zpracována postupně.
C. Naslouchejte více požadavkům klientů na připojení a přijímejte datové požadavky, a také naslouchejte, kdy máte data k odeslání.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Stručně řečeno, v jednom vlákně můžete volat multiplexující rozhraní (select v Javě), abyste blokovali a naslouchali IO požadavkům od více klientů současně, a jakmile je IO požadavek přijat, bude vyvolána odpovídající funkce k jeho zpracování.
Příslušné aplikační scénáře
V tuto chvíli jste si možná všimli, že jakmile dorazí požadavek (ať už je jich najednou několik nebo jen jeden), bude vyvolána odpovídající IO zpracovatelská funkce, takže:
(1) NIO je vhodné pro scénáře s velkým počtem připojení, ale tato spojení jsou relativně krátká (lehký provoz), jako jsou Jetty, Mina, ZooKeeper atd., které jsou všechny implementovány na základě java nio.
(2) Metoda BIO je vhodná pro scénáře, kdy je počet připojení relativně malý a pevný, což vyžaduje vysoké serverové zdroje a je omezeno na aplikace.
|