it-swarm.com.de

Forking vs Threading

Ich habe Threading bereits in meinen Anwendungen verwendet und kenne seine Konzepte gut, aber kürzlich bin ich in meinem Betriebssystemvortrag auf fork () gestoßen. Welches ist so etwas wie Threading.

Ich suchte den Unterschied zwischen ihnen und ich erfuhr, dass:

  1. Fork ist nichts anderes als ein neuer Prozess, der genauso aussieht wie der alte oder der übergeordnete Prozess, es ist jedoch ein anderer Prozess mit einer anderen Prozess-ID und einem eigenen Speicher.
  2. Threads sind leichte Prozesse, die weniger Overhead haben

Aber ich habe noch einige Fragen.

  1. Wann sollten Sie fork () gegenüber threading und umgekehrt bevorzugen?
  2. Wenn ich als Kind eine externe Anwendung aufrufen möchte, sollte ich dann fork () oder threads verwenden, um dies zu tun?
  3. Bei der Google-Suche habe ich Leute gefunden, die sagten, es sei schlecht, eine Fork () in einem Thread aufzurufen. Warum wollen Leute eine fork () innerhalb eines Threads aufrufen, wenn sie ähnliche Dinge tun?
  4. Stimmt es, dass fork () das Multiprozessorsystem nicht nutzen kann, weil übergeordnete und untergeordnete Prozesse nicht gleichzeitig ausgeführt werden?

Der Hauptunterschied zwischen Forking- und Threading-Ansätzen liegt in der Betriebssystemarchitektur. In den Tagen, in denen Unix entwickelt wurde, war Forking ein einfaches System, das die Anforderungen von Mainframes und Servertypen am besten erfüllte. Daher wurde es auf Unix-Systemen populär gemacht. Als Microsoft den NT-Kernel von Grund auf neu archivierte, konzentrierte es sich mehr auf das Threading-Modell. Daher gibt es heute immer noch einen bemerkenswerten Unterschied zwischen Unix-Systemen, die effizient mit Forking arbeiten, und Windows, das effizienter mit Threads arbeitet. Dies ist vor allem in Apache zu sehen, das die Prefork-Strategie unter Unix und das Thread-Pooling unter Windows verwendet.

Speziell zu Ihren Fragen:

Wann sollten Sie fork () gegenüber threading und umgekehrt bevorzugen?

Auf einem Unix-System, auf dem Sie eine weitaus komplexere Aufgabe ausführen, als nur einen Worker zu instanziieren, oder das implizite Sicherheits-Sandboxing von separaten Prozessen benötigen.

Wenn ich als Kind eine externe Anwendung aufrufen möchte, sollte ich dann fork () oder threads verwenden, um dies zu tun?

Wenn das Kind mit dem Elternteil eine identische Aufgabe mit identischem Code ausführt, verwenden Sie fork. Verwenden Sie für kleinere Unteraufgaben Threads. Verwenden Sie für separate externe Prozesse keines von beiden, rufen Sie sie einfach mit den richtigen API-Aufrufen auf.

Bei der Google-Suche habe ich Leute gefunden, die sagten, es sei schlecht, eine Fork () in einem Thread aufzurufen. Warum wollen Leute eine fork () innerhalb eines Threads aufrufen, wenn sie ähnliche Dinge tun?

Nicht ganz sicher, aber ich denke, es ist rechenintensiv, einen Prozess und viele Unterthreads zu duplizieren.

Stimmt es, dass fork () das Multiprozessorsystem nicht nutzen kann, weil übergeordnete und untergeordnete Prozesse nicht gleichzeitig ausgeführt werden?

Wenn dies falsch ist, erstellt fork einen neuen Prozess, der alle Funktionen nutzt, die den Prozessen im Taskplaner des Betriebssystems zur Verfügung stehen.

48

Ein gegabelter Prozess wird als schwerer Prozess bezeichnet, während ein Thread-Prozess als leichter Prozess bezeichnet wird.

Das Folgende ist der Unterschied zwischen ihnen:

  1. Ein gegabelter Prozess wird als untergeordneter Prozess betrachtet, während ein Thread-Prozess als Geschwisterprozess bezeichnet wird.
  2. Der Forked-Prozess teilt keine Ressourcen wie Code, Daten, Stapel usw. mit dem übergeordneten Prozess, wohingegen ein Threaded-Prozess Code gemeinsam nutzen kann, aber einen eigenen Stapel hat.
  3. Das Umschalten von Prozessen erfordert die Hilfe des Betriebssystems, das Umschalten von Threads ist jedoch nicht erforderlich
  4. Das Erstellen mehrerer Prozesse ist eine ressourcenintensive Aufgabe, während das Erstellen mehrerer Threads weniger ressourcenintensiv ist
  5. Jeder Prozess kann unabhängig ausgeführt werden, während ein Thread andere Threaddaten lesen/schreiben kann. Thread und Prozess Vorlesungenter image description here
26
Selvaperumal

Wie Sie bemerkt haben, erzeugt fork() eine neue Kopie des Prozesses. Was oben nicht erwähnt wurde, ist der exec() -Aufruf, der oft folgt. Dadurch wird der vorhandene Prozess durch einen neuen Prozess (eine neue ausführbare Datei) ersetzt. Daher ist fork()/exec() die Standardmethode zum Erstellen eines neuen Prozesses aus einem alten.

z.B. Auf diese Weise ruft Ihre Shell einen Prozess über die Befehlszeile auf. Sie geben Ihren Prozess (z. B. ls) und die Shell-Forks an und führen dann ls aus.

Beachten Sie, dass dies auf einer ganz anderen Ebene als das Threading funktioniert. Beim Threading werden mehrere Ausführungszeilen prozessintern ausgeführt. Gabelung ist ein Mittel, um neue Prozesse zu erstellen.

12
Brian Agnew