Wo programmiert es sich am komfortabelsten?
-
Jap, ich hab grad etwas drüber nachgedacht und muss zugeben, dass es doch gar nicht sooo verkehrt ist wie ich immer gedacht hab...ich hatte nur einmal das Vergnüngen, fork() und exec() selbst zu implementieren und seit damals fühlte sich beides für mich irgendwie so falsch an, weil fork() und exec() für mich bedeutet: Page Directory kopieren, Handles duplizieren und haufenweise anderen Kram, nur um das alles dann gleich wieder wegzuwerfen...
-
dot schrieb:
Jap, ich hab grad etwas drüber nachgedacht und muss zugeben, dass es doch gar nicht sooo verkehrt ist wie ich immer gedacht hab...ich hatte nur einmal das Vergnüngen, fork() und exec() selbst zu implementieren und seit damals fühlte sich beides für mich irgendwie so falsch an, weil fork() und exec() für mich bedeutet: Page Directory kopieren, Handles duplizieren und haufenweise anderen Kram, nur um das alles dann gleich wieder wegzuwerfen...
fork ist unter Linux nicht teuer, wenn du gleich danach exec aufrust:
Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
-
Steffo schrieb:
fork ist unter Linux nicht teuer, wenn du gleich danach exec aufrust:
Das ist mir natürlich bewusst. Das Page Directory muss aber dennoch (potentiell unnötigerweise) kopiert werden, auch wenn man nicht sofort die Pages kopiert.
fork() und CreateProcess() sind imo jedenfalls zwei fundamental unterschiedliche Dinge, die jeweils eigene Syscalls sein sollten. Weder sind fork() und exec() elementare Operationen in einem CreateProcess(), noch umgekehrt. fork() und exec() ist imo lediglich eine Approximation eines CreateProcess(), aber eben nicht völlig äquivalent.
-
Eben das Duplizieren der Daten fand ich auch schon immer falsch, obwohl es durch Kopieren bei Bedarf immerhin nicht ganz so schlimm ist wie es ohne wäre. Trotzdem frage ich mich, wie man damals auf die Idee kam, es wäre besser den gesamten Prozess zu Klonen statt einen neuen aufzusetzen. (Irgendwo habe ich auch mal etwas darüber gelesen, aber das weiß ich nicht mehr)
Für mich ist gerade das Anlegen eines neuen Prozesses ein Teil des Kopierens eines Prozesses, also wenn schon, müsste man meiner Meinung nach eher CreateProcess den Vorzug geben.
-
fork ohne execve ist natürlich sinnvoll. Mehrere Prozesse sind deutlich schöner zu benutzen als Threads. Man hat nicht den Sharedstate-Blödsinn, man kann sie killen und sie reißen nicht die ganze Anwendung mit, wenn mal einer ausrastet. Wenn man eh nur ein execve machen will, dann kann man einfach vfork nehmen und der Pagetable wird nicht kopiert.
-
die jeweils eigene Syscalls sein sollten.
Linux Kernel 2.6: http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html , syscall 2 und 11.
Weder sind fork() und exec() elementare Operationen in einem CreateProcess()
Darum geht es nicht.
fork
undexec
sind elementare Operationen in einer *nix-Umgebung.Approximation eines CreateProcess()
Nur in deinem Kopf. fork und exec wollen nicht CreateProcess von Windows nachahmen.
-
rüdiger schrieb:
Wenn man eh nur ein execve machen will, dann kann man einfach vfork nehmen und der Pagetable wird nicht kopiert.
-
Ich bin beeindruckt, zwei Funktionen sind das wichtigste für die Entscheidung, ob die eine Plattform komfortabler als die Andere.
-
rüdiger schrieb:
Wenn man eh nur ein execve machen will, dann kann man einfach vfork nehmen und der Pagetable wird nicht kopiert.
http://tldp.org/HOWTO/Secure-Programs-HOWTO/avoid-vfork.html
http://www.unixguide.net/unix/programming/1.1.2.shtmlknivil schrieb:
die jeweils eigene Syscalls sein sollten.
Linux Kernel 2.6: http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html , syscall 2 und 11.
Du hast da was falsch verstanden, was ich sagen wollte war, dass es sowohl fork() als auch CreateProcess() als eigenen Syscall geben sollte, da keine der beiden Funktionen die jeweils andere ersetzen kann.
knivil schrieb:
Weder sind fork() und exec() elementare Operationen in einem CreateProcess()
Darum geht es nicht.
fork
undexec
sind elementare Operationen in einer *nix-Umgebung.Ja, aber fork() gefolgt von exec() ist eben semantisch etwas anderes als CreateProcess(), auch wenn das Ergebnis eine gute Approximation ist. Aber anstatt eben einen entsprechenden Syscall einzuführen, baut man Hacks wie vfork()...
knivil schrieb:
Approximation eines CreateProcess()
Nur in deinem Kopf. fork und exec wollen nicht CreateProcess von Windows nachahmen.
Das hab ich auch nicht behauptet. Nochmal: Was ich sagen wollte ist, dass fork() gefolgt von exec() imo keine besonders tolle Lösung für das Erzeugen eines neuen Prozesse mit einem anderen Image ist. Ich habe kein Problem mit fork() an sich.
-
dot schrieb:
rüdiger schrieb:
Wenn man eh nur ein execve machen will, dann kann man einfach vfork nehmen und der Pagetable wird nicht kopiert.
http://tldp.org/HOWTO/Secure-Programs-HOWTO/avoid-vfork.html
http://www.unixguide.net/unix/programming/1.1.2.shtmlLinux 2.2 ist doch Steinalt (10 Jahre+). Wen interessiert es also noch, dass es auf ungepatchten Linux 2.2 Systemen eine Racecondition geben kann? Wenn man wirklich für so ein altes System etwas programmieren will, dann muss man da eben vorsichtig sein.