Table des matières
Modèle GM" >Modèle GM
Maison développement back-end Golang Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ?

Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ?

Aug 08, 2023 pm 04:31 PM
gmp


Le protagoniste d'aujourd'hui est une question d'extension (question) de la question polyvalente du modèle GMP dans l'interview de Go, c'est-à-dire "Modèle GMP, pourquoi a-t-il besoin de P?"

Plonger davantage dans l'arrière-plan de la question, en fait, cette interview L'essence de la question est de demander : « Dans le modèle GMP, pourquoi G et M ne peuvent-ils pas être directement liés ? essayer de résoudre ?"

Cet article vous amènera à explorer les raisons des changements dans les modèles GM et GMP.

Modèle GM

Avant Go1.1, le modèle de planification de Go était en fait le modèle GM, c'est-à-dire qu'il n'y avait pas de P.

Aujourd'hui, je vais vous amener à revoir les créations passées.

Déchiffrer le code source de Go1.0

L'une des façons pour nous de comprendre quelque chose est d'examiner le code source. Jetons un coup d'œil aux principales étapes clés du code source du planificateur Go1.0.1 avec. Jianyu :

static void
schedule(G *gp)
{
 ...
 schedlock();
 if(gp != nil) {
  ...
  switch(gp->status){
  case Grunnable:
  case Gdead:
   // Shouldn't have been running!
   runtime·throw("bad gp->status in sched");
  case Grunning:
   gp->status = Grunnable;
   gput(gp);
   break;
  }

 gp = nextgandunlock();
 gp->readyonstop = 0;
 gp->status = Grunning;
 m->curg = gp;
 gp->m = m;
 ...
 runtime·gogo(&gp->sched, 0);
}
Copier après la connexion

  • Callschedlock méthode pour obtenir Verrouillage global. schedlock 方法来获取全局锁。
  • 获取全局锁成功后,将当前 Goroutine 状态从 Running(正在被调度) 状态修改为 Runnable(可以被调度)状态。
  • 调用 gput 方法来保存当前 Goroutine 的运行状态等信息,以便于后续的使用。
  • 调用 nextgandunlock 方法来寻找下一个可运行 Goroutine,并且释放全局锁给其他调度使用。
  • 获取到下一个待运行的 Goroutine 后,将其运行状态修改为 Running。
  • 调用 runtime·gogo
Après avoir acquis avec succès le verrou global, modifiez l'état actuel de Goroutine de l'état En cours d'exécution (en cours de planification) à l'état Exécutable (peut être planifié).

Appelgput méthode pour enregistrer État d'exécution actuel de Goroutine et autres informations pour une utilisation ultérieure.

Appelnextgandunlock méthode pour trouver Le prochain Goroutine peut être exécuté et le verrou global est libéré pour que d'autres planificateurs puissent l'utiliser.
Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ?
Après avoir obtenu la prochaine Goroutine à exécuter, changez son statut d'exécution en Running.

Appelméthode runtime·gogo , exécutez le prochain Goroutine à exécuter qui vient d'être obtenu et entrez dans le prochain cycle de planification.

En pensant au modèle GM

En analysant le code source du planificateur de Go1.0.1, nous pouvons trouver un point intéressant. Il s'agit du planificateur lui-même (méthode de planification). Dans les processus normaux, il ne reviendra pas, c'est-à-dire qu'il ne mettra pas fin au processus principal.

🎜🎜🎜Diagramme du modèle G-M🎜🎜🎜 Il exécutera en continu le processus de planification une fois que GoroutineA est terminé, il commence à rechercher GoroutineB. Lorsque B est trouvé, le droit de planification terminé de A est transmis à B, de sorte que GoroutineB. commence à être Scheduling, c'est-à-dire en cours d'exécution. 🎜🎜Bien sûr, il y a aussi des G qui sont bloqués (Blocked). Supposons que G effectue des appels système ou réseau, ce qui entraînera le blocage de G. À ce moment-là, M (thread système) sera remis dans la file d'attente du noyau, en attendant un nouveau cycle de réveil. 🎜🎜🎜🎜Inconvénients du modèle GM🎜🎜🎜🎜En apparence, le modèle GM semble indestructible et sans défauts. Mais pourquoi le changer ? 🎜🎜En 2012, Dmitry Vyukov a publié l'article "Scalable Go Scheduler Design Doc", qui est toujours la cible principale des principaux articles de recherche sur le planificateur Go. Il a décrit les raisons et considérations générales dans l'article. Le contenu suivant citera cet article. . 🎜

Le planificateur Goroutine actuel (faisant référence au modèle GM de Go 1.0) limite l'évolutivité des programmes concurrents écrits en Go, en particulier les serveurs à haut débit et les programmes de calcul parallèle.

L'implémentation présente les problèmes suivants :

  • Il existe un seul mutex global (Sched.Lock) et une gestion centralisée de l'état :
    • mutex doit protéger toutes les opérations liées à la goroutine (création, achèvement, réorganisation, etc.), ce qui conduit à une sérieuse concurrence entre serrures.
  • Problèmes de livraison des goroutines :
    • remise de la goroutine (G) (G.nextg) : les goroutines exécutables sont souvent transférées entre les threads de travail (M).
    • Ce qui précède peut entraîner une latence accrue et une surcharge supplémentaire. Chaque M doit être capable d'exécuter n'importe quel G exécutable, en particulier le M qui vient de créer G.
  • Chaque M doit être mis en cache en mémoire (M.mcache) :
    • entraînera une consommation excessive de ressources (chaque mcache peut absorber 2 M de cache mémoire et d'autres caches) et une mauvaise localisation des données.
  • Blocage/déblocage fréquent des threads :
    • Les threads sont fréquemment bloqués et débloqués en présence d'appels système. Cela ajoute beaucoup de frais supplémentaires en termes de performances.

Modèle GMP

Afin de résoudre bon nombre des problèmes ci-dessus du modèle GM, dans Go1.1, Dmitry Vyukov a ajouté un nouveau composant P (processeur) basé sur le modèle GM. Et implémenté l'algorithme Work Stealing pour résoudre certains problèmes nouvellement générés.

Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ?

Modèle GMP, dans l'article précédent « Les amis du groupe Go ont demandé : quel est le nombre approprié de Goroutines à contrôler, cela affectera-t-il le GC et la planification ? a été expliqué dans "."

Les amis qui pensent que c'est bien peuvent y prêter attention, je ne le répéterai pas ici.

Quels changements cela apportera-t-il

Quels changements cela apportera-t-il après l'ajout de P ? Parlons-en plus explicitement.

  • Chaque P a sa propre file d'attente locale, ce qui réduit considérablement la dépendance directe à l'égard de la file d'attente globale. Le résultat est une réduction de la concurrence entre les verrous. La majeure partie des performances supplémentaires du modèle GM est due à la concurrence des verrous.

  • Sur l'équilibre relatif de chaque P, l'algorithme Work Stealing est également implémenté dans le modèle GMP. Si la file d'attente locale de P est vide, l'exécutable G sera volé dans la file d'attente globale ou la file d'attente locale de. d'autres P à fonctionner, réduisant ainsi la marche au ralenti et améliorant l'utilisation des ressources.

Pourquoi y a-t-il P

Certains amis peuvent être confus en ce moment Si vous souhaitez implémenter une file d'attente locale et un algorithme de vol de travail, alors pourquoi ne pas simplement l'ajouter directement à M ? pour M Des fonctions similaires peuvent être obtenues .

Pourquoi ajouter un autre composant P ?

Combiné avec le positionnement de M (thread système), si vous faites cela, il y a les problèmes suivants.

  • D'une manière générale, le nombre de M sera supérieur à celui de P. Comme dans Go, la limite maximale du nombre de M est de 10 000 et le nombre par défaut de P est le nombre de cœurs de processeur. De plus, en raison des propriétés de M, c'est-à-dire que s'il existe un appel de blocage du système qui bloque M et n'est pas suffisant, M continuera d'augmenter.

  • Si M continue d'augmenter, si la file d'attente locale est montée sur M, cela signifie que la file d'attente locale augmentera également en conséquence. Ceci est évidemment déraisonnable, car la gestion des files d’attente locales deviendra compliquée et les performances du Work Stealing seront considérablement réduites.

  • M Après avoir été bloqué par un appel système, nous espérons allouer ses tâches non exécutées à d'autres pour continuer à s'exécuter, plutôt que de tout arrêter dès qu'il est bloqué.

Par conséquent, il n'est pas raisonnable d'utiliser M. Ensuite, introduire un nouveau composant P et associer la file d'attente locale à P peut très bien résoudre ce problème.

Résumé

L'article d'aujourd'hui combine quelques situations historiques, une analyse des causes et une description de la solution pour l'ensemble du planificateur de langage Go.

« Modèle GMP, pourquoi y a-t-il P ? » Cette question est comme une compréhension de la conception d'un système, car désormais de nombreuses personnes vont mémoriser le modèle GMP ou le parcourir de manière instantanée afin de faire face à l'entretien. Et comprendre les véritables raisons qui en sont la cause est ce que nous devons apprendre et comprendre.

Ce n'est que lorsque vous savez ce qui se passe et pourquoi cela se produit que vous pourrez briser la situation.

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)

Comment utiliser PHP et GMP pour exécuter des algorithmes de cryptage et de déchiffrement RSA pour les grands entiers Comment utiliser PHP et GMP pour exécuter des algorithmes de cryptage et de déchiffrement RSA pour les grands entiers Jul 28, 2023 pm 05:25 PM

Comment utiliser PHP et GMP pour exécuter l'algorithme de cryptage et de déchiffrement RSA pour les grands entiers L'algorithme de cryptage RSA est un algorithme de cryptage asymétrique largement utilisé dans le domaine de la sécurité des données. Il met en œuvre le processus de chiffrement à clé publique et de déchiffrement à clé privée basé sur deux nombres premiers particulièrement grands et quelques opérations mathématiques simples. Dans le langage PHP, le calcul de grands entiers peut être réalisé grâce à la bibliothèque GMP (GNUMultiplePrecision), et les fonctions de chiffrement et de déchiffrement peuvent être réalisées en combinant l'algorithme RSA. Cet article explique comment utiliser les bibliothèques PHP et GMP pour

Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ? Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ? Aug 08, 2023 pm 04:31 PM

« Modèle GMP, pourquoi y a-t-il P ? » Cette question est comme une compréhension de la conception du système, car désormais de nombreuses personnes mémoriseront le modèle GMP afin de faire face à l'entretien, ou le passeront en un instant. Et comprendre les véritables raisons qui en sont la cause est ce que nous devons apprendre et comprendre.

Comment compiler et installer php gmp Comment compiler et installer php gmp Nov 08, 2022 am 09:35 AM

Comment compiler et installer php gmp : 1. Décompressez le package php via "bzip2 -d gcc-4.1.0.tar.bz2" 2. Exécutez "tar -xvf gcc-4.1.0.tar" ou "tar -xvf" *.tar" ; 3. Installez gmp via "make install".

Comment implémenter une multiplication rapide de grands nombres en utilisant PHP et GMP Comment implémenter une multiplication rapide de grands nombres en utilisant PHP et GMP Jul 31, 2023 pm 01:31 PM

Comment utiliser PHP et GMP pour implémenter une multiplication rapide de grands nombres Introduction : En informatique, l'arithmétique des nombres entiers est l'une des opérations les plus basiques et les plus couramment utilisées. Cependant, lorsqu’il s’agit de grands entiers, les méthodes arithmétiques traditionnelles deviennent inefficaces. Cet article expliquera comment utiliser la bibliothèque GMP (GNUMultiplePrecision) en PHP pour implémenter une multiplication rapide de grands nombres et fournira des exemples de code correspondants. Introduction à la bibliothèque GMP La bibliothèque GMP est une bibliothèque de calcul de haute précision qui fournit des fonctions telles que l'addition, la soustraction, la multiplication, la division et l'exponentiation de grands entiers.

Comment implémenter des algorithmes de cryptage et de déchiffrement RSA à l'aide de PHP et GMP Comment implémenter des algorithmes de cryptage et de déchiffrement RSA à l'aide de PHP et GMP Jul 28, 2023 pm 11:54 PM

Comment utiliser PHP et GMP pour implémenter l'algorithme de cryptage et de déchiffrement RSA L'algorithme de cryptage RSA est un algorithme de cryptage asymétrique largement utilisé dans le domaine de la sécurité de l'information. Dans les applications pratiques, il est souvent nécessaire d'utiliser des langages de programmation pour mettre en œuvre des algorithmes de chiffrement et de déchiffrement RSA. PHP est un langage de script côté serveur couramment utilisé et GMP (GNUMultiplePrecision) est une bibliothèque de calcul mathématique de haute précision qui peut nous aider à effectuer un grand nombre d'opérations requises dans l'algorithme RSA. Cet article expliquera comment utiliser PHP et GMP

Comment générer de grands nombres premiers en utilisant PHP et GMP Comment générer de grands nombres premiers en utilisant PHP et GMP Aug 01, 2023 pm 01:37 PM

Comment générer de grands nombres premiers en utilisant PHP et GMP Introduction : Dans le domaine de la cryptographie et de la sécurité, la génération aléatoire de grands nombres premiers est très importante. L'extension GMP (GNUMultiplePrecision) de PHP fournit des fonctions de calcul de haute précision, que nous pouvons utiliser pour générer les grands nombres premiers dont nous avons besoin. Cet article expliquera comment générer de grands nombres premiers à l'aide de PHP et GMP, et fournira des exemples de code correspondants. Étape 1 : Installer l'extension GMP Tout d'abord, nous devons nous assurer que l'extension GMP est installée et activée sur le serveur. Cela peut être fait via ce qui suit

Du début à la fin : Comment utiliser l'extension php GMP pour un grand nombre d'opérations Du début à la fin : Comment utiliser l'extension php GMP pour un grand nombre d'opérations Aug 02, 2023 am 11:33 AM

Du début à la fin : Comment utiliser PHP pour étendre GMP à un grand nombre d'opérations Avec le développement d'Internet, le traitement du big data est devenu un élément indispensable de notre développement quotidien. Dans de nombreux scénarios, nous devons opérer sur des nombres supérieurs à la plage entière de PHP (-2^31-1 à 2^31-1). Dans ce cas, l'extension GMP de PHP s'avère utile. GMP (GNUMultiplePrecisionArithmeticLibrary) est un

Tutoriel PHP et GMP : Comment calculer le plus petit commun multiple d'un grand nombre Tutoriel PHP et GMP : Comment calculer le plus petit commun multiple d'un grand nombre Jul 28, 2023 pm 11:51 PM

Tutoriel PHP et GMP : Comment calculer le plus petit commun multiple de grands nombres Introduction : En informatique, nous devons souvent traiter des opérations sur de grands nombres. Cependant, en raison des limitations du stockage informatique, les types entiers traditionnels ne peuvent pas gérer les nombres au-delà d'une certaine plage. Afin de résoudre ce problème, nous pouvons utiliser la bibliothèque GMP (GNUMultiplePrecision) de PHP pour effectuer un grand nombre d'opérations. Cet article explique comment utiliser PHP et la bibliothèque GMP pour calculer le plus petit commun multiple de deux grands nombres. Quel est le plus petit commun multiple ? le plus jeune mâle

See all articles