Maison  >  Article  >  interface Web  >  Nodejs est-il un processus unique ?

Nodejs est-il un processus unique ?

青灯夜游
青灯夜游original
2021-11-11 16:19:362108parcourir

nodejs est un processus unique. Node suit un modèle de processus unique à thread unique, mais il est basé sur un mode non bloquant asynchrone piloté par les événements, qui peut être appliqué à des scénarios à haute concurrence et évite la surcharge de ressources causée par la création de threads et le changement de contexte entre les threads.

Nodejs est-il un processus unique ?

L'environnement d'exploitation de ce tutoriel : système windows7, nodejs version 12.19.0, ordinateur Dell G3.

Processus

Le processus est une activité en cours d'exécution d'un programme dans un ordinateur sur un certain ensemble de données. C'est l'unité de base de l'allocation des ressources et de la planification dans le système. process est un conteneur pour les threads (de l'encyclopédie). Un processus est la plus petite unité d’allocation de ressources. Lorsque nous démarrons un service et exécutons une instance, nous ouvrons un processus de service. Par exemple, la JVM en Java est elle-même un processus. Dans Node.js, un processus de service est ouvert via le nœud app.js qui est une copie. (fork) du processus. Fork Chaque processus qui sort a sa propre adresse d'espace indépendante et sa propre pile de données. Un processus ne peut pas accéder aux variables et aux structures de données définies dans un autre processus. Ce n'est que lorsque la communication IPC est établie que les données peuvent être partagées entre les processus.

Thread

Le thread est la plus petite unité avec laquelle le système d'exploitation peut effectuer la planification des calculs. Tout d'abord, nous devons comprendre que les threads appartiennent aux processus et sont inclus dans les processus. Un thread ne peut appartenir qu’à un seul processus, mais un processus peut avoir plusieurs threads. Un seul thread Un seul thread signifie qu'un processus n'ouvre qu'un seul thread. Les programmes sont exécutés séquentiellement (JS asynchrone n'est pas mentionné ici pour le moment. Vous pouvez imaginer une file d'attente après l'exécution du précédent). le suivant peut être exécuté. Lorsque vous utilisez un seul thread Lors du codage en langage de thread, n'effectuez pas trop d'opérations de synchronisation fastidieuses, sinon le thread sera bloqué et les réponses suivantes ne pourront pas être traitées. Si vous utilisez Javascript pour le codage, veuillez profiter autant que possible des fonctionnalités de fonctionnement asynchrone de Javascript.

pilote d'événement à thread unique à processus unique nodejs

Node suit le modèle de processus unique à thread unique de node signifie que le moteur js n'a qu'une seule instance et est exécuté dans le thread principal de nodejs en même temps. , le nœud utilise des événements. Le pilote gère les opérations asynchrones telles que les IO. Le mode de nœud monothread ne maintient qu'un seul thread principal, ce qui réduit considérablement le coût de commutation entre les threads, mais il y aura plusieurs threads de travail pour effectuer des opérations asynchrones.

Mais le thread unique du nœud rend impossible l'exécution d'opérations gourmandes en CPU sur le thread principal, sinon le thread principal sera bloqué. Pour les opérations gourmandes en CPU, des processus enfants indépendants peuvent être créés dans le nœud via child_process. Le processus parent-enfant communique via IPC. Le processus enfant peut être une application externe ou un sous-programme de nœud. Une fois le processus enfant exécuté, les résultats peuvent être. renvoyé au processus parent.

Mécanisme de fonctionnement Node.js

  • Le moteur V8 analyse les scripts JavaScript.
  • Le code analysé appelle l'API Node.
  • La bibliothèque libuv est responsable de l'exécution de l'API Node. Il alloue différentes tâches à différents threads de travail pour former une boucle d'événements et renvoie les résultats d'exécution des tâches au moteur V8 de manière asynchrone.
  • Le moteur V8 renvoie les résultats à l'utilisateur.

Cette image est le principe de fonctionnement de l'ensemble de Node.js De gauche à droite, de haut en bas, Node.js est divisé en quatre couches, à savoir la couche application, la couche moteur V8, la couche Node API et LIBUV. couche .

  • Couche d'application : c'est-à-dire que la couche d'interaction JavaScript est couramment utilisée. Les modules Node.js, tels que http, fs.
  • Couche moteur V8 : elle utilise le moteur V8 pour analyser la syntaxe JavaScript, puis interagit avec la couche inférieure. API.
  • Couche NodeAPI : Le module supérieur fournit des appels système, généralement implémentés en langage C, pour interagir avec le système d'exploitation.
  • Couche LIBUV : il s'agit d'une encapsulation multiplateforme de niveau inférieur qui implémente une boucle d'événements, des opérations sur les fichiers, etc., et constitue le cœur de l'implémentation asynchrone de Node.js

Boucle d'événements Node.js

Node.js est généralement un seul processus.

  • Le thread principal exécute V8 et Javascript
  • Plusieurs sous-threads sont programmés via la boucle d'événements

Boucle d'événements :

La boucle d'événements est une construction de programmation utilisée pour attendre et distribuer des événements ou des messages dans un programme, les threads principaux lisent les événements de la "file d'attente des tâches". Ce processus est cyclique, donc l'ensemble du mécanisme de fonctionnement est également appelé Event Loop

Event Queue :

Lorsque la demande réseau de l'utilisateur ou autre Lorsqu'une opération asynchrone arrive. , le nœud le placera dans la file d'attente des événements. À ce stade, il ne sera pas exécuté immédiatement et le code ne sera pas bloqué jusqu'à ce que le code du thread principal soit exécuté.

Task Queue :

Task Queue" est une file d'attente d'événements (peut également être comprise comme une file d'attente de messages). Lorsque le périphérique IO termine une tâche, un événement est ajouté à la "file d'attente des tâches" pour représenter les tâches asynchrones associées. . Vous pouvez entrer dans la "pile d'exécution". Le thread principal lit la "file d'attente des tâches", qui consiste à lire les événements qu'elle contient

Evénementiel :

L'essence est d'exécuter le programme via la boucle principale et le déclenchement d'événements
node
Node.js n'est pas un langage ou un framework, c'est juste un environnement d'exécution JavaScript basé sur le moteur Google V8, qui est une extension des fonctions js. . Fournit des fonctions réseau, fichiers, DNS, thread de processus et autres.

libuv
libuv est une bibliothèque de packages spécialement développée pour Node.js, offrant des capacités d'E/S asynchrones multiplateformes.

Remarque :

  • Une boucle d'événements comporte une ou plusieurs files d'attente de tâches. Une file d'attente de tâches est un groupe de tâches. Libuv utilise principalement le module événementiel fourni par le système pour résoudre les IO asynchrones du réseau et utilise le pool de threads pour résoudre les IO de fichiers. De plus, des minuteries sont implémentées pour encapsuler l'utilisation de processus, de threads, etc.

  • En fait, la boucle d'événements ici est la même que la boucle d'événements de js dans le navigateur. Le thread principal permet le code synchrone, et le code asynchrone est exécuté dans le thread de travail correspondant après que le résultat de l'exécution du rappel soit mis. dans la file d'attente des événements, attendez que le thread principal exécute les tâches de la file d'attente des événements.

  • La boucle événementielle + événementielle atteint une concurrence élevée

Séquence d'exécution spécifique :

1 Chaque processus Node.js n'a qu'un seul thread principal exécutant le code du programme, formant une pile de contexte d'exécution2. thread principal, une "file d'attente d'événements" est également maintenue. Lorsque la demande réseau de l'utilisateur ou une autre opération asynchrone arrive, le nœud la placera dans la file d'attente des événements. À ce moment, elle ne sera pas exécutée immédiatement et le code ne sera pas bloqué jusqu'à ce que le code du thread principal soit exécuté. complet.

3. Une fois l'exécution du code du thread principal terminée, puis via la boucle d'événements, qui est le mécanisme de boucle d'événements, commencez à retirer le premier événement du début de la file d'attente d'événements, allouez un thread du pool de threads. pour exécuter cet événement, puis continuer. Supprimez le deuxième événement, puis allouez un thread du pool de threads à exécuter, puis le troisième et le quatrième. Le thread principal vérifie en permanence s'il y a des événements non exécutés dans la file d'attente des événements jusqu'à ce que tous les événements de la file d'attente des événements aient été exécutés. Après cela, chaque fois qu'un nouvel événement est ajouté à la file d'attente des événements, le thread principal sera informé de les supprimer. commandez-les et remettez-les à EventLoop pour traitement. Lorsqu'un événement est exécuté, le thread principal sera averti, le thread principal exécutera le rappel et le thread sera renvoyé au pool de threads.

Remarque

Le thread unique node.js que nous voyons n'est qu'un thread principal js partageant un thread avec le rendu de l'interface utilisateur. Les opérations asynchrones essentielles sont toujours effectuées par le pool de threads et le nœud transmet toutes les opérations de blocage qu'il utilise. le pool de threads interne pour l'implémenter. Il est uniquement responsable de la planification continue des allers-retours et n'effectue pas de véritables opérations d'E/S, réalisant ainsi des E/S asynchrones non bloquantes. C'est l'essence même du thread unique et des événements du nœud. conduit. Résumé :

1. Le pool de threads libuv ouvre 4 threads par défaut et peut ouvrir jusqu'à 128 threads. (Par exemple : dans le passé, le serveur Web ne pouvait recevoir que jusqu'à 100 requêtes en même temps. S'il y en avait trop, il ne pourrait pas en recevoir et le serveur raccrocherait.

La soi-disant haute concurrence de nodejs signifie qu'il peut recevoir 1 000 ou 10 000 requêtes en même temps, mais en attente dans une file d'attente

)

2. Le thread principal exécute js, qui est monothread et effectue de nombreux calculs. gourmand en CPU. Si le thread principal n'est pas libre, il ne peut pas gérer les questions d'E/S et sera donc bloqué. 3. Les rappels peuvent uniquement garantir qu'une certaine requête est exécutée dans l'ordre, mais ne peuvent pas garantir l'ordre dans lequel plusieurs requêtes accèdent à une ressource. Plusieurs requêtes doivent être verrouillées lors de l'accès à une ressource.

【Apprentissage recommandé : "

Tutoriel Nodejs

"】

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