Zusammenfassung: Verständnis von BIO und NIO
Kürzlich habe ich mir wahrscheinlich den Quellcode von ZooKeeper und Mina angesehen und festgestellt, dass beide in Java NIO implementiert sind, daher ist es notwendig herauszufinden, was NIO ist. Das Folgende ist meine eigene Zusammenfassung basierend auf Online-Informationen; um Zeit zu sparen, habe ich das Diagramm beiläufig gezeichnet, solange ich die Bedeutung erreichen kann.
Einleitung:
BIO: Synchrone Blockierung von IO, der Server-Implementierungsmodus besteht darin, jeweils einen Thread nach dem anderen zu verbinden, das heißt, wenn der Client eine Verbindungsanfrage hat, muss der Server einen Thread zur Verarbeitung starten. Wenn diese Verbindung nichts bewirkt, verursacht das unnötigen Thread-Overhead, der natürlich durch den Threadpool-Mechanismus verbessert werden kann.
NIO: Synchronous non-blocking IO, der Server-Implementierungsmodus ist eine Anfrage pro Thread, das heißt, die vom Client gesendete Verbindungsanfrage wird auf dem Multiplexer registriert, und der Multiplexer startet einen Thread zur Verarbeitung, wenn die Verbindung eine I/O-Anfrage hat.
AIO (NIO.2): Asynchrones, nicht blockierendes IO, der Server-Implementierungsmodus besteht darin, effektiv einen Thread anzufordern, und die I/O-Anfragen des Clients werden zuerst vom Betriebssystem erledigt, bevor die Serveranwendung benachrichtigt wird, den Thread zur Verarbeitung zu starten.
BIOGRAFIE
Synchrone Blockierung von IO: Ich glaube, jeder, der Betriebssystem-Netzwerkprogrammierung oder irgendeine Sprachprogrammierung kennengelernt hat, ist vertraut. In der while-Schleife ruft der Server die Accept-Methode auf, um auf die Verbindungsanfrage des empfangenden Clients zu warten. Sobald eine Verbindungsanfrage eingegangen ist, kann auf diesem Kommunikationssocket ein Kommunikationssocket für Lese- und Schreiboperationen eingerichtet werden; zu diesem Zeitpunkt kann er keine anderen Client-Verbindungsanfragen mehr empfangen, sondern nur noch auf die Ausführung der Operation mit dem aktuell verbundenen Client warten.
Wenn BIO mehrere Client-Anfragen gleichzeitig verarbeiten möchte, muss es Multi-Threading verwenden, das heißt, jedes Mal, wenn Akzeptanzblöcke auf eine Client-Anfrage warten, wird nach Erhalt einer Verbindungsanfrage ein Kommunikationssocket eingerichtet und ein neuer Thread geöffnet, um die Datenlese- und Schreibanfrage dieses Sockets zu verarbeiten, und dann sofort weitere Client-Verbindungsanfragen anzunehmen und auf weitere Client-Verbindungsanfragen zu warten, das heißt, es wird ein Thread erstellt, für jede einzelne Client-Verbindungsanfrage wird ein Thread erstellt, der Schaltplan sieht wahrscheinlich so aus:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
Obwohl der Server derzeit eine hohe Nebenläufigkeit hat, also mehrere Client-Anfragen gleichzeitig verarbeiten kann, bringt dies ein Problem mit sich, da die Anzahl der offenen Threads zunimmt, zu viele Speicherressourcen verbrauchen, was dazu führt, dass der Server langsamer wird oder sogar abstürzt, und NIO kann dieses Problem bis zu einem gewissen Grad lösen.
NIO
Der Schlüssel zu synchroner, nicht blockierender IO besteht darin, eine ereignisgesteuerte Idee zur Implementierung eines Multiplexers zu übernehmen.
Der größte Unterschied zwischen NIO und BIO ist, dass man nur einen Thread öffnen muss, um IO-Events von mehreren Clients zu verarbeiten.
Es handelt sich um einen Multiplexer, der IO-Ereignisse mehrerer Clients anhören kann:
A. Wenn der Server die Client-Verbindungsanfrage anhört, richtet er einen Kommunikationssocket dafür ein (Kanal in Java) ein und kehrt dann zurück, um weiterzuhören.
B. Wenn der Server die vom Client gesendeten Daten hört, der einen Kommunikationssocket erstellt hat, ruft er die entsprechende Schnittstelle auf, um die empfangenen Daten zu verarbeiten, und wenn mehrere Clients gleichzeitig vorhanden sind, können die Daten ebenfalls nacheinander verarbeitet werden.
C. Hören Sie sich die Verbindungsanfragen mehrerer Clients an und empfangen Sie Datenanfragen und hören Sie auch, wann Sie Daten zu senden haben.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
Kurz gesagt, in einem Thread kann man die Multiplexing-Schnittstelle (select in Java) aufrufen, um IO-Anfragen von mehreren Clients gleichzeitig zu blockieren und zu hören, und sobald eine IO-Anfrage eingegangen ist, wird die entsprechende Funktion aufgerufen, um sie zu verarbeiten.
Entsprechende Anwendungsszenarien
Zu diesem Zeitpunkt haben Sie vielleicht bemerkt, dass sobald eine Anfrage eintrifft (egal ob mehrere gleichzeitig oder nur eine), die entsprechende IO-Verarbeitungsfunktion aufgerufen wird, um sie zu bearbeiten, also:
(1) NIO eignet sich für Szenarien mit einer großen Anzahl von Verbindungen, aber die Verbindungen sind relativ kurz (leichter Betrieb), wie Jetty, Mina, ZooKeeper usw., die alle auf Java Nio basieren.
(2) Die BIO-Methode eignet sich für Szenarien, in denen die Anzahl der Verbindungen relativ gering und fest ist, was hohe Serverressourcen erfordert und auf Anwendungen beschränkt ist.
|