Was ist ein Kernel-Thread?

Lesezeit: 4 Minuten

Benutzeravatar von tijin
tijin

Ich habe gerade mit der Codierung von Gerätetreibern begonnen und bin neu im Threading. Ich habe viele Dokumente durchgesehen, um eine Vorstellung von Threads zu bekommen. Ich habe noch einige Zweifel.

  1. Was ist ein Kernel-Thread?
  2. Wie unterscheidet es sich von Benutzer-Thread?
  3. in welcher Beziehung stehen die beiden Threads?
  4. Wie kann ich Kernel-Threads implementieren?
  5. Wo kann ich die Ausgabe der Implementierung sehen?

Kann mir jemand helfen? Vielen Dank.

  • Sie haben das gelesen, nehme ich an? en.wikipedia.org/wiki/Thread_(Computing) Das sollte zumindest einige deiner Fragen beantworten.

    – Bart

    28. Februar 2012 um 11:36 Uhr


  • Es gibt auch diese vorherige Antwort in einem ähnlichen Kontext.

    – Jogojapan

    28. Februar 2012 um 11:37 Uhr

Benutzeravatar von Mircea
Mircea

  1. Ein Kernel-Thread ist ein task_struct ohne Userspace-Komponenten.
  2. Neben dem Mangel an Benutzerraum hat es verschiedene Vorfahren (kthreadd Kernel-Thread anstelle des init process) und wird von einer reinen Kernel-API anstelle von Sequenzen von erstellt clone aus fork/exec Systemaufrufe.
  3. Zwei Kernel-Threads haben kthreadd als Elternteil. Abgesehen davon genießen Kernel-Threads die gleiche “Unabhängigkeit” voneinander wie Userspace-Prozesse.
  4. Verwenden Sie die kthread_run Funktion/Makro aus der kthread.h-Header Sie müssen höchstwahrscheinlich ein Kernelmodul schreiben, um diese Funktion aufzurufen, also sollten Sie einen Blick auf das werfen Linux-Gerätetreiber
  5. Wenn Sie sich auf die Textausgabe Ihrer Implementierung beziehen (via printk -Aufrufe), können Sie diese Ausgabe im Kernel-Protokoll mit Hilfe von sehen dmesg Befehl.

Benutzeravatar von Basile Starynkevitch
Basile Starynkevitch

Ein Kernel-Thread ist eine Kernel-Aufgabe, die nur im Kernel-Modus ausgeführt wird; es wurde normalerweise nicht von erstellt fork() oder clone() Systemaufrufe. Ein Beispiel ist kworker oder kswapd.

Sie sollten wahrscheinlich keine Kernel-Threads implementieren, wenn Sie nicht wissen, was sie sind.

Google gibt viele Seiten über Kernel-Threads, zB Freys Seite.

  • Nur zur Information task->mm für Kernel-Thread ist eigentlich NULL.

    – Ilya Matveychikov

    29. Februar 2012 um 18:39 Uhr

Benutzeravatar von Varun Sharma
Varun Sharma

Benutzer-Threads & Stack:

Jeder Thread hat seinen eigenen Stapel, so dass er seine eigenen lokalen Variablen verwenden kann, die gemeinsamen globalen Variablen des Threads, die Teil der .data- oder .bss-Abschnitte der ausführbaren Linux-Datei sind. Da Threads globale Variablen gemeinsam nutzen, verwenden wir Synchronisierungsmechanismen wie Mutex, wenn wir in Multi-Thread-Anwendungen auf globale Variablen zugreifen bzw. diese ändern möchten. Lokale Variablen sind Teil des Thread-Einzelstapels, sodass keine Synchronisierung erforderlich ist.

Kernel-Threads
Kernel-Threads sind aus der Notwendigkeit entstanden, Kernel-Code im Prozesskontext auszuführen. Kernel-Threads sind die Basis des Workqueue-Mechanismus. Im Wesentlichen ist ein Thread-Kernel ein Thread, der nur im Kernel-Modus läuft und keinen Benutzeradressraum oder andere Benutzerattribute hat.

Um einen Thread-Kernel zu erstellen, verwenden Sie kthread_create():

#include <linux/kthread.h>

structure task_struct *kthread_create(int (*threadfn)(void *data),
                                      void *data, const char namefmt[], ...);

Kernel-Threads & Stack:
Kernel-Threads werden verwendet, um Nachbearbeitungsaufgaben für den Kernel wie PDF-Flush-Threads, Workq-Threads usw. auszuführen. Kernel-Threads sind im Grunde nur neue Prozesse ohne Adressraum (können mit dem Clone()-Aufruf mit erforderlichen Flags erstellt werden), was bedeutet, dass sie nicht wechseln können zum Userspace. Kernel-Threads sind wie normale Prozesse planbar und präemptiv.

Kernel-Threads haben ihre eigenen Stacks, die sie verwenden, um lokale Informationen zu verwalten.

Mehr über Kernel-Stacks:-
https://www.kernel.org/doc/Documentation/x86/kernel-stacks

Per Johanssons Benutzeravatar
Per Johansson

Da Sie Kernel-Threads mit user[land] Threads, ich nehme an, du meinst so etwas wie das Folgende.

Die übliche Art, Threads heutzutage zu implementieren, besteht darin, dies im Kernel zu tun, sodass diese als “normale” Threads betrachtet werden können. Es ist jedoch auch möglich, dies im Userland zu tun, indem Signale wie SIGALRM verwendet werden, dessen Handler den aktuellen Prozessstatus (meistens Register) speichert und in einen anderen zuvor gespeicherten ändert. Mehrere Betriebssysteme nutzten dies als Möglichkeit, Threads zu implementieren, bevor sie die richtige Kernel-Thread-Unterstützung erhielten. Sie können schneller sein, da Sie nicht in den Kernelmodus wechseln müssen, aber in der Praxis sind sie verschwunden.

Es gibt auch kooperative Userland-Threads, bei denen ein Thread läuft, bis er eine spezielle Funktion (normalerweise yield genannt) aufruft, die dann auf ähnliche Weise wie bei SIGALRM oben zu einem anderen Thread wechselt. Der Vorteil hier ist, dass das Programm die vollständige Kontrolle hat, was nützlich sein kann, wenn Sie Zeitprobleme haben (z. B. ein Spiel). Sie müssen sich auch nicht viel um die Thread-Sicherheit kümmern. Der große Nachteil ist, dass immer nur ein Thread gleichzeitig laufen kann, und daher ist diese Methode jetzt auch ungewöhnlich, da Prozessoren mehrere Kerne haben.

Kernel-Threads sind im Kernel implementiert. Vielleicht meinten Sie, wie man sie benutzt? Der üblichste Weg ist anzurufen pthread_create.

1387170cookie-checkWas ist ein Kernel-Thread?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy