Maison  >  Article  >  développement back-end  >  Comment Golang implémente-t-il les coroutines ?

Comment Golang implémente-t-il les coroutines ?

coldplay.xixi
coldplay.xixioriginal
2020-06-20 09:34:164574parcourir

Comment Golang implémente-t-il les coroutines ?

Comment Golang implémente-t-il les coroutines ?

Méthode de Golang pour implémenter les coroutines :

La programmation simultanée peut être implémentée via des processus, des threads et le multiplexage d'E/S. (Nous ne faisons pas de distinction entre la concurrence et le parallélisme ici. Si le processeur est multicœur, il peut être exécuté sur plusieurs cœurs en même temps, ce que nous appelons parallélisme. S'il s'agit d'un processeur monocœur et doit être mis en file d'attente pour switch, nous l'appelons concurrence.)

Les processus sont des ressources informatiques Plus petite unité d'allocation, le processus est une abstraction des ressources du processeur et de la mémoire virtuelle (1), tandis que la mémoire virtuelle est une abstraction des ressources de mémoire principales et les fichiers (2) et les fichiers sont une abstraction des périphériques d'E/S. Les threads constituent la plus petite unité de planification informatique et partagent les ressources informatiques allouées par le même processus.

Ce qui précède est une compréhension approfondie des systèmes informatiques.

En résumé, ce qui implémente réellement la concurrence, ce sont les threads. Tout d'abord, chaque processus a un thread principal, car un thread est la plus petite unité de planification. Vous ne pouvez avoir qu'un seul thread, mais vous pouvez également créer plusieurs threads supplémentaires. La planification des threads nécessite un changement de processeur et un changement de contexte de couche noyau. exécutez le thread A, puis passez au thread B, et l'appel du noyau démarre. Le processeur doit conserver le contexte du thread A, puis passer au thread B, puis transférer le contrôle à la planification de votre couche d'application. Le changement de processus nécessite également le changement du noyau, car le thread principal du processus C est basculé vers le thread principal du processus D.

Ensuite, les processus doivent communiquer et leurs ressources ne sont pas partagées à l'heure actuelle, l'IPC (Inter-Process Communication, communication inter-processus) doit être utilisée. Les sémaphores, la mémoire partagée et les processus couramment utilisés. sockets. En fait, Baidu On dit qu'il existe six types et que plusieurs threads du même processus partagent des ressources, ce qui rend la communication beaucoup plus facile que les processus. Désormais, de nombreux langages de programmation tels que Java ont ce type d'implémentation d'interaction de thread.

En ce qui concerne le multiplexage d'E/S, cela signifie en fait maintenir une file d'attente, puis laisser un ou plusieurs threads aller dans la file d'attente pour terminer les tâches. Pourquoi? Étant donné que le nombre de threads est limité et que la communication entre les threads nécessite certaines ressources, le noyau doit fréquemment changer de contexte.

Le multiplexage IO d'un thread, généralement Redis et Nodejs, n'a pas du tout besoin de changer de contexte, et un thread peut dominer le monde. Le multiplexage IP de plusieurs threads est la façon dont les coroutines Golang sont implémentées. Les coroutines gèrent elles-mêmes les threads, contrôlent les threads jusqu'à un certain nombre, puis construisent une machine à états de règles pour planifier les tâches.

Tutoriel recommandé : "tutoriel de langue go"

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:
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
Article précédent:Comment apprendre le golang ?Article suivant:Comment apprendre le golang ?