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

Существует несколько видов init систем, и некоторые дистрибутивы Linux даже предлагают больше чем одну опцию. Наиболее распространенным является systemd, SysV, LSB и выскочка, но существуют другие.

Вот некоторые детали о init в OpenSUSE. Возможно, при нахождении других к настоящему времени, можно отправить обратные каналы.

19
20.06.2017, 12:53
4 ответа

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

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

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

23
27.01.2020, 19:44

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

17
27.01.2020, 19:44
  • 1
    Человек pthreads(7) говорит, что для текущего NPTL (Собственный компонент Библиотека Потоков POSIX) реализация, "все потоки в процессе помещаются в ту же группу потока; все члены группы потока совместно используют тот же PID". В устаревшей реализации LinuxThreads каждый "поток" имеет свой собственный PID. –  Totor 14.10.2016, 16:48

Документация может быть довольно запутанной, поэтому вот "real" Модель Linux:

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

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

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

34
27.01.2020, 19:44

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

Но я думаю, полезно помнить, что имеет значение, какой объем контекста может использоваться совместно или должен сохраняться уникальным образом, и сколько циклов может потребоваться для переключения контекста, что может зависеть от того, насколько вероятно различие, а не не только в отношении ОС, но и в отношении аппаратного обеспечения, например, TLB. Так что важно, что клонируется и чем делится.

На уровне приложения новый поток (в обычном понимании, совместное использование образа памяти, текущего каталога, дескрипторов открытых файлов и т. д. )всегда дешевле, чем новый процесс, который в лучшем случае только первоначально делится всем этим. Даже если процесс разветвлен с копией -на запись -, как только он запишется, вам нужно будет сделать копию. Вот почему при разработке приложения гораздо разумнее создать 10 000 потоков, чем 10 000 процессов. Причинами создания нового процесса являются запуск другого исполняемого файла или брандмауэр из соображений безопасности.

1
01.03.2021, 03:01

Теги

Похожие вопросы