Linux-Kernel: Task vs. Thread

Linux-Kernel: Task vs. Thread

Als ich ein Buch las (Linux-Kernel-Programmierung), stieß ich auf einen interessanten/verwirrenden Absatz über mm_segment_t addr_limit(eines der Mitglieder in struct_task), wie unten gezeigt:

mm_segment_t Adresslimit;
Im Gegensatz zu den älteren Kerneln können sich seit 2.4 auch Tasks (Threads) innerhalb des Kernels befinden. Diese können auf einen größeren Adressraum zugreifen als Tasks im Userspace.adr_limitbeschreibt den Adressraum, auf den über den Kernel der Task zugegriffen werden kann.

Fragen:

  1. Im ersten Punkt heißt es "(Aufgaben) Threadskann auch seininnerhalb des Kernels" ist da. Was bedeutet das? Befinden sich Threads nicht notwendigerweise innerhalb des Kernels?

  2. Im zweiten Satz:Diesekönnen auf einen größeren Adressraum zugreifen als Tasks im Userspace." Ich verstehe nicht, wasdiesebedeutet das? Wenn er von Threads spricht, wie können Threads dann einen größeren Adressraum haben als Tasks?

Antwort1

Der Ausdruck "innerhalb des Kernels" bezieht sich wahrscheinlich aufKernel-Threadsdie vom Kernel selbst für Arbeiten verwendet werden, die asynchron ausgeführt werden können. Sie können Beispiele dieser Threads in Ihrem Prozessbaum sehen:

# ps aux | grep '\[.*\]$' | head
root         2  0.0  0.0      0     0 ?        S    May05   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    May05   0:03 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/u:0]
root         6  0.0  0.0      0     0 ?        S    May05   0:00 [migration/0]
root         7  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/0]
root         8  0.0  0.0      0     0 ?        S    May05   0:00 [migration/1]
root         9  0.0  0.0      0     0 ?        S    May05   0:00 [kworker/1:0]
root        10  0.0  0.0      0     0 ?        S    May05   0:02 [ksoftirqd/1]
root        11  0.0  0.0      0     0 ?        S    May05   0:00 [watchdog/1]

Solche Threads werden durch Kernelcode erstellt, der kthread_create() aufruft. Diese Threads werden im Kernelmodus ausgeführt und führen verschiedene Aufgaben aus, die Sie vom Kernel erwarten.

„Aufgaben im Benutzerbereich“ hingegen stellen Threads oder Prozesse dar, wie Sie sie normalerweise kennen, die über fork+exec oder pthread_create erstellt wurden. Diese laufen im Benutzermodus und führen Systemaufrufe durch, wenn sie Dienste vom Kernel benötigen. Die Formulierung ist dort etwas seltsam, da der Kernel diese Aufgaben natürlich kennt und Informationen (wie struct_task) über sie verwaltet, sodass er Zeit für sie auf der CPU einplanen kann.

Zu (2): Das „diese“ bezieht sich speziell auf „Kernel-Threads“. Ich glaube, dass Kernel-Threads denselben Adressraum wie der Kernel nutzen.

verwandte Informationen