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

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

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

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

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

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

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

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

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

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

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

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

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