- Unter Linux sagen wir immer, der erste Prozess ist
init
(pid==1). Aber warum ist es nicht der Kernel (Startup), der das System einrichtet und deninit
Prozess erstellt? Ist der Kernel ein Prozess? - Wir wissen, dass alle Threads im Benutzerbereich auf den Init-Prozessen basieren. Was ist dann mit dem Scheduler und anderen Kernel-Sachen, wie der Speicherverwaltung?
Was mich grundsätzlich verwirrt, ist die Struktur des Kernels. Wenn es sich um einen Prozess handelt, ist es dann ein einzelner Prozess oder besteht er aus mehreren Prozessen?
Antwort1
Kurze Antworten:
- Nein, es ist kein Prozess
- Benutzer-Threads werden bei der Initialisierung nicht als Root verwendet.
Init ist nur der erste Prozess; es verwaltet keine Prozesse oder Threads. Es erstellt einige mithilfe der Kernel-Systemaufrufe fork() und exec.
Ich glaube, Sie haben eine vage Vorstellung davon, was ein Prozess ist. Es bedeutet nicht nur, ein bisschen Code auszuführen. Ja, der Kernel wird vor der Initialisierung ausgeführt (und sogar der Bootloader davor). Aber ein „Prozess“ hat eine spezifische Definition von:
- Läuft im Benutzerbereich
- Läuft mit einer Prozess-ID
- Viele Interaktionen müssen durch den Kernel gehen
- Alle Ressourcen müssen vom Kernel kommen
- Muss vom Kernel geplant werden
Sobald der Kernel initialisiert ist, führt er „init“ aus und startet dann alle anderen Prozesse, die seine Konfiguration vorgibt.
Was Nr. 2 betrifft, befinden sich alle Kernel-Sachen, nun ja, im Kernel. Stellen Sie sich den Kernel als einen großen Codebereich vor. Auch hier handelt es sich nicht um einen Prozess, sondern um einen großen Code-Blob. Teile des Kernels befassen sich mit der Speicherverwaltung, Teile mit der Planung von Teilen des Kernels (wie Treibern usw.) und Teile mit der Planung von Prozessen.
Antwort2
Der Kernel verhält sich eigentlich überhaupt nicht wie ein Prozess. Er wird nicht geplant, sondern läuft entweder im Auftrag eines Prozesses (sogenannter Prozesskontext oder Benutzerkontext) oder als Ergebnis einer Unterbrechung oder Ausnahme (sogenannter Unterbrechungskontext).
Das heißt, der Linux-Kernel erzeugt Kernel-Threads, um bestimmte Aufgaben auszuführen oder um zu vermeiden, dass etwas zu lange im Interrupt-Kontext ausgeführt wird (das ist, was der Thread ksoftirqd macht, um übermäßige Latenzen zu vermeiden, die z. B. zu Audioausfällen usw. führen könnten).
Sie können die Kernel-Threads in der Ausgabe des ps
Befehls sehen. Sie sind leicht zu identifizieren: Ihr Name steht in Klammern. Einige von ihnen führen eine Instanz pro CPU aus. Die CPU wird durch eine Nummer nach einem Schrägstrich identifiziert. [ksoftirqd/0] ist also die Instanz von ksoftirqd auf CPU 0.
Antwort3
Es gibt Konzepte in Mikrokerneln, bei denen verschiedene Teile des Kernels tatsächlich Prozesse sind, wobei der primäre Sentinel meist nur die IPC verwaltet.
Linux ist – ob gut oder schlecht – kein Mikrokernelsystem.
Antwort4
ninjalj schrieb: „Der Kernel verhält sich überhaupt nicht wie ein Prozess. Er wird nicht geplant.“
Nun, es gibt den Leerlaufprozess (im Grunde PID 0, obwohl dieser nirgends angezeigt wird), der geplant ist und sich fast immer in einem ausführbaren Zustand befindet.