Maison Java javaDidacticiel Modèles IO/NIO courants en JAVA

Modèles IO/NIO courants en JAVA

Aug 23, 2019 pm 03:39 PM
java

Nos modèles IO courants incluent : le modèle IO bloquant, le modèle IO non bloquant, le modèle IO multiplexé, le modèle IO piloté par le signal, le modèle IO asynchrone ; ci-dessous, nous présenterons brièvement les modèles IO ci-dessus ;

Modèles IO/NIO courants en JAVA

1. Modèle IO de blocage

Le modèle IO le plus traditionnel, c'est-à-dire que le blocage se produit pendant le processus de lecture et d'écriture. données. Lorsque le thread utilisateur émet une requête IO, le noyau vérifiera si les données sont prêtes. Sinon, il attendra que les données soient prêtes, le thread utilisateur sera bloqué et le thread utilisateur remettra le processeur. Lorsque les données sont prêtes, le noyau copiera les données dans le thread utilisateur et renverra le résultat au thread utilisateur, puis le thread utilisateur libérera l'état de bloc. Un exemple typique de modèle IO bloquant est : data = socket.read(); si les données ne sont pas prêtes, elles seront toujours bloquées dans la méthode de lecture.

2. Modèle IO non bloquant

Lorsque le thread utilisateur lance une opération de lecture, il n'est pas nécessaire d'attendre, mais un résultat est obtenu immédiatement. Si le résultat est une erreur, il sait que les données ne sont pas encore prêtes et peut donc renvoyer l'opération de lecture. Une fois que les données du noyau sont prêtes et qu'une requête est à nouveau reçue du thread utilisateur, il copie immédiatement les données dans le thread utilisateur, puis revient. Ainsi, en fait, dans le modèle IO non bloquant, le thread utilisateur doit constamment demander au noyau si les données sont prêtes, ce qui signifie que les IO non bloquantes ne remettront pas le CPU, mais occuperont toujours le CPU. Un modèle d'IO non bloquant typique est généralement le suivant :

while(true){
        data = socket.read();
        if(data!= error){
        处理数据
        break;
    }
}
Copier après la connexion

Cependant, il existe un problème très sérieux avec les IO non bloquantes dans la boucle while, vous devez constamment demander si les données du noyau sont prêtes, ce qui entraînera une utilisation très élevée du processeur, donc en général, les boucles while sont rarement utilisées pour lire des données.

3. Modèle IO multiplexé

Le modèle IO multiplexé est actuellement utilisé plus fréquemment.

Java NIO est en fait une E/S multiplexée. Dans le modèle IO multiplexé, il y aura un thread qui interroge en permanence l'état de plusieurs sockets. Ce n'est que lorsque le socket a réellement des événements de lecture et d'écriture que les opérations de lecture et d'écriture IO réelles sont réellement appelées.

Parce que dans le modèle IO multiplexé, un seul thread peut être utilisé pour gérer plusieurs sockets. Le système n'a pas besoin de créer de nouveaux processus ou threads, ni de maintenir ces threads et processus, et uniquement dans. les ressources d'E/S réelles ne seront utilisées qu'en cas d'événements de lecture et d'écriture de socket, ce qui réduit considérablement l'utilisation des ressources.

Dans Java NIO, selector.select() est utilisé pour demander s'il y a un événement d'arrivée dans chaque canal. S'il n'y a pas d'événement, il y sera toujours bloqué, donc cette méthode provoquera le thread utilisateur. bloquer.

Mode IO multiplexage, plusieurs sockets peuvent être gérés via un seul thread. Ce n'est que lorsque le socket a réellement des événements de lecture et d'écriture que les ressources seront occupées pour les opérations de lecture et d'écriture réelles. Par conséquent, les E/S multiplexées sont plus adaptées aux situations où le nombre de connexions est relativement important.

De plus, la raison pour laquelle les E/S multiplexées sont plus efficaces que le modèle d'E/S non bloquantes est que dans les E/S non bloquantes, l'état du socket est constamment demandé via le thread utilisateur, tandis que dans les E/S multiplexées, interrogeant le le statut de chaque socket est effectué par le noyau, et cette efficacité est bien supérieure à celle des threads utilisateur.

Cependant, il convient de noter que le modèle IO multiplexé utilise l'interrogation pour détecter si un événement est arrivé et répond aux événements arrivant un par un. Par conséquent, pour le modèle d'E/S multiplexées, une fois que le corps de la réponse à l'événement est volumineux, les événements suivants seront retardés et affecteront l'interrogation des nouveaux événements.

4. Modèle IO piloté par le signal

Dans le modèle IO piloté par le signal, lorsque le thread utilisateur lance une opération de requête IO, une fonction de signal sera enregistrée pour Le socket correspondant. Ensuite, le thread utilisateur continuera à s'exécuter. Lorsque les données du noyau sont prêtes, un signal sera envoyé au thread utilisateur. Après avoir reçu le signal, le thread utilisateur appellera les opérations de lecture et d'écriture IO dans la fonction de signal. pour effectuer l'opération de demande d'E/S réelle.

5. Modèle IO asynchrone

Le modèle IO asynchrone est le modèle IO le plus idéal dans le modèle IO asynchrone, lorsque le thread utilisateur lance une opération de lecture. immédiatement, vous pouvez commencer à faire autre chose.

D'un autre côté, du point de vue du noyau, lorsqu'il reçoit une lecture asynchrone, il reviendra immédiatement, indiquant que la demande de lecture a été lancée avec succès, donc aucun bloc ne sera généré pour le thread utilisateur.

Ensuite, le noyau attendra que la préparation des données soit terminée, puis copiera les données dans le thread utilisateur. Lorsque tout cela sera terminé, le noyau enverra un signal au thread utilisateur pour lui dire que. l'opération de lecture est terminée. En d'autres termes, le thread utilisateur n'a pas besoin de savoir comment l'ensemble de l'opération IO est réellement effectué. Il lui suffit d'abord de lancer une requête. Lorsqu'il reçoit le signal de réussite renvoyé par le noyau, cela signifie que l'opération IO est terminée. et les données peuvent être utilisées directement.

En d'autres termes, dans le modèle IO asynchrone, aucune des phases de l'opération IO ne bloquera le thread utilisateur. Les deux phases sont automatiquement complétées par le noyau, puis un signal est envoyé pour informer le thread utilisateur que le thread utilisateur est activé. l’opération est terminée. Il n'est pas nécessaire d'appeler à nouveau la fonction IO dans le thread utilisateur pour une lecture et une écriture spécifiques.

Ceci est différent du modèle basé sur le signal. Dans le modèle basé sur le signal, lorsque le thread utilisateur reçoit le signal, cela indique que les données sont prêtes, puis le thread utilisateur doit appeler la fonction IO pour exécuter le modèle. opérations de lecture et d'écriture réelles ; dans les IO asynchrones Dans le modèle, la réception d'un signal indique que l'opération IO est terminée et qu'il n'est pas nécessaire d'appeler la fonction IO dans le thread utilisateur pour effectuer des opérations de lecture et d'écriture réelles.

Notez que les E/S asynchrones nécessitent une prise en charge sous-jacente du système d'exploitation. Dans Java 7, les E/S asynchrones sont fournies.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

See all articles