mweerden: NT wurde vom ersten Tag an für Mehrbenutzer entwickelt, daher ist dies kein wirklicher Grund. Sie haben jedoch Recht, dass die Prozesserstellung unter NT eine weniger wichtige Rolle spielt als unter Unix, da NT im Gegensatz zu Unix Multithreading gegenüber Multiprocessing bevorzugt.
Rob, es ist wahr, dass Gabel relativ billig ist, wenn COW verwendet wird, aber tatsächlich wird Gabel meistens von einem Exec gefolgt. Und ein Exec muss auch alle Bilder laden. Die Leistung der Gabel zu diskutieren ist daher nur ein Teil der Wahrheit.
Bei der Erörterung der Geschwindigkeit der Prozesserstellung ist es wahrscheinlich eine gute Idee, zwischen NT und Windows / Win32 zu unterscheiden. Was NT (dh den Kernel selbst) betrifft, denke ich nicht, dass die Prozesserstellung (NtCreateProcess) und die Thread-Erstellung (NtCreateThread) erheblich langsamer sind als bei durchschnittlichem Unix. Es ist vielleicht ein bisschen mehr los, aber ich sehe hier nicht den Hauptgrund für den Leistungsunterschied.
Wenn Sie sich jedoch Win32 ansehen, werden Sie feststellen, dass die Prozesserstellung dadurch einen erheblichen Aufwand verursacht. Zum einen muss das CSRSS über die Prozesserstellung informiert werden, an der LPC beteiligt ist. Es muss mindestens kernel32 zusätzlich geladen werden, und es muss eine Reihe zusätzlicher Buchhaltungsaufgaben ausführen, bevor der Prozess als vollwertiger Win32-Prozess betrachtet wird. Und vergessen wir nicht den zusätzlichen Aufwand, der durch das Parsen von Manifesten entsteht. Überprüfen Sie, ob für das Image ein Kompatibilitäts-Shim erforderlich ist, und prüfen Sie, ob Richtlinien für Softwareeinschränkungen gelten.
Das heißt, ich sehe die allgemeine Verlangsamung in der Summe all dieser kleinen Dinge, die zusätzlich zur rohen Erstellung eines Prozesses, des VA-Raums und des anfänglichen Threads getan werden müssen. Aber wie eingangs gesagt - aufgrund der Bevorzugung von Multithreading gegenüber Multitasking ist die einzige Software, die von diesen zusätzlichen Kosten ernsthaft betroffen ist, schlecht portierte Unix-Software. Obwohl sich diese Situation ändert, wenn Software wie Chrome und IE8 plötzlich die Vorteile der Mehrfachverarbeitung wieder entdecken und häufig Prozesse starten und abbauen ...
Unix hat einen 'Fork'-Systemaufruf, der den aktuellen Prozess in zwei Teile' aufteilt 'und Ihnen einen zweiten Prozess gibt, der mit dem ersten identisch ist (Modulo der Rückkehr vom Fork-Aufruf). Da der Adressraum des neuen Prozesses bereits aktiv ist, sollte dies billiger sein, als "CreateProcess" in Windows aufzurufen und das exe-Image, die zugehörigen DLLs usw. laden zu lassen.
In diesem Fall kann das Betriebssystem die "Copy-on-Write" -Semantik für die Speicherseiten verwenden, die beiden neuen Prozessen zugeordnet sind, um sicherzustellen, dass jede Seite eine eigene Kopie der Seiten erhält, die sie anschließend ändern.
quelle
Hinzu kommt, was JP gesagt hat: Der größte Teil des Overheads gehört zum Win32-Start für den Prozess.
Der Windows NT-Kernel unterstützt tatsächlich COW Fork. SFU (Microsoft UNIX-Umgebung für Windows) verwendet sie. Win32 unterstützt Fork jedoch nicht. SFU-Prozesse sind keine Win32-Prozesse. SFU ist orthogonal zu Win32: Beide sind Umgebungssubsysteme, die auf demselben Kernel basieren.
Zusätzlich zu den Out-of-Process-LPC-Aufrufen an
CSRSS
XP und höher erfolgt ein Out-of-Process-Aufruf an die Anwendungskompatibilitäts-Engine, um das Programm in der Anwendungskompatibilitätsdatenbank zu finden. Dieser Schritt verursacht genügend Overhead, sodass Microsoft eine Gruppenrichtlinienoption bereitstellt, um die Kompatibilitätsengine auf WS2003 aus Leistungsgründen zu deaktivieren .Die Win32-Laufzeitbibliotheken (kernel32.dll usw.) führen beim Start auch viele Registrierungslesevorgänge und -initialisierungen durch, die nicht für UNIX-, SFU- oder native Prozesse gelten.
Native Prozesse (ohne Umgebungssubsystem) lassen sich sehr schnell erstellen. SFU leistet bei der Prozesserstellung viel weniger als Win32, sodass die Prozesse auch schnell erstellt werden können.
UPDATE FÜR 2019: LXSS: Windows Subsystem für Linux hinzufügen
Das Ersetzen von SFU für Windows 10 ist das LXSS-Umgebungssubsystem. Es ist 100% Kernel-Modus und erfordert keinen der IPCs, die Win32 weiterhin hat. Syscall für diese Prozesse ist direkt an lxss.sys / lxcore.sys gerichtet, sodass der fork () - oder andere Prozess, der einen Anruf erstellt, nur 1 Systemaufruf für den Ersteller kostet. [Ein Datenbereich namens Instanz] verfolgt alle LX-Prozesse, Threads und den Laufzeitstatus.
LXSS-Prozesse basieren auf nativen Prozessen, nicht auf Win32-Prozessen. Alle Win32-spezifischen Dinge wie die Kompatibilitäts-Engine sind überhaupt nicht aktiviert.
quelle
Neben der Antwort von Rob Walker: Heutzutage gibt es Dinge wie die native POSIX-Thread-Bibliothek - wenn Sie möchten. Lange Zeit war die einzige Möglichkeit, die Arbeit in der Unix-Welt zu "delegieren", die Verwendung von fork () (und dies wird unter vielen, vielen Umständen immer noch bevorzugt). zB eine Art Socket-Server
Daher musste die Implementierung von Fork schnell sein und im Laufe der Zeit wurden viele Optimierungen implementiert. Microsoft hat CreateThread oder sogar Fasern empfohlen, anstatt neue Prozesse und die Verwendung der Interprozesskommunikation zu erstellen. Ich denke, es ist nicht "fair", CreateProcess mit Fork zu vergleichen, da sie nicht austauschbar sind. Es ist wahrscheinlich besser, fork / exec mit CreateProcess zu vergleichen.quelle
Der Schlüssel zu dieser Angelegenheit ist meiner Meinung nach die historische Nutzung beider Systeme. Windows (und DOS davor) haben ursprünglich Einplatzsysteme für gewesen persönlichen Computer. Daher müssen diese Systeme normalerweise nicht ständig viele Prozesse erstellen. (sehr) einfach ausgedrückt, ein Prozess wird nur erstellt, wenn dieser eine einsame Benutzer ihn anfordert (und wir Menschen arbeiten relativ gesehen nicht sehr schnell).
Unix-basierte Systeme waren ursprünglich Mehrbenutzersysteme und Server. Insbesondere für letztere ist es nicht ungewöhnlich, dass Prozesse (z. B. Mail- oder http-Daemons) Prozesse aufteilen, um bestimmte Jobs zu erledigen (z. B. die Pflege einer eingehenden Verbindung). Ein wichtiger Faktor dabei ist die kostengünstige
fork
Methode (die, wie von Rob Walker ( 47865 ) erwähnt, zunächst denselben Speicher für den neu erstellten Prozess verwendet), die sehr nützlich ist, da der neue Prozess sofort über alle erforderlichen Informationen verfügt.Es ist klar, dass zumindest historisch gesehen die Notwendigkeit für Unix-basierte Systeme zur schnellen Prozesserstellung weitaus größer ist als für Windows-Systeme. Ich denke, dass dies immer noch der Fall ist, weil Unix-basierte Systeme immer noch sehr prozessorientiert sind, während Windows aufgrund seiner Geschichte wahrscheinlich stärker auf Threads ausgerichtet war (Threads sind nützlich, um reaktionsfähige Anwendungen zu erstellen).
Haftungsausschluss: Ich bin in dieser Angelegenheit kein Experte. Verzeihen Sie mir, wenn ich etwas falsch gemacht habe.
quelle
Äh, es scheint eine Menge Rechtfertigungen zu geben, die "so ist es besser".
Ich denke, die Leute könnten vom Lesen von "Showstopper" profitieren. das Buch über die Entwicklung von Windows NT.
Der ganze Grund, warum die Dienste unter Windows NT als DLLs in einem Prozess ausgeführt werden, war, dass sie als separate Prozesse zu langsam waren.
Wenn Sie sich schmutzig gemacht haben, werden Sie feststellen, dass die Strategie zum Laden der Bibliothek das Problem ist.
Auf Unices (im Allgemeinen) werden die Codesegmente der Shared Libraries (DLLs) tatsächlich gemeinsam genutzt.
Windows NT lädt eine Kopie der DLL pro Prozess, da es das Bibliothekscodesegment (und das ausführbare Codesegment) nach dem Laden manipuliert. (Sagt es, wo sind Ihre Daten?)
Dies führt zu Codesegmenten in Bibliotheken, die nicht wiederverwendbar sind.
Das Erstellen des NT-Prozesses ist also ziemlich teuer. Und auf der anderen Seite bedeutet dies, dass DLL keine nennenswerte Speicherersparnis darstellt, sondern eine Chance für Abhängigkeitsprobleme zwischen Apps darstellt.
Manchmal lohnt es sich in der Technik, zurückzutreten und zu sagen: "Wenn wir das jetzt so gestalten würden, dass es wirklich scheiße ist, wie würde es dann aussehen?"
Ich arbeitete mit einem eingebetteten System, das einst ziemlich temperamentvoll war, und eines Tages schaute ich es mir an und stellte fest, dass es sich um ein Hohlraummagnetron handelte, mit der Elektronik im Mikrowellenhohlraum. Danach haben wir es viel stabiler (und weniger wie eine Mikrowelle) gemacht.
quelle
Die kurze Antwort lautet "Softwareschichten und -komponenten".
Die Windows-SW-Architektur verfügt über einige zusätzliche Ebenen und Komponenten, die unter Unix nicht vorhanden sind oder unter Unix im Kernel vereinfacht und verarbeitet werden.
Unter Unix sind Fork und Exec direkte Aufrufe des Kernels.
Unter Windows wird die Kernel-API nicht direkt verwendet, darüber befinden sich Win32 und bestimmte andere Komponenten. Daher muss die Prozesserstellung zusätzliche Ebenen durchlaufen und der neue Prozess muss gestartet werden oder eine Verbindung zu diesen Ebenen und Komponenten herstellen.
Seit geraumer Zeit versuchen Forscher und Unternehmen, Unix auf vage ähnliche Weise aufzubrechen, wobei ihre Experimente normalerweise auf dem Mach-Kernel basieren . ein bekanntes Beispiel ist OS X . Jedes Mal, wenn sie es versuchen, wird es jedoch so langsam, dass sie die Teile zumindest teilweise entweder dauerhaft oder für Produktionslieferungen wieder teilweise in den Kernel zurückführen.
quelle
Da es in einigen Antworten eine Rechtfertigung für MS-Windows zu geben scheint, z
Schauen wir uns nun die Fakten an. Was ist der Unterschied in der Leistung?
Daten zusammengefasst von http://www.bitsnbites.eu/benchmarking-os-primitives/ .
Da Voreingenommenheit unvermeidlich ist, habe ich es für die meisten Tests i7 8 Core 3.2GHz zugunsten von MS-Windows-
Hardware getan. Außer Raspberry-Pi mit Gnu / Linux
Hinweise: Unter Linux
fork
ist die von MS-Window bevorzugte Methode schnellerCreateThread
.Zahlen für Operationen zur Erstellung von Prozessen (da der Wert für Linux in der Tabelle nur schwer zu erkennen ist).
In der Reihenfolge der Geschwindigkeit am schnellsten bis am langsamsten (Zahlen sind Zeit, klein ist besser).
Zahlen für andere Messungen
quelle
All das und die Tatsache, dass auf dem Win-Computer höchstwahrscheinlich eine Antivirensoftware während des Erstellungsprozesses aktiviert wird ... Das ist normalerweise die größte Verlangsamung.
quelle
Es ist auch erwähnenswert, dass das Sicherheitsmodell in Windows erheblich komplizierter ist als in Unix-basierten Betriebssystemen, was bei der Prozesserstellung viel Aufwand verursacht. Ein weiterer Grund, warum Multithreading in Windows dem Multiprozessing vorgezogen wird.
quelle
fork()