Aus Mauerers Linux-Kernel-Architektur,
Kernel-Threads sind Prozesse, die direkt vom Kernel selbst gestartet werden. Sie delegieren eine Kernelfunktion an einen separaten Prozess und führen sie dort parallel zu den anderen Prozessen im System aus (und tatsächlich parallel zur Ausführung des Kernels selbst). Kernel-Threads werden häufig als (Kernel-) Daemons bezeichnet . Sie werden beispielsweise verwendet, um folgende Aufgaben auszuführen:
- Zum regelmäßigen Synchronisieren geänderter Speicherseiten mit dem Blockgerät, von dem die Seiten stammen (z. B. Dateien, die mit mmap zugeordnet wurden).
- Zum Schreiben von Speicherseiten in den Auslagerungsbereich, wenn diese selten verwendet werden.
- Zurückgestellte Aktionen verwalten.
- So implementieren Sie Transaktionsjournale für Dateisysteme.
Grundsätzlich gibt es zwei Arten von Kernel-Threads:
- Typ 1 - Der Thread wird gestartet und wartet, bis er vom Kernel aufgefordert wird, eine bestimmte Aktion auszuführen.
- Typ 2 - Nach dem Start wird der Thread in regelmäßigen Abständen ausgeführt, überprüft die Auslastung einer bestimmten Ressource und ergreift Maßnahmen, wenn die Auslastung einen festgelegten Grenzwert überschreitet oder unterschreitet. Der Kernel verwendet diesen Thread-Typ für kontinuierliche Überwachungsaufgaben.
Da Mauerers Buch besagt, dass Kernel-Threads Prozesse sind, denke ich, dass sie im Benutzermodus statt im Kernel-Modus ausgeführt werden müssen. (Oder irre ich mich? Kann ein Prozess entweder im Benutzermodus oder im Kernelmodus zu unterschiedlichen Zeiten oder nur in einem Modus ausgeführt werden?)
Laut Bovets Understanding Linux Kernel werden Kernel-Threads nur im Kernel-Modus ausgeführt (siehe Zitat unten). Sind die Konzepte des "Kernel-Threads" in den beiden Büchern dasselbe Konzept?
Herkömmliche Unix-Systeme delegieren einige wichtige Aufgaben an zeitweise ausgeführte Prozesse, z. B. das Leeren von Festplatten-Caches, das Austauschen nicht verwendeter Seiten, das Warten von Netzwerkverbindungen usw. In der Tat ist es nicht effizient, diese Aufgaben streng linear auszuführen. Sowohl ihre Funktionen als auch die Endbenutzerprozesse erhalten eine bessere Reaktion, wenn sie im Hintergrund geplant werden. Da einige der Systemprozesse nur im Kernelmodus ausgeführt werden , delegieren moderne Betriebssysteme ihre Funktionen an Kernel-Threads , die nicht mit dem unnötigen Benutzermodus-Kontext belastet sind. Unter Linux unterscheiden sich Kernel-Threads in folgenden Punkten von regulären Prozessen:
- Kernel-Threads werden nur im Kernel-Modus ausgeführt, während reguläre Prozesse abwechselnd im Kernel-Modus und im Benutzermodus ausgeführt werden.
- Da Kernel-Threads nur im Kernel-Modus ausgeführt werden, verwenden sie nur lineare Adressen, die größer als PAGE_OFFSET sind. Bei regulären Prozessen werden dagegen alle vier Gigabyte linearer Adressen entweder im Benutzermodus oder im Kernelmodus verwendet.
Mauerers Buch besagt, dass Kernel-Threads direkt vom Kernel gestartet werden, und es scheint auch zu sagen, dass Daemons Synonyme für Kernel-Threads sind. Ich denke also, Daemons müssen direkt vom Kernel gestartet werden.
Aber https://unix.stackexchange.com/a/193918/674 sagt , dass
screen
‚s - Daemon durch gestartetscreen
Benutzeroberfläche (siehe Zitat unten). Ich denke, diescreen
Benutzeroberfläche ist ein Prozess anstelle des Kernels. Sind die Konzeptedaemon
in Mauerers Buch und in der verknüpften Antwort dasselbe Konzept?Beim ersten Start starten
screen
Sie tatsächlich eine Benutzeroberfläche (UI), die standardmäßig einen Daemon (den Sitzungsmanager) erstellt.Wie verstehen Sie im Allgemeinen die Konzepte von "Kernel-Threads", "Process" und "Daemon", ihre Beziehungen und ihre Unterschiede?
Antworten:
Erstens: Guthaben geht an /programming/15983872/difference-between-user-level-and-kernel-supported-threads
Benutzer-Threads und Kernel-Threads sind genau gleich. (Sie können sehen, indem Sie in / proc / nachsehen, dass auch die Kernel-Threads vorhanden sind.)
Ein Benutzer-Thread ist ein Thread, der User-Space-Code ausführt. Es kann jedoch jederzeit in den Kernel-Space aufgerufen werden. Es wird immer noch als "Benutzer" -Thread betrachtet, obwohl Kernel-Code mit erhöhten Sicherheitsstufen ausgeführt wird.
Ein Kernel-Thread ist ein Thread, der nur Kernel-Code ausführt und keinem User-Space-Prozess zugeordnet ist. Diese sind wie "UNIX-Daemons", außer dass es sich nur um Kernel-Daemons handelt. Man könnte also sagen, dass der Kernel ein Multithread-Programm ist. Zum Beispiel gibt es einen Kernel-Thread für den Austausch. Dies zwingt alle Swap-Probleme dazu, in einen einzigen Stream "serialisiert" zu werden.
Wenn ein Benutzer-Thread etwas benötigt, ruft er den Kernel auf, der diesen Thread als schlafend markiert. Später findet der Swap-Thread die Daten, sodass der Benutzer-Thread als ausführbar markiert wird. Später kehrt der "Benutzer-Thread" vom Kernel zurück zum Benutzerland zurück, als wäre nichts passiert.
Tatsächlich beginnen alle Threads im Kernelraum, da die Operation clone () im Kernelraum stattfindet. (Und es gibt eine Menge Kernel-Accounting zu erledigen, bevor Sie zu einem neuen Prozess im Benutzerbereich zurückkehren können.)
quelle