![]() |
Äquivalent zu fork() unter Windows?
Guten Tag!
Was wäre ein Äquivalent zu fork() von Linux, unter Windows? Für diejenigen, die fork() nicht kennen: Was ist fork()? fork() erzeugt einen neuen Prozess. Entweder einen neuen Prozess des aufrufenden Programms. Ohne weitere Parameter wird der dann auch an der gleichen Stelle im Programm fortgeführt. Oder man lädt nach dem fork() einen anderen Programmteil, welcher dann ausgeführt wird. Unter Windows nutzt man Threads - die es natürlich unter Linux ebenfalls gibt. Aber: Warum braucht Windows kein fork()? Warum braucht man unter Linux ein fork()? Gibt es unter Windows ein Äquvivalent?(Damit mein ich kein "Workaround" a la "Cygwin nutzen") ;) |
AW: Äquivalent zu fork() unter Windows?
Da Windows seit Win2000 das POSIX Prozessmodell nicht mehr unterstützt, gibt es keinen 100% Pendant zu fork()
|
AW: Äquivalent zu fork() unter Windows?
Zitat:
Andererseits ist der neue Kindprozess eben ein eigenständiger Prozess mit allem was dazu gehört. Die Prozesse können abstürzen ohne den anderen zu beeinflussen. |
AW: Äquivalent zu fork() unter Windows?
Aber wenn fork() eine Technik ist mit der man so viel erreichen kann, warum schmeisst man sie einfach so aus dem System?
Bzw. durch welche Technik wurde sie ersetzt? Reines Threading? |
AW: Äquivalent zu fork() unter Windows?
Threading ist resourcenschonender und schneller beim Wechseln. fork() wurde afaik vor 40 Jahren erfunden, was nicht per se gegen diese Funktion spricht. Aber eben auch nicht für sie.
|
AW: Äquivalent zu fork() unter Windows?
Sie scheint mir schlicht nicht notwendig zu sein. Ich bin bis heute auch prima ohne sie ausgekommen (auch wenn ich mir durchaus Einsätze vorstellen kann). Zudem ist es gut möglich, dass unter Windows dafür einige heftige Verränkungen gebraucht würden, die das OS prinzipbedingt nicht oder nur sehr unperformant/"hacky" her gibt. Gerade das copy-on-write Verhalten kann ich mit im virtuellen Speicher von Windows als echte Aufgabe vorstellen. Wenn es unabdingbar wäre, hätten die Entwickler der Welt MS sicherlich schon dort hin getrieben. Das Thread-Modell scheint hier aber alle Wünsche zu erfüllen, und ist seit der NT-Linie fester und bewährter Bestandteil.
(Man entschuldige meine Ignoranz, aber wenn ich nicht irre wurden Threads in Linux hingegen erst eingeführt, nach dem es Leute in der Windows-Welt als für doch echt ziemlich praktisch befunden hatten. IMHO kannte Linux lange keine Threads in diesem Sinne. Daher würde für mich anders herum ein Schuh draus. Das in Klammern hier basiert jedoch auf Halbwissen.) Dennoch wüsste ich aktuell nicht, was ich mit Forks machen könnte, was ich nicht mindestens ähnlich komfortabel mit Threads (oder eben wirklich multiplen Prozessinstanzen) nicht auch erledigen könnte. |
AW: Äquivalent zu fork() unter Windows?
Zitat:
Meiner Meinung nach passen Threads und fork als Konzept einfach nicht wirklich zueinander. Und es ist ja nicht nur die Frage, wie mit Threads beim forken umgegangen wird, sondern auch mit anderen ![]() Ich halte fork (auch heute) für ein interessantes Konzept, insbesondere weil man effizient und ziemlich einfach Speicher mit komplexen Datentypen teilen kann und Trennung in unterschiedliche Addressräume hat. Das Nächste was in diese Richtung gehen würde, wäre Rumgebastel mit Memory Mapped Files. Aber die meisten Anwendungen sind mit Threads wohl sehr viel besser bedient. |
AW: Äquivalent zu fork() unter Windows?
Zitat:
Und die API Funktion, um die es hier speziell geht, ist NtCreateProcess (welche auch intern von CreateProcess verwendet wird, aber hier wird noch etwas mehr Verwaltungsaufwand betrieben). Die Deklaration schaut so aus:
Code:
Der wichtigste Parameter im Zusammenhang mit fork() ist SectionHandle. Möchte man einen neuen Prozess basierend auf einer anderen Executable starten, so gibt man hier das Handle zur gemappten Executable an. Lässt man das jedoch weg, so forkt der Kernel den bei ParentProcess angegebenen Prozess. Im Win32 Subsystem muss man hier jetzt jedoch noch ein paar weitere Dinge machen (so muss man dem Subsystem den neuen Prozess von Hand bekannt machen, damit kernel32.dll, etc. für den neuen Prozess korrekt funktionieren). Seit Windows 2003 wird beim Forken übrigens auch eine Copy-On-Write Semantic für den Addressraum verwendet.
NTSYSAPI
NTSTATUS NTAPI NtCreateProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN HANDLE ParentProcess, IN BOOLEAN InheritObjectTable, IN HANDLE SectionHandle OPTIONAL, IN HANDLE DebugPort OPTIONAL, IN HANDLE ExceptionPort OPTIONAL ); Falls jemand näheres hierzu wissen möchte, der sollte sich das Buch ![]() Gruß, Sven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz