2014-12-20 2 views
4

Это концептуальный вопрос.pthread vs. kthread в ядре Linux v2.6 +

В соответствии с этим post, pthread фактически реализуется с использованием системного вызова clone(). Таким образом, мы можем заключить, что есть поток ядра (или легкий процесс), поддерживающий pthread в пользовательском пространстве. Ядро известно о pthread и может планировать его как процесс.

Что касается KTHREAD, по Robert Love, kthreads также создаются с помощью системного вызова клон():

clone(CLONE_VM| CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0) 

Так и потоковой KTHREAD как вызов использовать клон(). Мой первый вопрос:

  1. Есть ли разница между этими двумя видами нитей?

Чтобы ответить на мой собственный вопрос, я прочитал:

Существенное различие между потоками ядра и нормальных процессов является то, что ядра потоки не имеют адресное пространство (на самом деле, их мм указатель нулевой).

Это один разница? Я имею в виду, что поток, созданный pthread_create(), разделяет адресное пространство с обычным процессом. Напротив, у kthread нет собственного адресного пространства. Это верно?

Что еще не так?

ответ

4

Наоборот, у kthread нет собственного адресного пространства. Это верно?

Да

нить созданный pthread_create() разделяет адресное пространство с нормальным процессом.

kernel: how to find all threads from a process's task_struct

Pthreads: pthread_create() используются в пользовательском пространстве, где несколько потоков внутри вашей доли приложения тот же адресное пространство процесса. Для этого вам необходимо связать свою программу с библиотекой pthread, чтобы использовать эту функцию. pthreads обеспечивает многопоточность на уровне приложения или в пользовательском пространстве. Внутри это переводится в клон(), который сопоставляет новый struct task_struct для каждого потока приложений.

kthreads: Некоторые примеры потоков ядра для промывки диска кэшей, обслуживание softirqs, промывка грязных буферов и т.д. Эти потоки выполняются только в пространстве ядра и не имеют доступ к виртуальной памяти в пространстве пользователя, и они используют только адрес памяти ядра после PAGE_OFFSET, поэтому поле current->mm в дескрипторе задачи всегда равно NULL. Внутренне это kernel_thread() api переводит в do_fork() внутри ядра. Нити ядра создаются асинхронно, либо запускается процесс init, либо загружаются некоторые модули ядра (например, файловая система).

Смежные вопросы