Sammendrag: Forståelse av BIO og NIO
Nylig har jeg sannsynligvis sett på kildekoden til ZooKeeper og Mina og funnet ut at begge er implementert i Java NIO, så det er nødvendig å finne ut hva NIO er. Følgende er mitt eget sammendrag basert på informasjon på nettet, for å spare tid tegnet jeg diagrammet uformelt, så lenge jeg klarte å oppnå meningen.
Introduksjon:
BIO: Synkron blokkering av IO, serverimplementeringsmodusen er å koble én tråd om gangen, det vil si at når klienten har en tilkoblingsforespørsel, må serveren starte en tråd for behandling. Hvis denne tilkoblingen ikke gjør noe, vil det føre til unødvendig trådoverhead, selvfølgelig kan det forbedres gjennom trådpool-mekanismen.
NIO: Synkron ikke-blokkerende IO, serverimplementeringsmodusen er én forespørsel per tråd, det vil si at tilkoblingsforespørselen sendt av klienten registreres på multiplekseren, og multiplekseren starter en tråd for behandling når tilkoblingen har en I/O-forespørsel.
AIO (NIO.2): Asynkron ikke-blokkerende IO, serverimplementeringsmodusen er å effektivt be om én tråd, og klientens I/O-forespørsler fullføres først av operativsystemet og deretter varsler serverapplikasjonen om å starte tråden for behandling.
BIOGRAFI
Synkron blokkering av IO, jeg tror alle som har lært nettverksprogrammering av operativsystemet eller nettverksprogrammering på et annet språk er kjent med. I while-løkken vil serveren kalle akseptmetoden for å vente på tilkoblingsforespørselen fra mottakerklienten. Når en tilkoblingsforespørsel er mottatt, kan en kommunikasjonssocket etableres på denne kommunikasjonssocketen for lese- og skriveoperasjoner. På dette tidspunktet kan den ikke lenger motta andre klienttilkoblingsforespørsler, kan bare vente på at operasjonen skal utføres med den nåværende tilkoblede klienten.
Hvis BIO vil kunne behandle flere klientforespørsler samtidig, må den bruke multitråding, det vil si at hver gang akseptblokker venter på en klientforespørsel, når en tilkoblingsforespørsel er mottatt, etableres en kommunikasjonssocket og en ny tråd åpnes for å behandle datalese- og skriveforespørselen til denne socketen, og deretter umiddelbart fortsette å akseptere og vente på andre klienttilkoblingsforespørsler, det vil si at en tråd opprettes for hver klienttilkoblingsforespørsel som behandles individuelt, skjemaet er sannsynligvis slik:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Selv om serveren har høy samtidighet på dette tidspunktet, det vil si at den kan håndtere flere klientforespørsler samtidig, skaper det et problem; ettersom antallet åpne tråder øker, vil det bruke for mye minneressurser, noe som får serveren til å bli tregere eller til og med krasje, og NIO kan løse dette problemet til en viss grad.
NIO
Nøkkelen til synkron ikke-blokkerende IO er å ta i bruk en hendelsesdrevet idé for å implementere en multiplexer.
Den største forskjellen mellom NIO og BIO er at du bare trenger å åpne en tråd for å håndtere IO-hendelser fra flere klienter.
Det er en multiplekser som kan lytte til IO-hendelser fra flere klienter:
A. Hvis serveren lytter til klienttilkoblingsforespørselen, vil den etablere en kommunikasjonssocket for den (kanal i Java), og deretter returnere for å fortsette å lytte.
B. Hvis serveren lytter til dataene som sendes fra klienten som har opprettet en kommunikasjonssocket, vil den kalle det tilsvarende grensesnittet for å behandle de mottatte dataene, og hvis det er flere klienter samtidig, kan dataene også behandles etter tur.
C. Lytt til flere klienters tilkoblingsforespørsler og motta dataforespørsler, og lytt også til når du har data å sende.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Kort sagt, i én tråd kan du kalle multipleksingsgrensesnittet (select i Java) for å blokkere og lytte etter IO-forespørsler fra flere klienter samtidig, og når en IO-forespørsel er mottatt, vil den tilsvarende funksjonen bli kalt for å behandle den.
Respektive bruksscenarier
På dette tidspunktet har du kanskje lagt merke til at når en forespørsel kommer (enten det er flere samtidig eller bare én), vil den tilsvarende IO-behandlingsfunksjonen bli kalt for å håndtere den, altså:
(1) NIO er egnet for håndtering av scenarier med et stort antall tilkoblinger, men tilkoblingene er relativt korte (lett drift), som Jetty, Mina, ZooKeeper osv., som alle er implementert basert på Java Nio.
(2) BIO-metoden er egnet for situasjoner der antallet tilkoblinger er relativt lite og fast, noe som krever høye serverressurser og er begrenset til applikasjoner.
|