Abstrakt: Pochopenie BIO a NIO
Nedávno som pravdepodobne pozrel zdrojový kód ZooKeeper a Mina a zistil som, že oba sú implementované v Java NIO, takže je potrebné zistiť, čo NIO vlastne je. Nasleduje moje vlastné zhrnutie založené na online informáciách, aby som ušetril čas, nakreslil som diagram nenútene, pokiaľ dokážem pochopiť význam.
Zavedenie:
BIO: Synchronous blocking IO, režim implementácie servera spočíva v pripojení jedného vlákna naraz, teda keď má klient požiadavku na pripojenie, server musí spustiť vlákno na spracovanie, ak toto spojenie nič nerobí, spôsobí zbytočnú záťaž vlákien, samozrejme, môže sa to zlepšiť mechanizmom poolu vlákien.
NIO: Synchronný neblokujúci IO, režim implementácie servera je jedna požiadavka na vlákno, teda požiadavka na pripojenie odoslaná klientom bude zaregistrovaná na multiplexeri a multiplexer spustí vlákno na spracovanie, keď má spojenie I/O požiadavku.
AIO (NIO.2): Asynchrónny neblokujúci IO, režim implementácie servera spočíva v tom, že efektívne požiada o jedno vlákno, pričom I/O požiadavky klienta najskôr dokončí OS a potom upozorní serverovú aplikáciu, aby spustila vlákno na spracovanie.
ŽIVOTOPIS
Synchronné blokovanie IO, myslím, že každý, kto sa naučil programovanie operačných systémov alebo akýkoľvek jazyk sieťového programovania, je oboznámený, v while slučke server volá metódu akceptovať, aby počkal na požiadavku na pripojenie prijímajúceho klienta, po prijatí požiadavky na spojenie môže byť na tejto komunikačnej zásuvke vytvorená komunikačná socket pre operácie čítania a zápisu, v tomto momente už nemôže prijímať ďalšie požiadavky na pripojenie klienta, môže len čakať na vykonanie operácie s aktuálne pripojeným klientom.
Ak chce BIO spracovávať viacero požiadaviek klientov súčasne, musí použiť viacvláknové spracovanie, teda zakaždým, keď prijímacie bloky čakajú na požiadavku klienta, po prijatí požiadavky na spojenie sa vytvorí komunikačný socket a otvorí sa nové vlákno na spracovanie požiadaviek na čítanie a zápis údajov tohto socketu, a potom okamžite pokračuje v prijímaní a čakaní na ďalšie požiadavky na pripojenie klienta, teda vytvorí sa vlákno pre spracovanie každého požiadavku na pripojenie jednotlivo, schéma pravdepodobne vyzerá takto:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Hoci má server v súčasnosti vysokú súbežnosť, teda dokáže spracovať viaceré požiadavky klientov naraz, prináša to problém, pretože s rastúcim počtom otvorených vlákien sa spotrebúva príliš veľa pamäťových zdrojov, čo spôsobuje spomalenie alebo dokonca pád servera, a NIO dokáže tento problém do určitej miery vyriešiť.
NIO
Kľúčom k synchronnému neblokujúcemu IO je prijatie nápadu riadeného udalosťami na implementáciu multiplexora.
Najväčší rozdiel medzi NIO a BIO je, že stačí otvoriť vlákno na spracovanie IO udalostí od viacerých klientov.
Je to multiplexer, ktorý dokáže počúvať IO udalosti od viacerých klientov:
A. Ak server počúva požiadavku na pripojenie klienta, vytvorí pre ňu komunikačný socket (kanál v Jave) a potom sa vráti na pokračovanie v počúvaní.
B. Ak server počúva dáta odoslané od klienta, ktorý vytvoril komunikačný socket, zavolá príslušné rozhranie na spracovanie prijatých dát, a ak je súčasne viacero klientov, dáta môžu byť spracované postupne.
C. Počúvajte viaceré požiadavky na pripojenie klientov a prijímajte dátové požiadavky, a tiež počúvajte, kedy máte dáta na odoslanie.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Stručne povedané, v jednom vlákne môžete zavolať multiplexovacie rozhranie (select v Jave), ktoré blokuje a počúva IO požiadavky od viacerých klientov súčasne, a po prijatí IO požiadavky sa zavolá zodpovedajúca funkcia na jej spracovanie.
Príslušné aplikačné scenáre
V tomto bode ste si možno všimli, že keď požiadavka dorazí (či už je viacero naraz alebo len jedna), bude zavolaná príslušná IO spracovateľská funkcia, takže:
(1) NIO je vhodný na spracovanie scenárov s veľkým počtom pripojení, ale pripojenia sú relatívne krátke (ľahká prevádzka), ako napríklad Jetty, Mina, ZooKeeper a podobne, ktoré sú všetky implementované na základe java nio.
(2) Metóda BIO je vhodná pre situácie, kde je počet pripojení relatívne malý a pevný, čo vyžaduje vysoké serverové zdroje a je obmedzené len na aplikácie.
|