Являются ли потоки ядра Linux действительно процессами ядра?

19

Я читал во многих местах, что Linux создает поток ядра для каждого пользовательского потока в Java VM. (Я вижу, что термин «поток ядра» используется двумя различными способами:

  1. поток, созданный для работы ядра ОС и
  2. Поток, о котором ОС знает и планирует выполнять пользовательскую работу.

Я говорю о последнем типе.)

Является ли поток ядра тем же, что и процесс ядра, поскольку процессы Linux поддерживают разделенное пространство памяти между родительским и дочерним процессами или это действительно другая сущность?

Эллен Спертус
источник

Ответы:

23

Нет абсолютно никакой разницы между потоком и процессом в Linux. Если вы посмотрите на clone (2), вы увидите набор флагов, которые определяют, что является общим, а что нет, между потоками.

Классические процессы - это просто потоки, которые ничего не разделяют; Вы можете поделиться, какие компоненты вы хотите под Linux.

Это не относится к другим реализациям ОС, где есть гораздо более существенные различия.

Даниэль Питтман
источник
22

Документация может быть довольно запутанной, поэтому вот « настоящая » модель Linux:

  • внутри ядра Linux то, что может быть запущено (и запланировано), называется «процессом»,
  • каждый процесс имеет уникальный системный идентификатор процесса (PID) и идентификатор группы потоков (TGID),
  • «нормальный» процесс имеет PID = TGID, и никакой другой процесс не разделяет это значение TGID,
  • «многопоточный» процесс - это процесс, значение TGID которого совместно используется другими процессами,
  • несколько процессов, совместно использующих один и тот же TGID, также совместно используют, по крайней мере, одно и то же пространство памяти и обработчики сигналов (иногда больше),
  • если «многопоточный» процесс имеет PID = TGID, его можно назвать «основным потоком»,
  • вызов getpid()любого процесса вернет его TGID (= PID "основного потока"),
  • вызов gettid()любого процесса вернет его PID (!),
  • любой процесс может быть создан с помощью clone(2)системного вызова,
  • числовые имена папок, которые вы можете перечислить ls /procкак /proc/NUMBERTGID,
  • числовые имена папок в /proc/TGID/taskвиде /proc/TGID/task/NUMBERPID,
  • даже если вы не видите все существующие идентификаторы PID ls /proc, вы все равно можете их увидеть cd /proc/any_PID.

Вывод : с точки зрения ядра существуют только процессы, каждый из которых имеет свой уникальный PID, а так называемый поток - это просто другой тип процесса.

Примечание: реализация концепции «потока» в Linux привела к путанице в словарном запасе, и если getpid() обманывает вас , не делает то, что вы думали, это потому, что его поведение следует совместимости с POSIX (потоки должны иметь общий PID) ,

Totor
источник
1
Предложение: использование слова «задача» может помочь ссылаться на что-то работоспособное без особого путаницы в процессе / потоке.
Тотор
17

Потоки - это процессы под Linux. Они создаются с помощью cloneсистемного вызова, который возвращает идентификатор процесса, которому можно отправить сигнал через killсистемный вызов, как процесс. Процессы psпотока видны в выводе. При cloneвызове передаются флаги, которые определяют, какая часть среды родительского процесса используется совместно с процессом потока.

Кайл Джонс
источник
1
Человек pthreads(7)говорит, что для текущей реализации NPTL (Native POSIX Threads Library) «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID». В устаревшей реализации LinuxThreads каждый «поток» имеет свой собственный PID.
Тотор