Maison >développement back-end >tutoriel php >Explication détaillée de l'exemple de processus d'exécution pcntl_fork
Cet article partage principalement avec vous un exemple du processus d'exécution pcntl_fork. Le concept de processus est un processus, qui contient principalement trois éléments :
1. Un programme exécutable
2. Toutes les données associées au processus (y compris les variables, l'espace mémoire, les tampons, etc.) ;
3. Le contexte d'exécution du programme ;
peut être considéré comme
On peut simplement comprendre qu'un processus représente un processus d'exécution d'un programme exécutable. un état dans. La gestion des processus par le système d'exploitation s'effectue généralement via la table de processus. Chaque entrée de la table de processus enregistre l'état d'un processus dans le système d'exploitation actuel.
Dans le cas d'un seul processeur, un seul processus occupe le processeur à un moment précis, mais il peut y avoir plusieurs processus actifs (en attente d'exécution ou d'exécution continue) dans le système en même temps. Un registre appelé compteur de programme (pc) indique l'emplacement de la prochaine instruction à exécuter par le processus occupant actuellement le CPU. Lorsque le temps CPU alloué à un processus est épuisé, le système d'exploitation enregistre la valeur du registre lié au processus dans l'entrée correspondante du processus dans la table des processus du contexte du processus qui prendra le relais du CPU ; ce processus est lu à partir de la table de processus et met à jour le registre correspondant (ce processus est appelé "
Changement de contexte (changement de contexte de processus)". Le changement de contexte réel doit impliquer plus de données, ce qui n'a rien à voir avec fork. Pas plus de détails. La principale chose à retenir est que le registre du programme indique où le programme a été exécuté. C'est une partie importante du contexte du processus. Le processus qui est extrait du CPU doit enregistrer la valeur de celui-ci. (Le processus qui est transféré dans la CPU doit également être basé sur la table de processus. Mettez à jour ce registre avec les informations de contexte d'exécution de ce processus qui y sont enregistrées).
Après le fork, le système d'exploitation copiera un processus enfant qui est exactement le même que le processus parent, bien qu'il s'agisse d'une relation père-fils, du point de vue. du système d'exploitation, ils ressemblent plus à des relations frères, ces deux processus partagent l'espace de code, mais l'espace de données est indépendant l'un de l'autre. Le contenu de l'espace de données du processus enfant est une copie complète du processus parent, et le contenu de l'espace de données du processus enfant est une copie complète du processus parent. Le pointeur d'instruction est exactement le même, mais il n'y a qu'une seule différence. Si le fork réussit, le contenu de l'espace de données du processus enfant est une copie complète du processus parent. La valeur de retour de fork est 0. La valeur de retour de fork. dans le processus parent se trouve le numéro de processus du processus enfant. Si fork échoue, le processus parent renverra une erreur. On peut imaginer que les deux processus se sont exécutés en même temps et au même rythme. Après le fork, ils effectuent respectivement des tâches différentes, c'est-à-dire qu'ils bifurquent. C'est pourquoi le fork est appelé fork. Quant au processus qui s'exécute en premier, cela est lié à l'algorithme de planification de la plate-forme du système d'exploitation, et ce problème n'est pas important dans les applications pratiques. Si les processus parent et enfant doivent travailler ensemble, il peut être résolu en contrôlant la structure syntaxique.
2
Le processus enfant peut hériter des éléments du processus parent avant fork, mais après pcntl_fork(), le processus enfant et le le processus parent n'a rien de relation d'héritage. Les éléments créés dans le processus enfant appartiennent au processus enfant, et les éléments créés dans le processus parent appartiennent au processus parent. Ils peuvent être complètement considérés comme deux processus indépendants.
3
Après avoir utilisé pcntl_fork() dans le segment du programme, le programme a bifurqué et deux processus ont été dérivés. Lequel est spécifique ? La première chose à exécuter dépend de l’algorithme de planification du système.Ici, nous pouvons penser que lors de l'exécution de "pid=pcntl_fork();", le système génère un sous-processus qui est exactement le même que le programme principal. Le pid obtenu dans la phrase "pid=pcntl_fork();" du processus est le pid du processus enfant lui-même ; une fois le processus enfant terminé, le pid obtenu dans la phrase "pid=pcntl_fork();" est le pid du processus parent lui-même. Le programme a donc deux lignes de sortie.
4
La fonction pcntl_fork() copie le PCB du processus actuel et renvoie le pid du processus enfant dérivé au processus parent . Les processus parent et enfant En parallèle, l'ordre d'impression des instructions dépend entièrement de l'algorithme de planification du système, et le contenu de l'impression est contrôlé par la variable pid. Parce que nous savons que pcntl_fork() renvoie le pid du processus enfant dérivé au processus parent, qui est un entier positif ; alors que la variable pid du processus enfant dérivé n'a pas été modifiée, cette différence nous permet de voir leurs différentes sorties.
5
Exemple
- Le processus qui dérive le processus enfant, c'est-à-dire le processus parent, a le même pid ;
- Pour le processus enfant, la fonction fork() lui renvoie 0, mais son propre pid ne sera jamais 0, la raison pour laquelle la fonction fork() lui renvoie 0 ; car il peut être utilisé à tout moment Appelez getpid() pour obtenir votre propre pid
- Après fork, à moins que la synchronisation ne soit utilisée entre les processus parent et enfant, il est impossible de déterminer qui est court en premier ou qui termine en premier. Il est faux de penser que le processus parent revient de fork seulement après la fin du processus enfant. Ce n'est pas le cas de fork, mais de vfork.
<?php$lock = new swoole_lock(SWOOLE_MUTEX);echo "[主进程]create lock\n";$lock->lock();$res = pcntl_fork();if ($res>0) { echo "1\n"; $lock->unlock(); sleep(1); echo "222"; } else{ echo "[子进程] Wait Lock\n"; $lock->lock(); echo "[子进程] Get Lock\n"; $lock->unlock(); exit("[子进程] exit\n"); }echo "[主进程]release lock\n";unset($lock);echo "[主进程]exit\n";Recommandations associées :
Weibo Qzone WeChat pcntl_fork implémente PHP multi-processus,
Introduction détaillée à pcntl_fork dans php multi-processus
php Utilisation de pcntl_fork et pcntl_fork
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!