Являются ли потоки ядра Linux действительно процессами ядра?
19
Я читал во многих местах, что Linux создает поток ядра для каждого пользовательского потока в Java VM. (Я вижу, что термин «поток ядра» используется двумя различными способами:
поток, созданный для работы ядра ОС и
Поток, о котором ОС знает и планирует выполнять пользовательскую работу.
Я говорю о последнем типе.)
Является ли поток ядра тем же, что и процесс ядра, поскольку процессы Linux поддерживают разделенное пространство памяти между родительским и дочерним процессами или это действительно другая сущность?
Нет абсолютно никакой разницы между потоком и процессом в Linux. Если вы посмотрите на clone (2), вы увидите набор флагов, которые определяют, что является общим, а что нет, между потоками.
Классические процессы - это просто потоки, которые ничего не разделяют; Вы можете поделиться, какие компоненты вы хотите под Linux.
Это не относится к другим реализациям ОС, где есть гораздо более существенные различия.
Документация может быть довольно запутанной, поэтому вот « настоящая » модель 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) ,
Предложение: использование слова «задача» может помочь ссылаться на что-то работоспособное без особого путаницы в процессе / потоке.
Тотор
17
Потоки - это процессы под Linux. Они создаются с помощью cloneсистемного вызова, который возвращает идентификатор процесса, которому можно отправить сигнал через killсистемный вызов, как процесс. Процессы psпотока видны в выводе. При cloneвызове передаются флаги, которые определяют, какая часть среды родительского процесса используется совместно с процессом потока.
Человек pthreads(7)говорит, что для текущей реализации NPTL (Native POSIX Threads Library) «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID». В устаревшей реализации LinuxThreads каждый «поток» имеет свой собственный PID.
Потоки - это процессы под Linux. Они создаются с помощью
clone
системного вызова, который возвращает идентификатор процесса, которому можно отправить сигнал черезkill
системный вызов, как процесс. Процессыps
потока видны в выводе. Приclone
вызове передаются флаги, которые определяют, какая часть среды родительского процесса используется совместно с процессом потока.источник
pthreads(7)
говорит, что для текущей реализации NPTL (Native POSIX Threads Library) «все потоки в процессе помещены в одну группу потоков; все члены группы потоков имеют один и тот же PID». В устаревшей реализации LinuxThreads каждый «поток» имеет свой собственный PID.