Dans la conception du système IO haute performance, il existe plusieurs concepts de nom qui nous confond souvent. Les détails sont les suivants:
1 Qu'est-ce que la synchronisation?
2 Qu'est-ce que l'asynchrone?
3 Qu'est-ce que le blocage?
4 Qu'est-ce que non bloquant?
5 Qu'est-ce que le blocage synchrone?
6 Qu'est-ce que le non-blocage synchrone?
7 Qu'est-ce que le blocage asynchrone?
8 Qu'est-ce que le non-bloc asynchrone?
Permettez-moi de vous donner un exemple dans la vie:
Si vous voulez un bol de riz de dice de poulet kung pao:
Blocage synchrone: vous allez dans un restaurant pour commander de la nourriture, puis attendez là-bas et criez: OK?
Synchrones non bloquants: Après avoir commandé dans un restaurant, je suis allé marcher le chien. Mais après avoir marché un moment, il est retourné au restaurant et a crié: OK?
Blocage asynchrone: En marchant sur le chien, j'ai reçu un appel du restaurant en disant que le repas était prêt et vous a demandé de l'obtenir en personne.
Non-bloquant asynchrone: le restaurant a appelé et a dit: "Nous connaissons votre emplacement, et je vous l'enverrai plus tard, afin que je puisse marcher le chien avec la tranquillité d'esprit."
Avant de comprendre les problèmes ci-dessus, nous devons d'abord comprendre ce que sont la synchronisation, asynchrone, blocage et non bloquant. Ce n'est que lorsque ces concepts uniques sont comprises clairement, puis lorsqu'ils sont combinés, ce sera relativement plus facile.
1. La synchronisation et l'asynchrone sont destinées à l'interaction entre l'application et le noyau.
2. Le blocage et le non-blocage sont différentes méthodes adoptées par le processus lors de l'accès aux données en fonction de l'état prêt de l'opération IO. Pour le dire franchement, il s'agit d'une méthode d'implémentation de lecture ou d'écriture de fonctions d'opération. Selon la méthode de blocage, la fonction de lecture ou d'écriture attendra, plutôt que la fonction de lecture ou d'écriture renverra immédiatement une valeur d'état.
D'après la description ci-dessus, nous pouvons essentiellement résumer une courte phrase: la synchronisation et l'asynchrone sont le but, et le blocage et le non-blocage sont les méthodes de mise en œuvre.
1. Synchronisation: fait référence au processus utilisateur déclenchant une opération IO et en attendant ou en sondage pour vérifier si l'opération IO est prête. Je suis sorti pour acheter des vêtements dans la rue et j'ai fait cette chose moi-même, et je ne pouvais rien faire d'autre.
2. Asynchrone: Asynchronous signifie qu'après que le processus utilisateur a déclenché l'opération IO, il commence à faire ses propres choses. Une fois l'opération IO terminée, elle sera informée de l'achèvement de l'OI (la caractéristique de la notification est asynchrone). Dites à votre ami de s'adapter à la taille, à la taille et à la couleur des vêtements et laissez votre ami le confier à la vente, puis vous pouvez faire d'autres choses. (Lors de l'utilisation d'IO asynchrones, Java délève la lecture et l'écriture de l'OI au système d'exploitation, et doit passer l'adresse et la taille du tampon de données au système d'exploitation)
3. Blocage: la méthode dite de blocage signifie que lorsque vous essayez de lire et d'écrire le descripteur de fichier, s'il n'y a rien à lire ou si ce n'est temporairement inactirable, le programme entrera dans un état d'attente jusqu'à ce que quelque chose à lire ou à être inscrit, et à se rendre à l'arrêt de bus pour recharger. À l'heure actuelle, le recharge n'est pas là (peut-être qu'il est allé aux toilettes), puis nous attendons ici jusqu'à ce que le rechargement revienne. (Bien sûr, ce n'est pas le cas dans la société réelle, mais c'est en effet le cas dans les ordinateurs.)
4. Non-blocking: Dans l'état non bloquant, s'il n'y a rien à lire ou ne peut pas être écrit, la fonction de lecture et d'écriture reviendra immédiatement sans attendre. Lorsque la banque retire de l'argent pour gérer les affaires, nous recevrons un petit reçu. Après l'avoir reçu, nous pouvons jouer avec nos téléphones portables ou discuter avec d'autres. Lorsque nous tournons, l'orateur de la banque nous informera et nous pouvons y aller.
Une opération IO est en fait divisée en deux étapes: initiation d'une demande IO et d'une opération IO réelle.
La différence entre IO synchrone et IO asynchrone est de savoir si la deuxième étape est bloquée. Si la lecture et l'écriture IO réels bloquent le processus de demande, il s'agit d'une IO synchrone.
La différence entre le blocage d'IO et l'OI non bloquant est dans la première étape, si la demande IO sera bloquée. S'il est bloqué jusqu'à ce qu'il soit terminé, c'est le blocage traditionnel IO. S'il n'est pas bloqué, il s'agit de l'IO non bloquant.
La synchronisation et les asynchrones visent l'interaction entre l'application et le noyau. La synchronisation fait référence au processus utilisateur déclenchant des opérations IO et en attendant ou en sondage pour voir si l'opération IO est prête. Asynchrone signifie que le processus utilisateur commence à faire ses propres choses après avoir déclenché l'opération IO, et une fois l'opération IO terminée, il sera informé que l'achèvement de l'EI sera terminé.
Le blocage et le non-blocage sont différentes méthodes adoptées par le processus lors de l'accès aux données en fonction de l'état prêt de l'opération IO. Pour le dire franchement, il s'agit d'une méthode d'implémentation de lecture ou d'écriture de fonctions d'opération. Selon la méthode de blocage, la fonction de lecture ou d'écriture attendra, plutôt que la fonction de lecture ou d'écriture renverra immédiatement une valeur d'état.
Par conséquent, les opérations IO peuvent être divisées en trois catégories: blocage synchrone (c'est-à-dire les premières opérations bio), non-blocage synchrone (NIO) et non bloquants asynchrones (AIO).
Blocage synchrone (BIO):
De cette façon, une fois que le processus utilisateur a lancé une opération IO, il doit attendre que l'opération IO se termine. Ce n'est qu'après que l'opération IO est vraiment terminée que le processus utilisateur peut s'exécuter. Le modèle IO traditionnel de Java appartient à cette méthode.
Non-bloquant synchrone (NIO):
De cette façon, le processus utilisateur peut revenir pour faire d'autres choses après avoir lancé une opération IO, mais le processus utilisateur doit se demander si l'opération IO est prête de temps à autre, ce qui nécessite que le processus utilisateur demande constamment, introduisant ainsi un déchet inutile des ressources CPU. Parmi eux, le NIO de Java est actuellement une IO non bloquante synchrone.
Non-bloquant asynchrone (AIO):
De cette façon, une fois que l'application a lancé une opération IO, il n'attend pas que l'opération IO du noyau se termine et informera l'application une fois que le noyau a terminé l'opération IO.
Blocking synchrone IO (Java Bio):
Synchroniser et bloquer, le mode d'implémentation du serveur est de se connecter à un thread, c'est-à-dire que lorsque le client a une demande de connexion, le serveur doit démarrer un thread pour le traitement. Si cette connexion ne fait rien, elle provoquera des frais généraux de fil inutiles, et bien sûr, il peut être amélioré via le mécanisme de pool de filetage.
IO synchrone non bloquant (Java Nio):
Synchronous non bloquant, le mode d'implémentation du serveur est de demander un thread, c'est-à-dire que les demandes de connexion envoyées par le client seront enregistrées auprès du multiplexeur. Le multiplexeur interroge la connexion à la demande d'E / S et démarre un thread pour le traitement. Le processus utilisateur doit également se demander si l'opération IO est prête de temps à autre, ce qui nécessite que le processus utilisateur demande constamment.
Blocking asynchrone IO (Java Nio):
De cette façon, une fois que l'application a lancé une opération IO, il n'attend pas que l'opération IO du noyau se termine et informera l'application une fois que le noyau a terminé l'opération IO. Il s'agit en fait de la différence la plus critique entre la synchronisation et l'asynchrone. La synchronisation doit attendre ou se demander activement si l'IO est terminée. Alors pourquoi est-il bloqué? Parce qu'il est effectué par des appels système sélectionnés à l'heure actuelle, et l'implémentation de la fonction sélectionnée elle-même est bloquante, et un avantage de l'utilisation de la fonction SELECT est qu'il peut écouter plusieurs poignées de fichiers en même temps (si dans le point de vue de l'UNP, SELECT est une opération synchrone. Parce qu'après sélection, le processus doit également lire et écrire des données), ainsi en améliorant la conformité du système!
(Java AIO (NIO.2)) IO non bloquante asynchrone:
Dans ce mode, le processus utilisateur n'a besoin que de lancer une opération IO et de revenir immédiatement. Une fois l'opération IO vraiment terminée, l'application sera informée que l'opération IO est terminée. Pour le moment, le processus utilisateur n'a besoin que de traiter les données et n'a pas besoin d'effectuer des opérations de lecture et d'écriture d'IO, car les véritables opérations de lecture ou d'écriture d'IO ont été effectuées par le noyau.
Analyse des scénarios applicables pour BIO, NIO et AIO:
La méthode BIO convient aux architectures avec des connexions relativement petites et des connexions fixes. Cette méthode nécessite des ressources de serveur élevées et la concurrence est limitée aux applications. C'est le seul choix avant JDK1.4, mais le programme est intuitif, simple et facile à comprendre.
La méthode NIO convient aux architectures avec un grand nombre de connexions et des connexions relativement courtes (opération lumineuse), telles que les serveurs de chat. La concurrence est limitée aux applications et possède une programmation relativement complexe. JDK1.4 a commencé à le soutenir.
La méthode AIO est utilisée pour les architectures avec un grand nombre de connexions et une connexion relativement longue (réopération), telles que les serveurs d'albums, qui appellent entièrement le système d'exploitation pour participer à des opérations simultanées, et la programmation est relativement compliquée. JDK7 a commencé à le soutenir.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.