In diesem Artikel wird hauptsächlich ein Beispiel für den Ausführungsprozess von pcntl_fork vorgestellt. Das Konzept des Prozesses besteht hauptsächlich aus drei Elementen:
1. Ein ausführbares Programm
2. Alle mit dem Prozess verbundenen Daten (einschließlich Variablen, Speicherplatz, Puffer usw.);
3. Der Ausführungskontext des Programms
kann als
betrachtet werden. Es kann einfach verstanden werden, dass ein Prozess einen Ausführungsprozess eines ausführbaren Programms darstellt. ein Staat in. Die Verwaltung von Prozessen durch das Betriebssystem erfolgt typischerweise über die Prozesstabelle. Jeder Eintrag in der Prozesstabelle zeichnet den Status eines Prozesses im aktuellen Betriebssystem auf.
Im Fall einer einzelnen CPU belegt zu einem bestimmten Zeitpunkt nur ein Prozess die CPU, es können jedoch gleichzeitig mehrere aktive Prozesse (die auf die Ausführung oder die fortgesetzte Ausführung warten) im System vorhanden sein. Ein als Programmzähler (PC) bezeichnetes Register gibt die Position des nächsten Befehls an, der von dem Prozess ausgeführt werden soll, der derzeit die CPU belegt. Wenn die einem Prozess zugewiesene CPU-Zeit aufgebraucht ist, speichert das Betriebssystem den Wert des Registers, das sich auf den Prozess bezieht, im entsprechenden Eintrag des Prozesses in der Prozesstabelle, von dem die CPU übernommen wird Dieser Prozess wird aus der Prozesstabelle gelesen und das entsprechende Register aktualisiert (dieser Prozess wird als „
Kontextwechsel (Prozesskontextwechsel)“ bezeichnet). Der eigentliche Kontextwechsel muss mehr Daten umfassen, was nichts damit zu tun hat Keine weiteren Details zu beachten ist, dass das Programmregister angibt, wo das Programm ausgeführt wurde. Der Prozess, der aus der CPU ausgelagert wird, muss diesen Wert speichern Der Prozess, der in die CPU eingelagert wird, muss auch auf der Grundlage der darin gespeicherten Ausführungskontextinformationen dieses Registers aktualisiert werden.
Nach der Verzweigung kopiert das Betriebssystem einen untergeordneten Prozess, der genau dem übergeordneten Prozess entspricht, obwohl es sich aus der Perspektive um eine Vater-Sohn-Beziehung handelt Im Betriebssystem ähneln sie eher einer Brüderbeziehung. Diese beiden Prozesse teilen sich den Coderaum, aber der Datenraum ist unabhängig voneinander. Der Inhalt im Datenraum des untergeordneten Prozesses ist eine vollständige Kopie des übergeordneten Prozesses Der Befehlszeiger ist genau derselbe, es gibt jedoch nur einen Unterschied. Wenn die Verzweigung erfolgreich ist, ist der Inhalt im Datenraum des untergeordneten Prozesses eine vollständige Kopie des übergeordneten Prozesses. Der Rückgabewert von fork im übergeordneten Prozess ist die Prozessnummer des untergeordneten Prozesses. Wenn der Fork fehlschlägt, gibt der übergeordnete Prozess einen Fehler zurück. Man kann sich vorstellen, dass die beiden Prozesse gleichzeitig und im gleichen Tempo ausgeführt wurden. Nach der Verzweigung erledigen sie jeweils unterschiedliche Aufgaben, das heißt, sie teilen sich auf. Deshalb wird die Verzweigung als Verzweigung bezeichnet. Welcher Prozess zuerst ausgeführt wird, hängt mit dem Planungsalgorithmus der Betriebssystemplattform zusammen, und dieses Problem ist in praktischen Anwendungen nicht wichtig. Wenn übergeordnete und untergeordnete Prozesse zusammenarbeiten müssen, kann es durch die Steuerung der Syntaxstruktur gelöst werden.
2
Der untergeordnete Prozess kann die Dinge des übergeordneten Prozesses vor Fork erben, aber nach pcntl_fork() können der untergeordnete Prozess und der Der übergeordnete Prozess hat keine Vererbungsbeziehung. Im untergeordneten Prozess erstellte Dinge gehören zum untergeordneten Prozess, und im übergeordneten Prozess erstellte Dinge gehören zum übergeordneten Prozess. Sie können vollständig als zwei unabhängige Prozesse betrachtet werden.
3
Nachdem pcntl_fork() im Programmsegment verwendet wurde, gab es zwei Prozesse, die abgeleitet wurden Was zuerst ausgeführt wird, hängt vom Planungsalgorithmus des Systems ab.Hier können wir uns vorstellen, dass das System beim Ausführen von „pid=pcntl_fork();“ einen Unterprozess erzeugt, der genau dem Hauptprogramm entspricht. Die im Satz „pid=pcntl_fork();“ erhaltene PID ist die PID des untergeordneten Prozesses selbst, die im Satz „pid=pcntl_fork();“ erhaltene PID ist die PID des übergeordneten Prozesses selbst. Das Programm verfügt also über zwei Ausgabezeilen.
4
Die Funktion pcntl_fork() kopiert die Leiterplatte des aktuellen Prozesses und gibt die PID des abgeleiteten untergeordneten Prozesses an den übergeordneten Prozess zurück. Die übergeordneten und untergeordneten Prozesse parallel hängen die Reihenfolge der Druckanweisungen vollständig vom Planungsalgorithmus des Systems ab, und der Druckinhalt wird durch die PID-Variable gesteuert. Da wir wissen, dass pcntl_fork() die PID des abgeleiteten untergeordneten Prozesses an den übergeordneten Prozess zurückgibt, was eine positive Ganzzahl ist, und die PID-Variable des abgeleiteten untergeordneten Prozesses nicht geändert wurde, ermöglicht uns dieser Unterschied, ihre unterschiedlichen Ausgaben zu sehen.
5
Beispiel
- Der Prozess, der den untergeordneten Prozess ableitet, dh den übergeordneten Prozess, hat dieselbe PID ;
- Für den untergeordneten Prozess gibt die Funktion fork() 0 an ihn zurück, aber seine eigene PID wird niemals 0 sein; der Grund, warum die Funktion fork() an ihn 0 zurückgibt, ist weil es jederzeit verwendet werden kann Rufen Sie getpid() auf, um Ihre eigene PID zu erhalten.
- Nach der Verzweigung ist es unmöglich zu bestimmen, wer die Synchronisierung zwischen dem übergeordneten und dem untergeordneten Prozess ist Wer zuerst läuft oder wer zuerst endet. Es ist falsch zu glauben, dass der übergeordnete Prozess erst nach Beendigung des untergeordneten Prozesses von fork zurückkehrt. Dies ist bei fork nicht der Fall, sondern bei 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";
Weibo Qzone WeChat pcntl_fork implementiert PHP-Multiprozess,
Detaillierte Einführung in pcntl_fork in PHP-Multiprozess
php Verwendung von pcntl_fork und pcntl_fork
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispiels für den Ausführungsprozess von pcntl_fork. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!