Modèles IO/NIO courants en 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 ;
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; } }
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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

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.

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.

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.

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.

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.

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

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.

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
