Heim >Web-Frontend >js-Tutorial >Einführung in Browserprozesse und Threads

Einführung in Browserprozesse und Threads

不言
不言nach vorne
2018-11-17 16:29:361918Durchsuche

Der Inhalt dieses Artikels ist eine Einführung in Browserprozesse und -threads. Er hat einen gewissen Referenzwert. Ich hoffe, dass er für Sie hilfreich ist.

Prozess

Ein Prozess ist die kleinste Einheit der CPU-Ressourcenzuweisung.

Mehrere Prozesse: Multiprozess bezieht sich darauf, dass zwei oder mehr Prozesse gleichzeitig im selben Computersystem ausgeführt werden dürfen. Die Vorteile mehrerer Prozesse liegen auf der Hand: Sie können beispielsweise einen Editor öffnen und Code eingeben, während Sie Musik hören, und die Prozesse des Editors und der Musik-Hörsoftware stören sich überhaupt nicht.

Browser sind Multiprozessprozesse. Die Browserprozesse umfassen hauptsächlich die folgenden Typen:

  1. Browserprozess: Der Hauptprozess des Browsers ( Verantwortlich zur Koordination und Hauptsteuerung)

  2. Drittanbieter-Plug-In-Prozess: Jeder Plug-In-Typ entspricht einem Prozess, der nur erstellt wird, wenn das Plug-In verwendet wird

  3. GPU-Prozess: höchstens einer, wird für 3D-Rendering verwendet

  4. Browser-Rendering-Prozess (Kernel) : Standardmäßig einer Prozess pro Tab-Seite, beeinflusst sich nicht gegenseitig, steuert Seitenrendering, Skriptausführung, Ereignisverarbeitung usw. (manchmal optimiert, z. B. werden mehrere leere Tabs zu einem Prozess zusammengeführt)

Öffnen Sie beim Surfen im Internet mehrere neue Seiten gleichzeitig. Dies erfordert das Öffnen mehrerer Browserfenster. Sobald jedoch mehr als ein Dutzend Fenster geöffnet sind, wird der gesamte Computer immer langsamer.

Vorteile von Multiprozess-Browsern

Verhindern Sie, dass sich die Seitenwiedergabe auf den gesamten Browser auswirkt.

Verhindern Sie, dass Plug-ins von Drittanbietern Auswirkungen auf den gesamten Browser haben.

Mehrere Prozesse nutzen die Vorteile von Multi-Core voll aus

Es ist praktisch, das Sandbox-Modell zu verwenden, um Plug-Ins und andere Prozesse zu isolieren und die Browserstabilität zu verbessern

In Laienbegriffe: Wenn der Benutzer mehrere Fenster öffnet, wenn eines der Fenster abstürzt. Wenn es gelöscht wird, hat dies keine Auswirkungen auf den gesamten Browser und andere Schnittstellen werden weiterhin normal ausgeführt

Threads

  • Ein Prozess besteht aus einem oder mehreren Threads. Zusammensetzung, Threads sind verschiedene Ausführungsrouten von Code in einem Prozess

  • Prozesse sind unabhängig voneinander , aber der Speicherplatz des Programms (einschließlich Codesegmente, Datensatz, Heap usw.) und einige Ressourcen auf Prozessebene (z. B. offene Dateien und Signale).

Der Rendering-Prozess des Browsers (Browserkernel) ist multithreaded und fällt hauptsächlich in die folgenden Kategorien:

  1. GUI-Thread

  2. Javascript-Engine-Thread

  3. Ereignisauslöser-Thread

  4. Timer-Thread

  5. Netzwerkanforderungsthread

GUI-Thread

ist für die Darstellung von HTML-Elementen der Browseroberfläche verantwortlich Der Thread wird ausgeführt, wenn ein Repaint erforderlich ist oder ein Reflow durch einen Vorgang verursacht wird. Während die Javascript-Engine das Skript ausführt, befindet sich der GUI-Rendering-Thread in einem angehaltenen Zustand, was bedeutet, dass er auch „eingefroren“ ist Es wird als JS-Kernel bezeichnet und ist hauptsächlich für die Verarbeitung von Javascript-Skriptprogrammen wie der V8-Engine verantwortlich. Der Javascript-Engine-Thread ist natürlich für das Parsen von Javascript-Skripten und das Ausführen von Codes verantwortlich.

Javascript ist Single-Threaded

Dies liegt an der Mission der Geburt der Skriptsprache Javascript: JavaScript verwaltet die Benutzerinteraktion auf der Seite und betreibt den DOM-Baum , CSS-Stilbaum, um Benutzern ein dynamisches und reichhaltiges interaktives Erlebnis und eine interaktive Verarbeitung der Serverlogik zu bieten. Wenn JavaScript eine Multithread-Methode zur Bedienung dieser Benutzeroberfläche ist DOM können Konflikte bei UI-Vorgängen auftreten; Wenn Javascript Multithreading ist, kann der DOM-Knoten in der Benutzeroberfläche bei Multithread-Interaktion zu einer kritischen Ressource werden. Angenommen, es gibt zwei Threads, die gleichzeitig ein DOM betreiben, einen für das Ändern und einen für das Löschen und anschließende Durchsuchen Dies ist zu diesem Zeitpunkt erforderlich. Der Prozessor bestimmt, wie die Ausführungsergebnisse des Threads wirksam werden. Natürlich können wir das obige Problem durch Sperren lösen. Um jedoch eine größere Komplexität durch die Einführung von Sperren zu vermeiden, hat sich Javascript von Anfang an für die Single-Thread-Ausführung entschieden.

Der GUI-Rendering-Thread und der JavaScript-Engine-Thread schließen sich gegenseitig aus!

Da JavaScript das DOM manipulieren kann, werden die Elementdaten erhalten, wenn Sie die Attribute dieser Elemente beim Rendern der Schnittstelle ändern (d. h. der JavaScript-Thread und der UI-Thread werden gleichzeitig ausgeführt). vor und nach dem Rendering-Thread sind möglicherweise inkonsistent. Um unerwartete Rendering-Ergebnisse zu verhindern, stellt der Browser daher eine gegenseitig ausschließende Beziehung zwischen dem GUI-Rendering-Thread und der JavaScript-Engine ein. Wenn die JavaScript-Engine ausgeführt wird, wird der GUI-Thread angehalten und GUI-Updates werden in einem gespeichert Warteschlange, bis der Engine-Thread inaktiv ist, wird sofort ausgeführt.

JS blockiert das Laden von Seiten

Da sich der GUI-Rendering-Thread und der JavaScript-Ausführungsthread gegenseitig ausschließen, wird der GUI-Rendering-Thread ausgeführt, wenn der Browser das JavaScript-Programm ausführt wird in einer Warteschlange gespeichert und erst ausgeführt, wenn das JS-Programm abgeschlossen ist. Wenn daher die Ausführungszeit von JS zu lang ist, ist das Rendern der Seite inkohärent, was zu dem Gefühl führt, dass das Rendern und Laden der Seite blockiert ist.

Zeitgesteuerter Trigger-Thread

Der Browser-Timing-Zähler wird von der JavaScript-Engine nicht gezählt, da sich die JavaScript-Engine in einem blockierten Thread-Zustand befindet und daher die Genauigkeit des Timings beeinträchtigt wird und das Timing über einen separaten Thread auslösen.

Ereignisauslösender Thread

Wenn ein Ereignis ausgelöst wird, fügt der Thread das Ereignis am Ende der ausstehenden Warteschlange hinzu und wartet auf die Verarbeitung durch die JS-Engine. Diese Ereignisse können vom aktuell ausgeführten Codeblock stammen, z. B. geplante Aufgaben, oder von anderen Threads im Browserkernel, z. B. Mausklicks, asynchrone AJAX-Anforderungen usw. Aufgrund der Single-Thread-Beziehung von JS gilt dies jedoch für alle diese Ereignisse in die Warteschlange gestellt und auf die Verarbeitung durch die JS-Engine gewartet werden.

Asynchroner HTTP-Anfrage-Thread

Nachdem XMLHttpRequest verbunden wurde, wird eine neue Thread-Anfrage über den Browser geöffnet, wenn die Statusänderung erkannt wird, sofern eine Rückruffunktion festgelegt ist , Der asynchrone Thread generiert ein Statusänderungsereignis und stellt es in die Verarbeitungswarteschlange der JavaScript-Engine, um auf die Verarbeitung zu warten.

Das obige ist der detaillierte Inhalt vonEinführung in Browserprozesse und Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen