Ez a cikk egy tükör gépi fordítás, kérjük, kattintson ide, hogy ugorjon az eredeti cikkre.

Nézet: 12132|Válasz: 1

[Kommunikáció] A BIO és a NIO megértése

[Linket másol]
Közzétéve 2019. 05. 17. 15:34:50 | | |

Kivonat: A BIO és a NIO megértése
Nemrég valószínűleg megnéztem a ZooKeeper és a Mina forráskódját, és rájöttem, hogy mindkettő Java NIO-ban van megvalósítva, ezért fontos kideríteni, mi az a NIO. Az alábbiakban az én összefoglalóm online információk alapján, az időmegtakarítás érdekében lazán rajzoltam a diagramot, amíg el tudom érni a jelentését.

Bevezetés:
BIO: Szinkron blokkoló IO, a szerver megvalósítási módja az, hogy egyszerre csak egy szálat köt össze, vagyis amikor a kliensnek van kapcsolatkérése, a szervernek el kell indítania egy szálat feldolgozásra, ha ez a kapcsolat nem működik, az felesleges szálterhelést okoz, természetesen javítható a szálpool mechanizmusával.
NIO: Szinkron, nem blokkoló IO, a szerver megvalósítási módja egy kérésről szól szálonként, vagyis a kliens által küldött kapcsolati kérés regisztrálódik a multiplexerben, és a multiplexer indít egy szálat feldolgozásra, ha a kapcsolat I/O kérést tartalmaz.
AIO (NIO.2): Aszinkron, nem blokkoló IO, a szerver megvalósítási módja lényege, hogy gyakorlatilag egy szálat kér, és az ügyfél I/O kéréseit először az operációs rendszer teljesíti, majd értesíti a szerveralkalmazást, hogy indítsa el a szálat feldolgozásra.

ÉLETRAJZ
Szinkron blokkoló IO, úgy hiszem, mindenki, aki már tanult operációs rendszer hálózati programozást vagy bármilyen nyelvű hálózati programozást, ismeri, a while ciklusban a szerver az accept-metóduszot hívja, hogy megvárja a vevő kliens csatlakozási kérelmét, miután egy kapcsolatkérés megérkezett, ezen a kommunikációs socketen létrehozható egy kommunikációs socket olvasási és írási műveletekhez, ekkor már nem tud más klienskapcsolati kéréseket fogadni, csak a művelet végrehajtására várhat a jelenleg csatlakoztatott kliensrel.
Ha a BIO egyszerre több klienskérést akar feldolgozni, többszálas megoldást kell használnia, vagyis minden alkalommal, amikor az acceptblockok egy klienskérésre várnak, amikor egy kapcsolati kérést kapnak, egy kommunikációs socket létrejön, és egy új szálat nyitnak a socket adatolvasási és írási kérelmek feldolgozására, majd azonnal folytatja a fogadást és várakozást más klienskapcsolati kérésekre, vagyis minden klienskapcsolati kéréshez külön-külön készítenek egy szálat, a séma valószínűleg így van:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg

Bár a szervernek jelenleg magas a párhuzamossága, vagyis egyszerre több kliens kérést is képes kezelni, ez problémát okoz: ahogy a nyitott szálak száma nő, túl sok memória erőforrást fogyaszt, ami lelassítja vagy akár összeomlik a szervert, és a NIO bizonyos mértékig meg tudja oldani ezt a problémát.

NIO
A szinkron, nem blokkoló IO kulcsa, hogy egy eseményvezérelt ötletet alkalmazunk a multiplexer megvalósításához.
A legnagyobb különbség a NIO és a BIO között, hogy csak egy szálat kell megnyitnod több kliensből származó IO események kezelésére.
Ez egy multiplexer, amely több klienstől is képes meghallgatni IO eseményeket:
A. Ha a szerver meghallgatja a kliens kapcsolati kérését, létrehoz számára egy kommunikációs socketet (Java csatorná), majd visszatér a hallgatás folytatásához.
B. Ha a szerver meghallgatja az ügyféltől küldött adatokat, amely kommunikációs socketet hozott létre, akkor a megfelelő interfészt hívja a befogadott adatok feldolgozására, és ha egyszerre több kliens van, az adatok is feldolgozhatók.
C. Hallgasd meg több kliens kapcsolati kérését, fogadj adatkéréseket, és figyeld meg, mikor van adatot küldeni.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg


Röviden: egy szálban hívhatod a multiplexező interfészt (Java-ban select), hogy egyszerre blokkolja és hallgasd meg több klienstől érkező IO kéréseket, és ha egy IO kérés megérkezik, a megfelelő függvény megszólalja azt.

Megfelelő alkalmazási forgatókönyvek
Ekkorra már észrevetted, hogy ha megérkezik egy kérés (akár több egyszerre, akár csak egy), a megfelelő IO feldolgozó függvényt hívják meg, hogy kezelje azt, tehát a következők:
(1) A NIO alkalmas olyan helyzetek kezelésére, ahol sok kapcsolat van, de a kapcsolatok viszonylag rövidek (könnyű működés), mint például Jetty, Mina, ZooKeeper stb., amelyek mind java nio alapján valósultak meg.
(2) A BIO módszer alkalmas olyan helyzetekre, ahol a kapcsolatok száma viszonylag kicsi és fix, ami magas szervererőforrást igényel, és csak az alkalmazásokra korlátozódik.





Előző:Az ajax és az axios és a fetch közötti különbség
Következő:Nyílt forráskódú job scheduling framework Quartz
Közzétéve 2019. 05. 21. 19:32:33 |
Tanulj meg
Lemondás:
A Code Farmer Network által közzétett összes szoftver, programozási anyag vagy cikk kizárólag tanulási és kutatási célokra szolgál; A fenti tartalmat nem szabad kereskedelmi vagy illegális célokra használni, különben a felhasználók viselik az összes következményet. Az oldalon található információk az internetről származnak, és a szerzői jogi vitáknak semmi köze ehhez az oldalhoz. A fenti tartalmat a letöltés után 24 órán belül teljesen törölni kell a számítógépéről. Ha tetszik a program, kérjük, támogassa a valódi szoftvert, vásároljon regisztrációt, és szerezzen jobb hiteles szolgáltatásokat. Ha bármilyen jogsértés történik, kérjük, vegye fel velünk a kapcsolatot e-mailben.

Mail To:help@itsvse.com