Sammanfattning: Förståelse av BIO och NIO
Nyligen tittade jag troligen på källkoden för ZooKeeper och Mina och upptäckte att båda är implementerade i Java NIO, så det är nödvändigt att ta reda på vad NIO är. Följande är min egen sammanfattning baserad på information online, för att spara tid ritade jag diagrammet avslappnat, så länge jag kan uppnå meningen.
Införandet:
BIO: Synkron blockering av IO, serverimplementeringsläget är att ansluta en tråd i taget, det vill säga, när klienten har en anslutningsförfrågan måste servern starta en tråd för bearbetning, om denna anslutning inte gör något orsakar det onödig trådöverhead, det kan förstås förbättras genom trådpoolmekanismen.
NIO: Synkron icke-blockerande IO, serverimplementeringsläget är en förfrågan per tråd, det vill säga anslutningsförfrågan som skickas av klienten registreras på multiplexern, och multiplexern startar en tråd för bearbetning när anslutningen har en I/O-förfrågan.
AIO (NIO.2): Asynkron icke-blockerande IO, serverimplementeringsläget är att effektivt begära en tråd, och klientens I/O-förfrågningar slutförs först av operativsystemet och meddelar sedan serverapplikationen att starta tråden för bearbetning.
BIOGRAFI
Synkron blockerande IO, jag tror att alla som har lärt sig nätverksprogrammering för operativsystem eller något språk inom nätverksprogrammering är bekanta, i while-loopen anropar servern accept-metoden för att vänta på anslutningsförfrågan från mottagaren, när en anslutningsförfrågan har mottagits kan en kommunikationssocket upprättas på denna kommunikationssocket för läs- och skrivoperationer, vid denna tidpunkt kan den inte längre ta emot andra klientanslutningsförfrågningar, kan bara vänta på att operationen körs med den nuvarande anslutna klienten.
Om BIO vill kunna behandla flera klientförfrågningar samtidigt måste den använda multitrådning, det vill säga varje gång acceptblock väntar på en klientförfrågan, när en anslutningsförfrågan har mottagits, upprättas en kommunikationssocket och en ny tråd öppnas för att behandla dataläsnings- och skrivförfrågan från denna socket, och sedan omedelbart fortsätta att acceptera och vänta på andra klientanslutningsförfrågningar, det vill säga en tråd skapas för varje klientanslutningsförfrågan som ska behandlas individuellt, schemat ser troligen ut så här:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Även om servern har hög samtidighet vid denna tidpunkt, det vill säga att den kan hantera flera klientförfrågningar samtidigt, medför det ett problem, eftersom antalet öppna trådar ökar förbrukar den för mycket minnesresurser, vilket gör att servern saktar ner eller till och med kraschar, och NIO kan till viss del lösa detta problem.
NIO
Nyckeln till synkron icke-blockerande IO är att anta en händelsedriven idé för att implementera en multiplexer.
Den största skillnaden mellan NIO och BIO är att du bara behöver öppna en tråd för att hantera IO-händelser från flera klienter.
Det är en multiplexer som kan lyssna på IO-händelser från flera klienter:
A. Om servern lyssnar på klientanslutningsförfrågan kommer den att etablera en kommunikationssocket för den (kanal i Java) och sedan återgå för att fortsätta lyssna.
B. Om servern lyssnar på data som skickas från klienten som har skapat en kommunikationssocket, kommer den att anropa motsvarande gränssnitt för att bearbeta den mottagna datan, och om det finns flera klienter samtidigt kan även datan bearbetas i sin tur.
C. Lyssna på flera klienters anslutningsförfrågningar och ta emot dataförfrågningar, och även lyssna när du har data att skicka.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Kort sagt, i en tråd kan du anropa multiplexeringsgränssnittet (select i Java) för att blockera och lyssna efter IO-förfrågningar från flera klienter samtidigt, och när en IO-förfrågan har mottagits anropas motsvarande funktion för att behandla den.
respektive tillämpningsscenario
Vid det här laget har du kanske märkt att när en begäran anländer (oavsett om det är flera samtidigt eller bara en), kommer motsvarande IO-bearbetningsfunktion att anropas för att hantera den, alltså:
(1) NIO är lämplig för att hantera scenarier med ett stort antal anslutningar, men anslutningarna är relativt korta (lätt drift), såsom Jetty, Mina, ZooKeeper etc., vilka alla är implementerade baserat på Java Nio.
(2) BIO-metoden är lämplig för scenarier där antalet anslutningar är relativt litet och fast, vilket kräver höga serverresurser och är begränsat till applikationer.
|