Was ist ein Prozess? Ein Prozess ist ein ausführendes Programm; ein Prozess ist eine Instanz eines Programms, das auf einem Computer ausgeführt wird; ein Prozess ist eine Entität, die einem Prozessor zugewiesen und von diesem ausgeführt werden kann. Ein Prozess umfasst im Allgemeinen einen Befehlssatz und einen Systemressourcensatz. Der Befehlssatz bezieht sich hier auf den Programmcode, und der Systemressourcensatz bezieht sich hier auf E/A, CPU, Speicher usw. Zusammenfassend können wir auch verstehen, dass ein Prozess eine laufende Aktivität eines Programms mit bestimmten unabhängigen Funktionen für eine bestimmte Datensammlung ist. Ein Prozess ist eine unabhängige Einheit für die Ressourcenzuweisung und -planung im System.
Wenn ein Prozess ausgeführt wird, kann der Prozess eindeutig dargestellt werden, bestehend aus den folgenden Elementen:
Prozessdeskriptor: die eindeutige Kennung des Prozesses, verwendet mit „Andere“. Prozesse werden unterschieden. Sie heißt unter Linux Prozess-ID und wird während des Systemaufrufs generiert. Was wir jedoch über getpid zurückgeben, ist nicht sein PID-Feld, sondern seine Thread-Gruppennummer tgid.
Prozessstatus: Die Zustände, die wir oft als Suspend, Running usw. bezeichnen, stellen den aktuellen Zustand dar.
Priorität: bezogen auf die Ausführungsplanung zwischen Prozessen, relativ zu anderen Prozessen.
Programmzähler: Die Adresse des nächsten Befehls, der im Programm ausgeführt werden soll. Diese Adresse ist die Speicheradresse im Kernel- oder Benutzerspeicherbereich.
Speicherzeiger: einschließlich Zeiger auf Programmcode und prozessbezogene Daten sowie Zeiger auf gemeinsam genutzte Speicherblöcke mit anderen Prozessen.
Kontextdaten: Die Daten des Prozessorregisters, wenn der Prozess ausgeführt wird.
E/A-Statusinformationen: einschließlich expliziter E/A-Anfragen, den Prozessen zugewiesenen E/A-Geräten usw.
Buchhaltungsinformationen: kann die gesamte Prozessorzeit, die Gesamtzahl der verwendeten Uhren, Zeitlimits usw. umfassen.
Die oben genannten Elemente werden in einer Datenstruktur platziert, die als Prozesssteuerungsblock bezeichnet wird. Der Prozesssteuerungsblock ist eine Struktur, die es dem Betriebssystem ermöglicht, mehrere Prozesse zu unterstützen und Mehrfachverarbeitung bereitzustellen. Wenn das Betriebssystem den Prozess wechselt, führt es zwei Schritte aus: Der eine besteht darin, den Prozess im aktuellen Prozessor zu unterbrechen, und der andere darin, den nächsten Prozess auszuführen. Unabhängig von Interrupt oder Ausführung ändern sich der Programmzähler, die Kontextdaten und der Prozessstatus im Prozesssteuerungsblock. Wenn der Prozess unterbrochen wird, speichert das Betriebssystem den Programmzähler und das Prozessorregister (entsprechend den Kontextdaten im Prozesssteuerungsblock) an der entsprechenden Stelle im Prozesssteuerungsblock. Der Prozessstatus ändert sich ebenfalls und tritt möglicherweise ein Es kann in einen Blockierungszustand übergehen oder in den Bereitschaftszustand übergehen. Wenn der nächste Prozess ausgeführt wird, versetzt das Betriebssystem den nächsten Prozess gemäß den Regeln in den laufenden Zustand und lädt die Programmkontextdaten und den Programmzähler des auszuführenden Prozesses.
Ein Prozess besteht aus zwei charakteristischen Teilen: Ressourcenbesitz und Planung der Ausführung. Ressourceneigentum bedeutet, dass der Prozess den Speicherplatz, die E/A und andere Ressourcen umfasst, die für die Ausführung des Prozesses erforderlich sind. Die Planung der Ausführung bezieht sich auf den Ausführungspfad in der Mitte der Prozessausführung oder den Befehlsausführungsfluss des Programms. Diese beiden Funktionsteile können nach der Trennung getrennt werden. Der Teil mit Dateneigentum wird normalerweise als Prozess bezeichnet, und der Teil mit dem verteilbaren Teil des Ausführungscodes wird als Thread oder Lightweight-Prozess bezeichnet.
Threads haben die Bedeutung von „Ausführungshinweisen“, und der Prozess wird als Ressourceneigentümer in einer Multithread-Umgebung definiert, in der weiterhin der Prozesssteuerungsblock des Prozesses gespeichert wird. Die Struktur von Threads unterscheidet sich von der von Prozessen. Jeder Thread umfasst:
Thread-Status: Der aktuelle Status des Threads.
Ein Ausführungsstapel
Privater Datenbereich: statischer Speicherplatz für lokale Variablen jedes Threads
Registersatz: Speichert einen Zustand des Prozessors
Jeder Prozess verfügt über einen Prozesssteuerungsblock und einen Benutzeradressraum, und jeder Thread verfügt über einen unabhängigen Stapel und Unabhängige Steuerblöcke verfügen über einen eigenen unabhängigen Ausführungskontext. Seine Struktur ist in Abbildung 8.1 dargestellt.
Abbildung 8.1 Prozessmodelldiagramm
Threads unterscheiden sich etwas von Prozessen während der Ausführung. Jeder unabhängige Thread verfügt über einen Einstiegspunkt für die Programmausführung, eine sequentielle Ausführungssequenz und einen Ausstiegspunkt für das Programm. Threads können jedoch nicht unabhängig ausgeführt werden und müssen im Prozess vorhanden sein, und der Prozess bietet die Ausführungskontrolle für mehrere Threads. Aus logischer Sicht bedeutet Multithreading, dass in einem Prozess mehrere Ausführungsteile gleichzeitig ausgeführt werden können. Zu diesem Zeitpunkt ist der Prozess selbst nicht die grundlegende laufende Einheit, sondern der Thread-Container.
Der Vorteil von Threads gegenüber Prozessen besteht darin, dass sie schneller sind, unabhängig davon, ob sie zwischen Threads wechseln oder Daten oder Kommunikation zwischen Threads austauschen von Prozessen.
Parallelität, auch Koexistenz genannt, bezieht sich auf die Fähigkeit, mehrere gleichzeitige Aktivitäten zu bewältigen, die nicht unbedingt erforderlich sind Das Gleiche passiert immer. Moderne Computersysteme können beispielsweise mehrere Programme gleichzeitig in Form von Prozessen in den Speicher laden und durch Zeitmultiplex des Prozessors das Gefühl vermitteln, gleichzeitig auf einem Prozessor zu laufen.
Parallel bezieht sich auf zwei gleichzeitig auftretende Ereignisse, was Parallelität bedeutet, aber Parallelität ist nicht unbedingt parallel.
Der Unterschied zwischen Parallelität und Parallelität besteht darin, dass ein Prozessor mehrere Aufgaben gleichzeitig verarbeitet und mehrere Prozessoren oder Mehrkernprozessoren mehrere verschiedene Aufgaben gleichzeitig verarbeiten. Ersteres ist logische Gleichzeitigkeit, während letzteres physikalische Gleichzeitigkeit ist.
Da es zwei Modelle gibt, welches verwendet PHP? Die Antwort ist, dass sie alle unterstützt werden, was bedeutet, dass PHP das Multithread-Modell unterstützt. In Multithread-Situationen müssen normalerweise die Probleme der Ressourcenfreigabe und -isolation gelöst werden. PHP selbst ist threadsicher.
Das spezifische Modell hängt davon ab, welche SAPI verwendet wird. Beispielsweise kann in Apache das Multi-Thread-Modell oder das Multi-Prozess-Modell verwendet werden. Und php-fpm verwendet das Multiprozessmodell.
Die derzeit empfohlene Methode ist die Verwendung des PHP-FPM-Modells, da dieses Modell viele Vorteile für PHP bietet:
Die Speicherfreigabe ist bei der Verwendung einfach Beim Multiprozessmodell kann der Prozess durch Beenden leicht Speicher freigeben. Da PHP über viele Erweiterungen verfügt, kann es zu Speicherlecks kommen, wenn Sie nicht vorsichtig sind und das Problem einfach durch Beenden des Prozesses lösen.
Starke Disaster-Recovery-Fähigkeit: Erweiterungen oder PHP können Segmentierungsfehler verursachen. Wenn es sich um ein Einzelprozess-Multithread-Modell handelt, bleibt das gesamte PHP hängen. Dies wirkt sich auf den Dienst aus. Wenn mehrere Prozesse vorhanden sind, hat der Tod eines bestimmten Prozesses keine Auswirkungen auf den gesamten Dienst.
Mehrere Prozesse haben die Vorteile mehrerer Prozesse, und Multithreading hat auch die Vorteile von Multithreading. Beispielsweise wählt HHVM ein Multithreading-Modell. Der größte Vorteil des Multithreading-Modells ist die Bequemlichkeit des Informationsaustauschs und der Kommunikation, da Zeiger direkt im selben Prozessraum verwendet werden können.
Zum Beispiel verwenden das Opcode-Cache-Tool in PHP, APC, Opcache usw. den gemeinsam genutzten Speicher. In HHVM besteht keine Notwendigkeit, den gemeinsam genutzten Speicher zu verwenden Die Datenstruktur ist aufgrund des Zeigerproblems kompliziert. Die Datenstruktur in C/C++ kann in Multithread-Situationen gemeinsam genutzt werden. Dies ist auch hilfreich für die Verbesserung der Effizienz.
Es gibt einen weiteren offensichtlichen Modellunterschied zwischen Multi-Processing und Multi-Threading: die Logik bei der Verarbeitung von Anfragen.
Bei Multiprozessen ist es schwierig, die FD-Verbindung prozessübergreifend zu übertragen. Viele Prozesse verwenden normalerweise listen()
im übergeordneten Prozess und dann accept()
in jedem untergeordneten Prozess, um einen Lastausgleich zu erreichen. Bei einem solchen Modell kann es zu einem Herdenproblem kommen.
Im Multithreading-Modell kann ein unabhängiger Thread verwendet werden, um die Anfrage anzunehmen und sie dann an jeden Arbeitsthread weiterzuleiten.
Verwandte Empfehlungen:
Detaillierte Erläuterung von Single-Threaded-JS-Ausführungsproblemen
PHPs Unterstützung und Verwendung von Multithread-Programmierung
Ein Fall der Implementierung der PHP-Multithreading-Klasse
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Thread-Prozesse und gleichzeitigen Instanzen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!