Resumé: Forståelse af BIO og NIO
For nylig kiggede jeg sandsynligvis på kildekoden til ZooKeeper og Mina og fandt ud af, at de begge er implementeret i Java NIO, så det er nødvendigt at finde ud af, hvad NIO er. Følgende er mit eget resumé baseret på online information; for at spare tid tegnede jeg diagrammet afslappet, så længe jeg kan opnå meningen.
Indførelsen:
BIO: Synkron blokering af IO, serverimplementeringstilstanden er at forbinde én tråd ad gangen, det vil sige, når klienten har en forbindelsesanmodning, skal serveren starte en tråd til behandling; hvis denne forbindelse ikke gør noget, vil det forårsage unødvendig tråd-overhead, selvfølgelig kan det forbedres gennem trådpool-mekanismen.
NIO: Synkron ikke-blokerende IO, serverimplementeringstilstanden er én forespørgsel pr. tråd, det vil sige, forbindelsesanmodningen sendt af klienten registreres på multiplexeren, og multiplexeren starter en tråd til behandling, når forbindelsen har en I/O-anmodning.
AIO (NIO.2): Asynkron ikke-blokerende IO, serverimplementeringstilstanden er effektivt at anmode om én tråd, og klientens I/O-anmodninger udføres først af operativsystemet og derefter underretter serverapplikationen om at starte tråden til behandling.
BIOGRAFI
Synkron blokering af IO, jeg tror, at alle, der har lært netværksprogrammering i operativsystemet eller netværksprogrammering på et hvilket som helst sprog, er bekendt med det; i while-løkken kalder serveren acceptmetoden for at vente på forbindelsesanmodningen fra den modtagende klient; når en forbindelsesanmodning er modtaget, kan en kommunikationssocket etableres på denne kommunikationssocket til læse- og skriveoperationer, og på dette tidspunkt kan den ikke længere modtage andre klient-forbindelsesanmodninger, kun vente på udførelsen af operationen med den aktuelt forbundne klient.
Hvis BIO vil kunne behandle flere klientanmodninger samtidig, skal den bruge multi-tråding, det vil sige, hver gang acceptblokke venter på en klientanmodning, når en forbindelsesanmodning er modtaget, etableres en kommunikationssocket, og en ny tråd åbnes for at behandle datalæse- og skriveanmodningen fra denne socket, og derefter straks fortsætte med at acceptere og vente på andre klientforbindelsesanmodninger, det vil sige, at der oprettes en tråd for hver klientforbindelsesanmodning, der behandles individuelt, skemaet er sandsynligvis sådan her:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Selvom serveren har høj samtidighed på dette tidspunkt, det vil sige at den kan håndtere flere klientanmodninger på samme tid, skaber det et problem, da antallet af åbne tråde øges, og det vil forbruge for mange hukommelsesressourcer, hvilket får serveren til at sænke tempoet eller endda crashe, og NIO kan løse dette problem til en vis grad.
NIO
Nøglen til synkron ikke-blokerende IO er at anvende en begivenhedsdrevet idé til at implementere en multiplexer.
Den største forskel mellem NIO og BIO er, at du kun behøver at åbne en tråd for at håndtere IO-events fra flere klienter.
Det er en multiplexer, der kan lytte til IO-begivenheder fra flere klienter:
A. Hvis serveren lytter til klientforbindelsesanmodningen, vil den etablere en kommunikationssocket for den (kanal i Java) og derefter vende tilbage for at fortsætte lytningen.
B. Hvis serveren lytter til de data, der sendes fra den klient, der har oprettet en kommunikationssokkel, vil den kalde det tilsvarende interface for at behandle de modtagne data, og hvis der er flere klienter samtidig, kan dataene også behandles på skift.
C. Lyt til flere klienters forbindelsesanmodninger og modtag dataanmodninger, og lyt også efter, hvornår du har data at sende.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Kort sagt kan du i én tråd kalde multiplexing-interfacet (select i Java) for at blokere og lytte efter IO-anmodninger fra flere klienter på samme tid, og når en IO-anmodning er modtaget, vil den tilsvarende funktion blive kaldt for at behandle den.
Respektive anvendelsesscenarier
På dette tidspunkt har du måske bemærket, at når en anmodning ankommer (uanset om det er flere på samme tid eller kun én), vil den tilsvarende IO-behandlingsfunktion blive kaldt for at håndtere den, så:
(1) NIO er velegnet til håndtering af scenarier med et stort antal forbindelser, men forbindelserne er relativt korte (let drift), såsom Jetty, Mina, ZooKeeper osv., som alle er implementeret baseret på Java Nio.
(2) BIO-metoden er velegnet til scenarier, hvor antallet af forbindelser er relativt lille og fast, hvilket kræver store serverressourcer og er begrænset til applikationer.
|