Maison  >  Article  >  développement back-end  >  Explication détaillée des processus de thread PHP et des instances simultanées

Explication détaillée des processus de thread PHP et des instances simultanées

小云云
小云云original
2018-03-08 09:36:281476parcourir


Processus

Qu'est-ce qu'un processus ? Un processus est un programme en cours d'exécution ; un processus est une instance d'un programme exécuté sur un ordinateur ; un processus est une entité qui peut être affectée et exécutée par un processeur. Un processus comprend généralement un jeu d'instructions et un jeu de ressources système. Le jeu d'instructions fait ici référence au code du programme, et le jeu de ressources système fait ici référence aux E/S, au processeur, à la mémoire, etc. Pour résumer, nous pouvons également comprendre qu'un processus est une activité en cours d'exécution d'un programme avec certaines fonctions indépendantes sur une certaine collection de données. Un processus est une unité indépendante d'allocation et de planification des ressources dans le système.

Lorsqu'un processus est exécuté, le processus peut être représenté de manière unique, composé des éléments suivants :

  • Descripteur de processus : l'identifiant unique du processus, utilisé pour Autre les processus sont distingués. Il est appelé ID de processus sous Linux et est généré lors du fork de l'appel système. Cependant, ce que nous renvoyons via getpid n'est pas son champ pid, mais son numéro de groupe de threads tgid.

  • État du processus : les états que nous appelons souvent suspension, exécution, etc. représentent l'état actuel.

  • Priorité : liée à la planification de l'exécution entre les processus, par rapport aux autres processus.

  • Compteur de programme : L'adresse de la prochaine instruction à exécuter dans le programme. Cette adresse est l'adresse mémoire dans l'espace mémoire du noyau ou de l'utilisateur.

  • Pointeurs de mémoire : y compris des pointeurs vers le code du programme et les données liées au processus, ainsi que des pointeurs vers des blocs de mémoire partagés avec d'autres processus.

  • Données contextuelles : Les données du registre du processeur lorsque le processus est exécuté.

  • Informations sur l'état des E/S : y compris les demandes d'E/S explicites, les périphériques d'E/S affectés aux processus, etc.

  • Informations comptables : peut inclure le temps total du processeur, le nombre total d'horloges utilisées, les limites de temps, etc.

Les éléments ci-dessus seront placés dans une structure de données appelée bloc de contrôle de processus. Le bloc de contrôle de processus est une structure qui permet au système d'exploitation de prendre en charge plusieurs processus et de fournir un multitraitement. Lorsque le système d'exploitation change de processus, il effectue deux étapes : l'une consiste à interrompre le processus dans le processeur actuel et l'autre à exécuter le processus suivant. Indépendamment de l'interruption ou de l'exécution, le compteur du programme, les données contextuelles et l'état du processus dans le bloc de contrôle de processus changeront. Lorsque le processus est interrompu, le système d'exploitation enregistre le compteur de programme et le registre du processeur (correspondant aux données contextuelles dans le bloc de contrôle de processus) à l'emplacement correspondant dans le bloc de contrôle de processus. L'état du processus change également et peut entrer. un état de blocage, ou il peut entrer dans un état de blocage. Entrez dans l'état prêt. Lors de l'exécution du processus suivant, le système d'exploitation place le processus suivant à l'état d'exécution selon des règles et charge les données de contexte de programme et le compteur de programme du processus à exécuter.

Threads

Un processus comporte deux parties caractéristiques : la propriété des ressources et l'exécution de la planification. La propriété des ressources signifie que le processus inclut l'espace mémoire, les E/S et les autres ressources nécessaires à son exécution. La planification de l'exécution fait référence au chemin d'exécution au milieu de l'exécution du processus ou au flux d'exécution des instructions du programme. Ces deux parties de fonctionnalités peuvent être séparées. Après la séparation, celle avec la propriété des données est généralement appelée un processus, et celle avec la partie distribuable du code d'exécution est appelée un thread ou un processus léger.

Les threads ont le sens d'"indices d'exécution", et le processus est défini comme le propriétaire de la ressource dans un environnement multithread, qui stockera toujours le bloc de contrôle de processus du processus. La structure des threads est différente de celle des processus. Chaque thread comprend :

  • Statut du thread : L'état actuel du thread.

  • Une pile d'exécution

  • Zone de données privées : Espace de stockage statique pour les variables locales de chaque thread

  • Ensemble de registres : stocke un état du processeur

Chaque processus possède un bloc de contrôle de processus et un espace d'adressage utilisateur, et chaque thread possède une pile indépendante et les blocs de contrôle indépendants ont leur propre contexte d'exécution indépendant. Sa structure est illustrée à la figure 8.1.

Explication détaillée des processus de thread PHP et des instances simultanées

Figure 8.1 Diagramme du modèle de processus

Les threads sont quelque peu différents des processus lors de l'exécution. Chaque thread indépendant possède un point d'entrée pour l'exécution du programme, une séquence d'exécution séquentielle et un point de sortie pour le programme. Cependant, les threads ne peuvent pas s'exécuter indépendamment et doivent exister dans le processus, et le processus fournit un contrôle d'exécution sur plusieurs threads. D'un point de vue logique, la signification du multi-threading est que dans un processus, plusieurs parties d'exécution peuvent être exécutées en même temps. À l’heure actuelle, le processus lui-même n’est pas l’unité d’exécution de base, mais le conteneur de threads.

L'avantage des threads par rapport aux processus est qu'ils sont plus rapides. Qu'il s'agisse de créer un nouveau thread ou de terminer un thread ; qu'il s'agisse de basculer entre les threads, de partager des données ou de communiquer entre les threads, leur vitesse est plus rapide que cela. de processus. Gros avantage.


Concurrence et parallélisme

La concurrence, également connue sous le nom de coexistence, fait référence à la capacité de gérer plusieurs activités simultanées ne doivent pas nécessairement le faire. être la même chose arrive tout le temps. Par exemple, les systèmes informatiques modernes peuvent charger plusieurs programmes en mémoire sous forme de processus en même temps et utiliser le multiplexage temporel du processeur pour donner la sensation de fonctionner simultanément sur un seul processeur.

Parallèle fait référence à deux événements simultanés qui se produisent en même temps, ce qui signifie concurrence, mais la concurrence n'est pas nécessairement parallèle.

La différence entre la concurrence et le parallélisme est qu'un processeur traite plusieurs tâches en même temps et que plusieurs processeurs ou processeurs multicœurs traitent plusieurs tâches différentes en même temps. La première est une simultanéité logique, tandis que la seconde est une simultanéité physique.

Divers modèles de concurrence PHP

Puisqu'il existe deux modèles, lequel PHP utilise-t-il ? La réponse est qu'ils sont tous pris en charge, ce qui signifie que PHP prend en charge le modèle multithread. Dans les situations multithread, les problèmes de partage et d'isolation des ressources doivent généralement être résolus. PHP lui-même est thread-safe.

Le modèle spécifique dépend du SAPI utilisé. Par exemple, dans Apache, le modèle multi-thread ou le modèle multi-processus peut être utilisé. Et php-fpm utilise le modèle multi-processus.

La méthode actuellement recommandée est d'utiliser le modèle php-fpm, car ce modèle présente de nombreux avantages pour PHP :

  1. La libération de la mémoire est simple, lors de l'utilisation Dans le modèle multi-processus, le processus peut facilement libérer de la mémoire en quittant. Étant donné que PHP possède de nombreuses extensions, des fuites de mémoire peuvent se produire si vous ne faites pas attention, FPM résout le problème simplement en quittant le processus.

  2. Forte capacité de reprise après sinistre. Avec le même problème, les extensions ou PHP peuvent provoquer des erreurs de segmentation. S'il s'agit d'un modèle multi-thread à processus unique, alors tout PHP se bloquera. Cela affectera le service. S'il existe plusieurs processus, la mort d'un certain processus n'affectera pas le service global.

Les processus multiples présentent les avantages de plusieurs processus, et le multi-threading présente également les avantages du multi-threading. Par exemple, HHVM choisit un modèle multi-thread. Le plus grand avantage du modèle multithread est la commodité du partage d’informations et de la communication, car les pointeurs peuvent être utilisés directement dans le même espace de processus.

Par exemple, l'outil de cache d'opcode. En PHP, apc, opcache, etc. utilisent la mémoire partagée pour partager l'opcode. Dans HHVM, il n'est pas nécessaire d'utiliser la mémoire partagée. le stockage est compliqué. La structure des données est peu pratique en raison du problème des pointeurs. La structure des données en C/C++ peut être partagée dans des situations multithread. Ceci est également utile pour améliorer l’efficacité.

Il existe également une différence de modèle évidente entre le multi-traitement et le multi-thread : la logique lors du traitement des requêtes.

Dans le cas de multi-processus, il est difficile de transférer la connexion FD entre les processus. De nombreux processus utilisent généralement listen() dans le processus parent, puis accept() dans chaque processus enfant pour réaliser l'équilibrage de charge. Il peut y avoir un problème de troupeau dans un tel modèle.

Dans le modèle multi-thread, un thread indépendant peut être utilisé pour accepter la demande, puis la distribuer à chaque thread de travail.

Recommandations associées :

Explication détaillée des problèmes d'exécution JS monothread

Prise en charge de PHP et utilisation de la programmation multithread

Un cas d'implémentation d'une classe multi-thread PHP

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