Au revoir Go intervieweur : Modèle GMP, pourquoi y a-t-il P ?
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.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.
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); }
Call schedlock
méthode pour obtenir Verrouillage global.schedlock
方法来获取全局锁。获取全局锁成功后,将当前 Goroutine 状态从 Running(正在被调度) 状态修改为 Runnable(可以被调度)状态。 调用 gput
方法来保存当前 Goroutine 的运行状态等信息,以便于后续的使用。调用 nextgandunlock
方法来寻找下一个可运行 Goroutine,并且释放全局锁给其他调度使用。获取到下一个待运行的 Goroutine 后,将其运行状态修改为 Running。 调用 runtime·gogo
Appel
nextgandunlock
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. 
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.

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!

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)

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

« 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 : 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 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 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 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 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 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
