Heim > Java > javaLernprogramm > Hauptteil

Gängige IO/NIO-Modelle in JAVA

(*-*)浩
Freigeben: 2019-08-23 15:39:37
nach vorne
2749 Leute haben es durchsucht

Zu unseren gängigen E/A-Modellen gehören: blockierendes E/A-Modell, nicht blockierendes E/A-Modell, signalgesteuertes E/A-Modell, asynchrones E/A-Modell. Nachfolgend stellen wir die oben genannten E/A-Modelle kurz vor.

Gängige IO/NIO-Modelle in JAVA

1. Blockierendes IO-Modell

Das traditionellste IO-Modell, das heißt, die Blockierung erfolgt während des Lese- und Schreibvorgangs Daten. Phänomen. Wenn der Benutzer-Thread eine E/A-Anfrage ausgibt, prüft der Kernel, ob die Daten bereit sind. Wenn nicht, wartet er, bis die Daten bereit sind, und der Benutzer-Thread wird blockiert und der Benutzer-Thread übergibt die CPU. Wenn die Daten bereit sind, kopiert der Kernel die Daten in den Benutzer-Thread und gibt das Ergebnis an den Benutzer-Thread zurück. Anschließend gibt der Benutzer-Thread den Blockstatus frei. Ein typisches Beispiel für ein blockierendes IO-Modell ist: data = socket.read(); wenn die Daten nicht bereit sind, werden sie in der Lesemethode immer blockiert.

2. Nicht blockierendes IO-Modell

Wenn der Benutzer-Thread einen Lesevorgang initiiert, muss nicht gewartet werden, sondern es wird sofort ein Ergebnis erhalten. Wenn das Ergebnis ein Fehler ist, weiß es, dass die Daten noch nicht bereit sind, und kann den Lesevorgang erneut senden. Sobald die Daten im Kernel bereit sind und erneut eine Anfrage vom Benutzerthread empfangen wird, kopiert dieser die Daten sofort in den Benutzerthread und kehrt dann zurück. Tatsächlich muss der Benutzerthread im nicht blockierenden E/A-Modell den Kernel ständig fragen, ob die Daten bereit sind, was bedeutet, dass nicht blockierende E/A die CPU nicht übergibt, sondern immer die CPU belegt. Ein typisches nicht blockierendes IO-Modell sieht im Allgemeinen wie folgt aus:

while(true){
        data = socket.read();
        if(data!= error){
        处理数据
        break;
    }
}
Nach dem Login kopieren

Es gibt jedoch ein sehr ernstes Problem mit nicht blockierendem IO. In der while-Schleife müssen Sie ständig fragen, ob die Kerneldaten bereit sind. Dies führt zu einer sehr hohen CPU-Auslastung, sodass die While-Schleife im Allgemeinen selten zum Lesen von Daten verwendet wird.

3. Multiplex-IO-Modell

Das Multiplex-IO-Modell wird derzeit häufiger verwendet.

Java NIO ist eigentlich Multiplex-IO. Im Multiplex-E/A-Modell gibt es einen Thread, der kontinuierlich den Status mehrerer Sockets abfragt. Nur wenn der Socket tatsächlich Lese- und Schreibereignisse hat, werden die tatsächlichen E/A-Lese- und Schreibvorgänge tatsächlich aufgerufen.

Da im Multiplex-IO-Modell nur ein Thread zum Verwalten mehrerer Sockets verwendet werden kann, muss das System weder neue Prozesse oder Threads erstellen noch diese Threads und Prozesse verwalten, und zwar nur in Echte E/A-Ressourcen werden nur verwendet, wenn Socket-Lese- und Schreibereignisse vorliegen, wodurch die Ressourcennutzung erheblich reduziert wird.

In Java NIO wird selector.select() verwendet, um abzufragen, ob für jeden Kanal ein Ankunftsereignis vorliegt. Wenn kein Ereignis vorhanden ist, wird es dort immer blockiert, sodass diese Methode den Benutzer-Thread verursacht blockieren.

Multiplex-IO-Modus, mehrere Sockets können über einen Thread verwaltet werden. Nur wenn der Socket tatsächlich Lese- und Schreibereignisse hat, werden Ressourcen für tatsächliche Lese- und Schreibvorgänge belegt. Daher eignet sich Multiplex-E/A besser für Situationen, in denen die Anzahl der Verbindungen groß ist.

Darüber hinaus ist Multiplex-IO effizienter als das nicht-blockierende IO-Modell, weil bei nicht-blockierendem IO der Socket-Status ständig über den Benutzer-Thread abgefragt wird, während bei Multiplex-IO der Status jedes einzelnen abgefragt wird Socket wird vom Kernel ausgeführt, und diese Effizienz ist viel höher als die von Benutzer-Threads.

Es ist jedoch zu beachten, dass das Multiplex-IO-Modell mithilfe von Abfragen erkennt, ob ein Ereignis eingetroffen ist, und nacheinander auf die eintreffenden Ereignisse reagiert. Daher werden beim Multiplex-E/A-Modell nachfolgende Ereignisse verzögert und wirken sich auf die Abfrage neuer Ereignisse aus, sobald der Ereignisantwortkörper groß ist.

4. Signalgesteuertes E/A-Modell

Im signalgesteuerten E/A-Modell wird eine Signalfunktion registriert, wenn der Benutzerthread eine E/A-Anforderungsoperation initiiert Der entsprechende Socket wird dann weiter ausgeführt. Wenn die Kerneldaten bereit sind, wird ein Signal an den Benutzerthread gesendet. Nach dem Empfang des Signals ruft der Benutzerthread die E/A-Lese- und Schreibvorgänge in der Signalfunktion auf um den eigentlichen E/A-Anforderungsvorgang auszuführen.

5. Asynchrones IO-Modell

Das asynchrone IO-Modell ist das idealste IO-Modell, wenn der Benutzer-Thread einen Lesevorgang initiiert sofort können Sie mit anderen Dingen beginnen.

Andererseits wird aus Sicht des Kernels, wenn er einen asynchronen Lesevorgang empfängt, dieser sofort zurückgegeben, was darauf hinweist, dass die Leseanforderung erfolgreich initiiert wurde, sodass kein Block für den Benutzerthread generiert wird.

Dann wartet der Kernel auf den Abschluss der Datenvorbereitung und kopiert dann die Daten in den Benutzer-Thread. Wenn dies alles abgeschlossen ist, sendet der Kernel ein Signal an den Benutzer-Thread, um ihm dies mitzuteilen Der Lesevorgang ist abgeschlossen. Mit anderen Worten: Der Benutzerthread muss nicht wissen, wie die gesamte E/A-Operation tatsächlich ausgeführt wird. Er muss lediglich zuerst eine Anfrage initiieren. Wenn er das vom Kernel zurückgegebene Erfolgssignal empfängt, bedeutet dies, dass die E/A-Operation abgeschlossen ist und die Daten können direkt genutzt werden.

Das heißt, im asynchronen IO-Modell blockiert keine Phase des IO-Vorgangs den Benutzer-Thread. Beide Phasen werden vom Kernel automatisch abgeschlossen und dann wird ein Signal gesendet, um den Benutzer-Thread darüber zu informieren Der Vorgang wurde abgeschlossen. Für bestimmte Lese- und Schreibvorgänge ist es nicht erforderlich, die IO-Funktion im Benutzerthread erneut aufzurufen.

Dies unterscheidet sich vom signalgesteuerten Modell. Wenn der Benutzer-Thread das Signal empfängt, bedeutet dies, dass die Daten bereit sind, und dann muss der Benutzer-Thread die E/A-Funktion aufrufen, um das auszuführen tatsächliche Lese- und Schreibvorgänge; im Modell zeigt der Empfang eines Signals an, dass der E/A-Vorgang abgeschlossen wurde und keine Notwendigkeit besteht, die E/A-Funktion im Benutzerthread aufzurufen, um tatsächliche Lese- und Schreibvorgänge auszuführen.

Beachten Sie, dass asynchrone E/A eine zugrunde liegende Unterstützung durch das Betriebssystem erfordert. In Java 7 wird asynchrone E/A bereitgestellt.

Das obige ist der detaillierte Inhalt vonGängige IO/NIO-Modelle in JAVA. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage