Quelle est exactement la différence entre synchrone/asynchrone et bloquant/non bloquant ?
怪我咯
怪我咯 2017-05-17 10:08:42
0
4
928

Pour autant que je sache, la synchronisation/le blocage sont le même concept. Le client attend un reçu du serveur. Si le serveur ne renvoie pas de reçu, le client ne procédera pas ; n'attend pas de reçu du serveur, descendez directement, attendez que le traitement côté serveur soit terminé, puis appelez la fonction de rappel asynchrone pour avertir le client.

Mais plus précisément, je n'arrive pas à faire la différence entre la synchronisation et le blocage, et entre l'asynchrone et le non-blocage. Quelqu'un peut-il clarifier la confusion ?

怪我咯
怪我咯

走同样的路,发现不同的人生

répondre à tous(4)
習慣沉默

Recommandez un article de blog pour parler des cinq modèles IO de Linux. Il est très bien écrit. Laissez-moi vous les raconter brièvement.
Tout d'abord, seule la synchronisation a ce qu'on appelle le blocage et le non-blocage, l'asynchrone n'en a pas. Le malentendu courant est que nous pensons qu’asynchrone signifie non-blocage, mais ce n’est pas le cas. La différence entre la synchronisation et l'asynchronisme ici est que le fait qu'il y ait un blocage dans "l'ensemble du processus" d'une E/S réseau ou d'une E/S disque concerne l'ensemble du processus.
Prenons l'exemple d'un appel système de lecture. En tant que thread utilisateur, lorsque vous lancez un appel système de lecture, il peut être divisé en deux opérations,

  • Le premier est la lecture de données : lire des données du disque vers l'espace du noyau. Nous savons tous que la lecture est un appel système et que les threads au niveau utilisateur ne peuvent pas l'exécuter. Elle ne peut être transmise qu'aux threads du noyau pour le traitement, et au noyau. les threads doivent d'abord rechercher les données et les lire dans l'espace du noyau.

  • La seconde est la copie de données : lecture des données de l'espace noyau vers l'espace utilisateur. Le thread utilisateur peut ensuite utiliser ces données.

En termes simples,

  • La synchronisation signifie que les deux processus ci-dessus sont bloqués et que votre fil utilisateur est en attente.

  • Non bloquant signifie que vous n'êtes pas bloqué dans le premier processus ci-dessus, mais le thread utilisateur doit constamment demander au système d'exploitation si les données ont été copiées du disque vers l'espace interne. Si la copie est terminée, elle sera bloquée. pendant le processus de copie des données. Ainsi, tous les processus de synchronisation se bloquent dans la deuxième phase, bien qu'il s'agisse d'un appel non bloquant.

  • Multiplexage : comme le non-blocage, il est également bloquant dans la deuxième étape, mais dans la première étape, vous ne demandez plus vous-même au système d'exploitation, mais êtes uniformément transmis à un thread du noyau pour le traitement (le sondage est implémenté sous Linux , et une version améliorée d'epoll), lorsque la lecture de vos données est terminée, ce thread envoie un signal au thread utilisateur qui a initialement lancé l'appel système, puis le thread utilisateur entre en blocage et commence la copie des données.

  • Asynchrone : les deux processus ci-dessus sont non bloquants.

Ce qui précède n'est qu'une brève description, j'espère que cela vous aidera

PHPzhong

Le concept de synchronisation et d'asynchrone décrit principalement les aspects IO. En bref, la principale différence entre la synchronisation et l'asynchrone réside dans la manière de notifier le processus ou le thread appelant. La notification de retour immédiat est synchrone, tandis que la notification via un rappel enregistré est asynchrone. Le blocage et le non-blocage décrivent principalement la situation de retour des appels de fonction. Une fonction qui renvoie immédiatement est non bloquante et une fonction suspendue est bloquante.

Pour donner une analogie simple, si vous allez au restaurant pour commander de la nourriture.

Blocage synchrone

Vous dites au commis aux commandes que vous voulez des nouilles au bœuf taïwanaises. Lorsque le commis aux commandes l'entend, il se rend à la cuisine et prend un certain temps pour vous les apporter. Pendant cette période, vous attendiez bêtement à la réception sans aucune réponse ni rien faire (blocage). Vous n'avez reçu aucune réponse après avoir passé la commande. Le processus d'attente est une communication synchrone.

Synchrone et non bloquant

Vous avez dit au commis aux commandes que vous vouliez des nouilles au bœuf de Lanzhou, et le commis aux commandes a répondu que cela prendrait cinq minutes. Ensuite, vous réfléchissez un instant, vous pouvez consulter les messages en cinq minutes et faire d'autres choses pour soulager votre ennui. Mais bientôt, vous avez faim et vous demandez à chaque minute si tout va bien, mais la réponse que vous obtenez est que tout ne va pas encore et vous n'aurez un face à face que 5 minutes plus tard. En attendant, vous ne restez pas inactif et pouvez faire autre chose. Ceci est non bloquant. Puisque vous demandez toujours activement les résultats et attendez la réponse du donneur d'ordre, cela reste synchrone.

Blocage asynchrone et non bloquant

Le soi-disant asynchrone signifie que vous n'avez pas besoin de demander activement les résultats, mais d'enregistrer une fonction de rappel. Autrement dit, après avoir passé votre commande, le commis aux commandes vous donne un numéro. Il y a une machine à côté de vous. Quand ce sera votre tour, la machine appellera votre numéro. Le processus de notification est appelé asynchrone. Si vous restez à l’écart et ne faites rien, vous êtes alors dans un état bloqué. Si vous naviguez sur la page Web sur le côté, elle est non bloquante.

La différence entre synchrone et asynchrone réside donc principalement dans la méthode de notification du message. Le blocage et le non-blocage résident dans l'état de l'appel de fonction en attente de notification, c'est-à-dire s'il est suspendu, de sorte que le thread actuel ou. processus et s’il peut continuer à faire autre chose.

Il existe généralement un moyen coroutine d'obtenir un non-blocage asynchrone. Autrement dit, lorsqu'un appel de fonction rencontre IO, après avoir enregistré la fonction de rappel, il est suspendu et renvoyé. Puisqu'il revient, il n'est pas bloquant. Ensuite, lorsque l'IO est terminé, la fonction de rappel informe la fonction suspendue de se réveiller. est asynchrone.

phpcn_u1582

De manière générale, le blocage et le non-blocage indiquent si l'appel IO revient immédiatement (non bloquant) ou attend la fin avant de revenir (blocage). La synchronisation et l'asynchronisme sont des concepts généraux et sont des manifestations du blocage et du non-blocage.

给我你的怀抱

En fait, vous l'avez bien compris. La synchronisation signifie qu'il n'y aura aucune incohérence dans les données. Un seul thread est exécuté séquentiellement. Une désynchronisation signifie que les données ne sont pas uniformes. Par exemple, lorsqu'il existe plusieurs threads, les données utilisées par ce thread peuvent être modifiées par un autre thread, ce qui entraîne une désynchronisation des données. Le blocage et le non-blocage font référence à l'attente du retour de la fonction lorsque le thread est en cours d'exécution. S'il s'agit d'un seul thread, il attendra toujours. S'il est multithread, il n'attendra pas l'exécution vers le bas. temps, une désynchronisation est susceptible de se produire.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal