GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was sind Linux-Prozesse, -Threads, leichte Prozesse und Prozessstatus?

Linux hat sich seit seiner Einführung stark weiterentwickelt. Es ist zum am weitesten verbreiteten Betriebssystem geworden, wenn es um Server und unternehmenskritische Arbeiten geht. Obwohl es nicht einfach ist, Linux als Ganzes zu verstehen, gibt es Aspekte, die für Linux grundlegend sind und es wert sind, verstanden zu werden.

In diesem Artikel werden wir über Linux-Prozesse, Threads und leichte Prozesse diskutieren und den Unterschied zwischen ihnen verstehen. Gegen Ende werden wir auch verschiedene Zustände für Linux-Prozesse besprechen.

Linux-Prozesse

In einer sehr einfachen Form kann ein Linux-Prozess als laufende Instanz eines Programms visualisiert werden. Öffnen Sie zum Beispiel einfach einen Texteditor auf Ihrer Linux-Box und ein Texteditorprozess wird geboren.

Hier ist ein Beispiel, als ich gedit auf meinem Rechner geöffnet habe:

$ gedit &
[1] 5560

$ ps -aef | grep gedit
1000      5560  2684  9 17:34 pts/0    00:00:00 gedit

Der erste Befehl (gedit &) öffnet das Gedit-Fenster, während der zweite ps-Befehl (ps -aef | grep gedit) prüft, ob ein zugehöriger Prozess vorhanden ist. Im Ergebnis sehen Sie, dass ein Prozess mit gedit verknüpft ist.

Prozesse sind für Linux von grundlegender Bedeutung, da jede vom Betriebssystem ausgeführte Arbeit in Bezug auf und durch die Prozesse ausgeführt wird. Denken Sie einfach an irgendetwas und Sie werden sehen, dass es ein Prozess ist. Dies liegt daran, dass jede Arbeit, die ausgeführt werden soll, Systemressourcen erfordert (die vom Kernel bereitgestellt werden) und es sich um einen Prozess handelt, der vom Kernel als eine Entität betrachtet wird, der er Systemressourcen zur Verfügung stellen kann.

Prozesse haben Priorität basierend darauf, welcher Kernelkontext sie umschaltet. Ein Prozess kann vorgezogen werden, wenn ein Prozess mit höherer Priorität zur Ausführung bereit ist.

Wenn beispielsweise ein Prozess auf eine Systemressource wartet, wie z. B. Text aus einer Textdatei, die auf der Festplatte gespeichert ist, kann der Kernel einen Prozess mit höherer Priorität planen und zum wartenden Prozess zurückkehren, wenn Daten verfügbar sind. Dies hält den Ball für ein Betriebssystem als Ganzes am Laufen und gibt dem Benutzer das Gefühl, dass Aufgaben parallel ausgeführt werden.

Prozesse können mithilfe von Kommunikationsmethoden zwischen Prozessen mit anderen Prozessen kommunizieren und Daten mithilfe von Techniken wie Shared Memory gemeinsam nutzen.

Unter Linux wird fork() verwendet, um neue Prozesse zu erstellen. Diese neuen Prozesse werden als untergeordnete Prozesse bezeichnet, und jeder untergeordnete Prozess teilt zunächst alle Segmente wie Text, Stack, Heap usw., bis das Kind versucht, Änderungen am Stack oder Heap vorzunehmen. Im Falle einer Änderung wird eine separate Kopie der Stack- und Heap-Segmente für das Kind vorbereitet, so dass die Änderungen kindspezifisch bleiben. Das Textsegment ist schreibgeschützt, sodass Eltern und Kind dasselbe Textsegment verwenden. Der Artikel zur C-Fork-Funktion erklärt mehr über fork().

Linux-Threads vs. leichtgewichtige Prozesse

Threads in Linux sind nichts anderes als ein Ablauf der Ausführung des Prozesses. Ein Prozess, der mehrere Ausführungsabläufe enthält, wird als Multithread-Prozess bezeichnet.

Für einen Nicht-Multithread-Prozess gibt es nur einen Ausführungsfluss, der der Hauptausführungsfluss ist, und wird daher auch als Single-Threaded-Prozess bezeichnet. Für den Linux-Kernel gibt es kein Thread-Konzept. Jeder Thread wird vom Kernel als separater Prozess betrachtet, aber diese Prozesse unterscheiden sich etwas von anderen normalen Prozessen. Ich werde den Unterschied in den folgenden Absätzen erläutern.

Fäden werden oft mit dem Begriff Light Weight Processes oder LWPs vermischt. Der Grund geht auf die Zeiten zurück, als Linux Threads nur auf Benutzerebene unterstützte. Das bedeutet, dass selbst eine Multithread-Anwendung vom Kernel nur als ein einziger Prozess betrachtet wurde. Dies stellte die Bibliothek, die diese Threads auf Benutzerebene verwaltete, vor große Herausforderungen, da sie sich um Fälle kümmern musste, die eine Thread-Ausführung nicht behinderte, wenn irgendein anderer Thread einen blockierenden Aufruf ausgab.

Später wurde die Implementierung geändert und jedem Thread wurden Prozesse hinzugefügt, damit der Kernel sich darum kümmern kann. Aber wie bereits erwähnt, sieht der Linux-Kernel sie nicht als Threads, jeder Thread wird als ein Prozess innerhalb des Kernels betrachtet. Diese Prozesse sind als leichtgewichtige Prozesse bekannt.

Der Hauptunterschied zwischen einem leichten Prozess (LWP) und einem normalen Prozess besteht darin, dass LWPs denselben Adressraum und andere Ressourcen wie offene Dateien usw. gemeinsam nutzen. Da einige Ressourcen gemeinsam genutzt werden, werden diese Prozesse im Vergleich zu anderen normalen Prozessen als leichtgewichtig betrachtet und daher der Name leichte Prozesse.

Wir können also effektiv sagen, dass Threads und leichte Prozesse gleich sind. Es ist nur so, dass Thread ein Begriff ist, der auf Benutzerebene verwendet wird, während leichter Prozess ein Begriff ist, der auf Kernel-Ebene verwendet wird.

Aus Sicht der Implementierung werden Threads mit Funktionen erstellt, die von der POSIX-kompatiblen pthread-Bibliothek in Linux verfügbar gemacht werden. Intern wird die Funktion clone() verwendet, um sowohl einen normalen als auch einen leichtgewichtigen Prozess zu erstellen. Dies bedeutet, dass zum Erstellen eines normalen Prozesses fork() verwendet wird, der außerdem clone() mit geeigneten Argumenten aufruft, während zum Erstellen eines Threads oder LWP eine Funktion aus der pthread-Bibliothek clone() mit relevanten Flags aufruft. Der Hauptunterschied wird also durch die Verwendung verschiedener Flags erzeugt, die an die Funktion clone() übergeben werden können.

Lesen Sie mehr über fork() und clone() auf ihren jeweiligen Manpages.

How to Create Threads in Linux erklärt mehr über Threads.

Linux-Prozesszustände

Der Lebenszyklus eines normalen Linux-Prozesses scheint dem wirklichen Leben ziemlich ähnlich zu sein. Prozesse werden geboren, teilen Ressourcen für einige Zeit mit den Eltern, erhalten ihre eigene Kopie der Ressourcen, wenn sie bereit sind, Änderungen vorzunehmen, durchlaufen je nach Priorität verschiedene Zustände und sterben schließlich. In diesem Abschnitt werden verschiedene Zustände von Linux-Prozessen besprochen:

  • RUNNING – Dieser Status gibt an, dass der Prozess entweder ausgeführt wird oder darauf wartet, ausgeführt zu werden.
  • UNTERBRECHBAR – Dieser Zustand gibt an, dass der Prozess darauf wartet, unterbrochen zu werden, da er sich im Schlafmodus befindet, und auf eine Aktion wartet, die diesen Prozess aufwecken kann. Die Aktion kann ein Hardware-Interrupt, ein Signal usw. sein.
  • UN-INTERRUPTIBLE – Es ist genau wie der INTERRUPTIBLE-Zustand, der einzige Unterschied besteht darin, dass ein Prozess in diesem Zustand nicht durch Senden eines Signals aufgeweckt werden kann.
  • STOPPED – Dieser Status gibt an, dass der Prozess gestoppt wurde. Dies kann passieren, wenn ein Signal wie SIGSTOP, SIGTTIN usw. an den Prozess geliefert wird.
  • TRACED – Dieser Status gibt an, dass der Prozess debuggt wird. Immer wenn der Prozess vom Debugger angehalten wird (um dem Benutzer beim Debuggen des Codes zu helfen), wechselt der Prozess in diesen Zustand.
  • ZOMBIE – Dieser Zustand gibt an, dass der Prozess beendet ist, aber immer noch in der Kernel-Prozesstabelle herumhängt, da der Elternteil dieses Prozesses den Beendigungsstatus dieses Prozesses noch nicht abgerufen hat. Parent verwendet die Wait()-Familie von Funktionen, um den Beendigungsstatus abzurufen.
  • DEAD – Dieser Zustand gibt an, dass der Prozess beendet ist und der Eintrag aus der Prozesstabelle entfernt wurde. Dieser Zustand wird erreicht, wenn der Elternteil erfolgreich den Beendigungsstatus abruft, wie im ZOMBIE-Zustand erklärt.

Linux
  1. Linux:Finde und töte Zombie-Prozesse

  2. In welchen Sprachen sind Windows, Mac OS X und Linux geschrieben?

  3. Welche Zeichen sind in Windows- und Linux-Verzeichnisnamen verboten?

  4. Was sind diese Windows-Prozesse unter Linux?

  5. Was sind High Memory und Low Memory unter Linux?

Was sind Snaps und wie wird es auf verschiedenen Linux-Distributionen installiert?

Was sind Linux-Protokolle und wo sind sie zu finden?

Prozessüberwachung unter Linux

Meistern Sie den Linux-Kill-Prozess mit ps, pgrep, pkill und mehr

Linux-Prozesse – Speicherlayout, Exit und _exit C-Funktionen

So beenden Sie Prozesse in Linux mit kill, killall und pkill