Bei Hochleistungs-IO-Systemdesign gibt es mehrere Substantivkonzepte, die uns oft verwirrt. Die Details sind wie folgt:
1 Was ist Synchronisation?
2 Was ist asynchron?
3 Was blockiert?
4 Was ist nicht blockiert?
5 Was ist synchrone Blockieren?
6 Was ist synchrone Nicht blockierende?
7 Was ist asynchrones Blockieren?
8 Was ist asynchrone Nicht blockierende?
Lassen Sie mich Ihnen ein Beispiel im Leben geben:
Wenn Sie eine Kung -Pao -Hühnerwürfel -Reisschale wünschen:
Synchrone Blockade: Sie gehen in ein Restaurant, um Essen zu bestellen, dann warten und schreien: OK?
Synchrones Nicht-Blocking: Nachdem ich in einem Restaurant bestellt hatte, ging ich zu dem Hund. Aber nach einer Weile ging er zurück ins Restaurant und rief: OK?
Asynchrone Blockade: Als ich mit dem Hund spazieren ging, erhielt ich einen Anruf aus dem Restaurant, sagte, das Essen sei fertig und bat Sie, ihn persönlich zu bekommen.
Asynchrone Nicht blockierende: Das Restaurant rief und sagte: "Wir kennen Ihren Standort, und ich werde es Ihnen später schicken, damit ich den Hund mit Seelenfrieden führen kann."
Bevor wir die oben genannten Probleme herausfinden, müssen wir zunächst verstehen, welche Synchronisation, Asynchron, Blockierung und Nichtblockierung sind. Nur wenn diese einzelnen Konzepte klar verstanden werden und dann, wenn sie kombiniert werden, ist es relativ einfacher.
1. Synchronisation und Asynchronität sind für die Interaktion zwischen Anwendung und Kernel.
2. Blockieren und Nicht-Blockieren sind verschiedene Methoden, die vom Prozess angewendet werden, wenn Sie auf Daten nach dem Ready Status der IO-Operation zugreifen. Um es unverblümt auszudrücken, handelt es sich um eine Implementierungsmethode zum Lesen oder Schreiben von Betriebsfunktionen. Unter der Blockierungsmethode warten die Lese- oder Schreibfunktion, anstatt die Les- oder Schreibfunktion, sofort einen Zustandswert zurück.
Aus der obigen Beschreibung können wir einen kurzen Satz grundsätzlich zusammenfassen: Synchronisation und Asynchronität sind der Zweck, und Blockierung und Nichtblockierung sind die Implementierungsmethoden.
1. Ich ging raus, um Kleidung auf der Straße zu kaufen und tat dieses Ding selbst, und ich konnte nichts anderes tun.
2. Asynchron: Asynchron bedeutet, dass nach dem Benutzerprozess die IO -Operation auslöst und er seine eigenen Dinge tut. Wenn die IO -Operation abgeschlossen wurde, wird sie über die Fertigstellung des IO informiert (das Merkmal von Asynchron ist die Benachrichtigung). Sagen Sie Ihrem Freund, er soll die Größe, Größe und Farbe der Kleidung entsprechen, und lassen Sie es Ihrem Freund verkaufen, und dann können Sie andere Dinge tun. (Wenn Sie asynchrones IO verwenden, lesen Java IO das Lesen und Schreiben an das Betriebssystem und muss die Adresse und Größe der Datenpuffer an das Betriebssystem übergeben.)
3. Blockierung: Die sogenannte Blockierungsmethode bedeutet, dass das Programm beim Versuch, den Dateideskriptor zu lesen und zu schreiben, wenn nichts zu lesen ist, oder es vorübergehend unkräftig ist, bis etwas zu lesen oder zu schreiben und zur Bushaltestelle zu gehen, um sich aufzuladen. Zu diesem Zeitpunkt ist der Wiederaufladung nicht da (vielleicht ist er auf die Toilette gegangen), und dann warten wir hier, bis der Laden zurückkommt. (Natürlich ist dies in der realen Gesellschaft nicht der Fall, aber in den Computern ist dies in der Tat der Fall.)
4. Nicht blockierend: Im nicht blockierenden Zustand gibt es ohne Warten die Les- und Schreibfunktion sofort zurück, wenn nichts zu lesen ist oder nicht geschrieben werden kann. Wenn die Bank Geld für das Geschäft abhebt, erhalten wir eine kleine Quittung. Nachdem wir es erhalten haben, können wir mit unseren Mobiltelefonen spielen oder mit anderen chatten. Wenn wir uns umdrehen, benachrichtigt der Sprecher der Bank uns und wir können gehen.
Eine IO -Operation ist tatsächlich in zwei Schritte unterteilt: initiieren eine IO -Anfrage und einen tatsächlichen IO -Betrieb.
Der Unterschied zwischen synchronem IO und asynchronem IO besteht darin, ob der zweite Schritt blockiert ist. Wenn der tatsächliche IO den Anforderungsvorgang blockiert und schreiben, handelt es sich um synchrones IO.
Der Unterschied zwischen der Blockierung von IO und dem nicht blockierenden IO liegt im ersten Schritt, ob die IO-Anfrage blockiert wird. Wenn es blockiert ist, bis es fertig ist, ist es der traditionelle Blockierungs -IO. Wenn es nicht blockiert ist, ist es der nicht blockierende IO.
Synchronisation und Asynchron richten sich an die Wechselwirkung zwischen der Anwendung und dem Kernel. Die Synchronisation bezieht sich auf den Benutzerprozess -Auslöser von IO -Vorgängen und Warten oder Umfragen, um festzustellen, ob der IO -Betrieb fertig ist. Asynchron bedeutet, dass der Benutzerprozess nach dem Auslösen des IO -Vorgangs seine eigenen Dinge erledigt. Wenn der IO -Betrieb abgeschlossen wurde, wird mitgeteilt, dass die IO -Fertigstellung abgeschlossen wird.
Blockieren und Nicht-Blockieren sind verschiedene Methoden, die vom Prozess bei der Zugriff auf Daten gemäß dem Ready-Status des IO-Betriebs angewendet werden. Um es unverblümt auszudrücken, handelt es sich um eine Implementierungsmethode zum Lesen oder Schreiben von Betriebsfunktionen. Unter der Blockierungsmethode warten die Lese- oder Schreibfunktion, anstatt die Les- oder Schreibfunktion, sofort einen Zustandswert zurück.
Daher können IO-Operationen in drei Kategorien unterteilt werden: synchrones Blockieren (d. H. Früh Biooperationen), synchrone Nicht-Blockierungen (NIO) und asynchrones Nicht-Blocking (AIO).
Synchronous Blocking (Bio):
Auf diese Weise muss es nach Abschluss des IO -Vorgangs warten, nachdem der Benutzerprozess eine IO -Operation initiiert hat. Erst nachdem der IO -Vorgang wirklich abgeschlossen ist, kann der Benutzerprozess ausgeführt werden. Javas traditionelles IO -Modell gehört zu dieser Methode.
Synchrones Nicht-Blocking (NIO):
Auf diese Weise kann der Benutzerprozess nach dem Start eines IO -Vorgangs zurückkehren, um andere Dinge zu erledigen, aber der Benutzerprozess muss sich fragen, ob der IO -Vorgang von Zeit zu Zeit fertig ist, wodurch der Benutzerprozess ständig gefragt werden muss, wodurch unnötige Verschwendung von CPU -Ressourcen eingeführt wird. Derzeit ist Javas NIO synchron und blockierende IO.
Asynchrone nicht blockierende (AIO):
Auf diese Weise wartet es nach Abschluss des IO -Vorgangs des Kernels nicht, nachdem der Antrag einen IO -Betrieb initiiert hat, und wird den Antrag nach Abschluss des Kernels mit dem IO -Betrieb benachrichtigen.
Synchronous Blocking IO (Java Bio):
Synchronisieren und blockieren, der Server -Implementierungsmodus soll eine Verbindung zu einem Thread herstellen, dh wenn der Client eine Verbindungsanforderung hat, muss der Server einen Thread zur Verarbeitung starten. Wenn diese Verbindung nichts bewirkt, führt sie zu unnötigem Fadenaufwand und kann natürlich durch den Fadenbeckenmechanismus verbessert werden.
Synchrone nicht blockierende IO (Java Nio):
Synchronous Nicht-Blocking, der Server-Implementierungsmodus soll einen Thread anfordern. Die vom Client gesendeten Verbindungsanforderungen werden beim Multiplexer registriert. Der Multiplexer befragt die Verbindung zur E/A -Anforderung und startet einen Thread zur Verarbeitung. Der Benutzerprozess muss auch fragen, ob der IO -Vorgang von Zeit zu Zeit bereit ist, wodurch der Benutzerprozess ständig gefragt werden muss.
Asynchronous Blocking IO (Java Nio):
Auf diese Weise wartet es nach Abschluss des IO -Vorgangs des Kernels nicht, nachdem der Antrag einen IO -Betrieb initiiert hat, und wird den Antrag nach Abschluss des Kernels mit dem IO -Betrieb benachrichtigen. Dies ist tatsächlich der kritischste Unterschied zwischen Synchronisation und Asynchron. Die Synchronisation muss warten oder aktiv fragen, ob die IO abgeschlossen ist. Warum ist es blockiert? Da dies zu diesem Zeitpunkt durch ausgewählte Systemaufrufe durchgeführt wird und die Implementierung der Auswahlfunktion selbst blockiert, und ein Vorteil der Verwendung der ausgewählten Funktion besteht darin, dass sie mehrere Dateigriffe gleichzeitig anhören kann (wenn aus der Sicht der UNP -Funktion eine synchrone Operation ist. Nachdem der Prozess nach dem Auswählen auch Daten lesen und schreiben muss), verbessert die Übereinstimmung des Systems des Systems!
(Java AIO (NIO.2)) Asynchroner nicht blockierender IO:
In diesem Modus muss der Benutzerprozess nur eine IO -Operation einleiten und sofort zurückkehren. Nachdem der IO -Betrieb wirklich abgeschlossen ist, wird der Antrag mitgeteilt, dass der IO -Betrieb abgeschlossen ist. Zu diesem Zeitpunkt muss der Benutzerprozess nur die Daten verarbeiten und muss keine tatsächlichen IO -Lese- und Schreibvorgänge ausführen, da die realen Les- oder Schreibvorgänge vom Kernel abgeschlossen wurden.
Analyse der anwendbaren Szenarien für Bio, NIO und AIO:
Die Bio -Methode ist für Architekturen mit relativ kleinen Verbindungen und festen Verbindungen geeignet. Diese Methode erfordert hohe Serverressourcen und die Parallelität beschränkt sich auf Anwendungen. Es ist die einzige Wahl vor JDK1.4, aber das Programm ist intuitiv, einfach und leicht zu verstehen.
Die NIO -Methode ist für Architekturen mit einer großen Anzahl von Verbindungen und relativ kurzen Verbindungen (Lichtbetrieb) geeignet, z. B. Chat -Server. Die Parallelität beschränkt sich auf Anwendungen und hat eine relativ komplexe Programmierung. JDK1.4 hat begonnen, es zu unterstützen.
Die AIO -Methode wird für Architekturen mit einer großen Anzahl von Verbindungen und einer relativ langen Verbindung (Reoperation) verwendet, wie z. JDK7 hat begonnen, es zu unterstützen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.