Tiivistelmä: BIO:n ja NIO:n ymmärtäminen
Äskettäin katsoin varmaan ZooKeeperin ja Minan lähdekoodia ja huomasin, että molemmat on toteutettu Java NIO:lla, joten on tarpeen selvittää, mitä NIO on. Seuraava on oma yhteenvetoni verkkotietojen pohjalta: ajan säästämiseksi piirsin kaavion rennosti, kunhan saan merkityksen aikaan.
Johdanto:
BIO: Synkroninen esto IO, palvelimen toteutustila on yhdistää yksi säie kerrallaan, eli kun asiakkaalla on yhteyspyyntö, palvelimen täytyy käynnistää säie käsittelyä varten, ja jos yhteys ei tee mitään, se aiheuttaa turhaa säikekuormaa, ja tietysti sitä voidaan parantaa säiepoolin mekanismilla.
NIO: Synkroninen ei-blokkaava IO, palvelimen toteutustila on yksi pyyntö per säie, eli asiakkaan lähettämä yhteyspyyntö rekisteröidään multiplexeriin, ja multiplexer käynnistää säikeen käsiteltäväksi, kun yhteydellä on I/O-pyyntö.
AIO (NIO.2): Asynkroninen ei-blokkaava IO, palvelimen toteutustila on käytännössä pyytää yhtä säikettä, ja asiakkaan I/O-pyynnöt suoritetaan ensin käyttöjärjestelmässä ja ilmoittaa palvelinsovellukselle käynnistämään säikeen käsittelyä varten.
ESITTELY
Synkroninen esto IO, uskon että kaikki, jotka ovat oppineet käyttöjärjestelmän verkkoohjelmoinnin tai minkä tahansa kielen verkkoohjelmoinnin, tuntevat sen, while-silmukassa palvelin kutsuu hyväksymismetodin odottamaan vastaanottavan asiakkaan yhteyspyyntöä. Kun yhteyspyyntö on vastaanotettu, tälle viestintäsokealle voidaan perustaa viestintäsoketti luku- ja kirjoitusoperaatioita varten, mutta tällä hetkellä se ei enää voi vastaanottaa muita asiakasyhteyspyyntöjä, vaan voi vain odottaa operaation suoritusta nykyisen asiakkaan kanssa.
Jos BIO haluaa pystyä käsittelemään useita asiakaspyyntöjä samanaikaisesti, sen on käytettävä monisäikeistystä, eli joka kerta kun hyväksymislohkot odottavat asiakaspyyntöä, kun yhteyspyyntö on vastaanotettu, muodostetaan viestintäsoketti ja avataan uusi säie käsittelemään tämän soktin datan luku- ja kirjoituspyyntöä, ja sitten heti jatketaan muiden asiakasyhteyspyyntöjen hyväksymistä ja odottamista, eli luodaan säie jokaiselle asiakasyhteyspyynnölle käsiteltäväksi erikseen, kaavio on todennäköisesti tällainen:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Vaikka palvelimella on tällä hetkellä korkea samanaikaisuus, eli se pystyy käsittelemään useita asiakaspyyntöjä samanaikaisesti, se aiheuttaa ongelman: avoimien säikeiden määrän kasvaessa se kuluttaa liikaa muistiresursseja, mikä hidastaa tai jopa kaatua, ja NIO voi ratkaista tämän ongelman jossain määrin.
NIO
Synkronisen ei-blokkaavan IO:n avain on omaksua tapahtumalähtöinen idea multiplexerin toteuttamiseksi.
Suurin ero NIO:n ja BIO:n välillä on se, että riittää, että avaat säikeen käsittelemään IO-tapahtumia useilta asiakkailta.
Se on multiplexeri, joka voi kuunnella IO-tapahtumia useilta asiakkailta:
A. Jos palvelin kuuntelee asiakasyhteyspyyntöä, se perustaa sille viestintäsokeen (kanava Javassa) ja palaa sitten jatkamaan kuuntelua.
B. Jos palvelin kuuntelee dataa, joka on luonut viestintäliitännän, se kutsuu vastaavan rajapinnan käsittelemään vastaanotettua dataa, ja jos samanaikaisesti on useita asiakkaita, dataa voidaan myös käsitellä vuorotellen.
C. Kuuntele useiden asiakkaiden yhteyspyyntöjä ja vastaanota datapyyntöjä, ja kuuntele myös, milloin sinulla on lähetettävää dataa.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Lyhyesti sanottuna, yhdessä säikeessä voit kutsua multiplexausrajapintaa (valitse javassa) blokkaamaan ja kuuntelemaan IO-pyyntöjä useilta asiakkailta samanaikaisesti, ja kun IO-pyyntö vastaanotetaan, vastaava funktio kutsutaan käsittelemään sitä.
Soveltuvat sovellusskenaariot
Tässä vaiheessa olet ehkä huomannut, että kun pyyntö saapuu (oli se sitten useita samanaikaisesti tai vain yksi), vastaava IO-käsittelyfunktio kutsutaan käsittelemään sitä, joten:
(1) NIO soveltuu käsittelemään skenaarioita, joissa on paljon yhteyksiä, mutta yhteydet ovat suhteellisen lyhyitä (kevyt käyttö), kuten Jetty, Mina, ZooKeeper jne., jotka kaikki toteutetaan java nio -pohjalta.
(2) BIO-menetelmä soveltuu tilanteisiin, joissa yhteyksien määrä on suhteellisen pieni ja kiinteä, mikä vaatii suuria palvelinresursseja ja rajoittuu sovelluksiin.
|