Linux system call für die Erstellung von Prozess-und thread
Las ich in einem Papier, dass das zugrunde liegende system-Aufruf zum erstellen von Prozessen und threads ist eigentlich die gleiche, und damit die Kosten für die Erstellung Prozesse über die threads nicht so toll.
- Erste, ich will wissen, was ist der Systemaufruf erzeugt
Prozesse/threads (eventuell einen Beispielcode oder einen link?) - Zweite, ist
der Autor richtig, anzunehmen, dass die Schaffung Prozesse statt
threads ist günstig?
EDIT:
Zitiere Artikel:
Ersetzen pthreads mit Prozessen ist erstaunlich günstig,
vor allem unter Linux, wo sowohl pthreads und Prozesse aufgerufen werden
mit der gleichen zugrunde liegenden system nennen.
- erstellen von Prozessen statt threads? Nein. In Allgemeinen threads sind leichtgewichtige Prozesse. Aber die Linie ist etwas unscharf, weil Dinge wie copy-on-write.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prozesse sind in der Regel erstellt mit
fork
threads (leichtgewichtige Prozesse) sind in der Regel erstellt mitclone
heute. Allerdings anecdotically, gibt es 1:N thread-Modelle, auch die, die nicht tun, entweder.Beide
fork
undclone
Karte, um die gleiche kernel-Funktiondo_fork
intern. Diese Funktion kann erstellen Sie einen einfachen Prozess teilt Adressraum mit dem alten oder einem separaten Prozess (und viele andere Optionen), je nachdem, welche flags, die Sie füttern, um es. Dieclone
syscall ist mehr oder weniger eine direkte Weiterleitung von kernel-Funktion (und durch die höhere Ebene threading-Bibliotheken) in der Erwägung, dassfork
wrapsdo_fork
in die Funktionalität der 50 Jahre alte traditionelle Unix-Funktion.Der wichtige Unterschied ist, dass
fork
garantiert, dass eine vollständige, unabhängige Kopie der Adressraum aus. Dies ist, wie Basil Punkte richtig, ist fertig mit copy-on-write heutzutage und ist daher bei weitem nicht so teuer wie man denken würde.Wenn du einen thread erstellst, es ist nur nutzt die original-Adressraum und dem gleichen Speicher.
Allerdings sollte man nicht davon ausgehen, dass die Erstellung von Prozessen ist im Allgemeinen "leicht" auf unix-ähnlichen Systemen, weil der copy-on-write. Es ist etwas weniger schwer als zum Beispiel unter Windows, aber es ist nirgends in der Nähe frei.
Ein Grund dafür ist, dass, obwohl die eigentlichen Seiten nicht kopiert werden, das neue Verfahren muss noch eine Kopie von der Seite der Tabelle. Dies kann einige Kilobyte zu Megabyte Speicher für Prozesse, die größere Mengen von Speicher.
Ein weiterer Grund ist, dass, obwohl copy-on-write ist die unsichtbare und clevere Optimierung, es ist nicht kostenlos, und es kann nicht zaubern. Wenn Daten geändert werden, entweder durch das Verfahren, was zwangsläufig geschieht, sind die betroffenen Seiten Schuld.
Redis ist ein gutes Beispiel, wo man sehen kann, dass
fork
ist alles andere als leicht (es verwendetfork
zu tun hintergrund speichert).do_fork
überhaupt. Sie wollen wahrscheinlich nicht zu verwendenclone
im Allgemeinen (es wird empfohlen, die Verwendung der pthreads-Bibliothek drauf gebaut statt). Trotzdem, im Falle Sie wollen zu verwendenclone
sind, ist die Dokumentation hier. Jetztfork
auf der anderen Seite, ist etwas, das können Sie realistisch verwenden möchten, die docs sind auf der selben Seite.fork
undpthread_create
. Aber ich kann nicht finden, alle Anrufedo_fork
.Dem zugrunde liegenden system-Aufruf zum erstellen von threads ist clone(2) (es ist Linux-spezifisch). BTW, die Liste der Linux-Systemaufrufe auf syscalls(2), und Sie konnte die strace(1) Befehl zu verstehen, der Aufrufe erfolgt durch einen Prozess oder ein Befehl. Prozesse sind in der Regel erstellt mit Gabel(2) (oder vfork(2), was nicht viel ist nützlich, in diesen Tagen). Jedoch, man könnte (und einige C-standard-Bibliotheken möglicherweise tun) erstellen Sie mit einigen besonderen form
clone
. Ich denke mal, dass die kernel-sharing-code zu implementierenclone
,fork
etc... (da einige Funktionen, z.B. das management der virtual address space, sind üblich).In der Tat, der Prozess der Schöpfung (und auch thread-Erstellung) ist in der Regel Recht schnell auf den meisten Unix-Systemen (weil Sie copy-on-write Maschinen für die virtueller Speicher), in der Regel einen Bruchteil von einer Millisekunde. Aber man konnte pathologischen Fällen (z.B. Prügel), die macht, dass viel mehr.
Da die meisten C-standard-Bibliothek Implementierungen sind freie software auf Linux, die Sie studieren könnten, den source-code auf Ihrem system (oft GNU-glibc, aber manchmal musl-libc oder etwas anderes).
fork
umgesetzt werden könnte, mitclone
(aber vordatiert es von Dutzend Jahre).Wenn Sie C hier sind einige der Dinge, die Ihnen helfen könnten:
Gabel - Für die Erstellung von Prozess: http://en.wikipedia.org/wiki/Fork_(Betriebssystem)
Pthreads-Bibliothek für Gewinde: http://en.wikipedia.org/wiki/POSIX_Threads
Wenn Sie in C++, Sie können check out Boost-Threads-Bibliothek für threading.
Ein klassisches Beispiel wo multi-Prozess-Technologie wurde als besser geeignet als multi-threaded ist Google-Chrome-Browser.