Вопрос:
У меня возникает некоторая путаница между Id процесса и Идентификатором потока. Я прошел через несколько веб-сообщений, включая переполнение стека здесь, в котором говорится
запуск нового процесса дает вам новый PID и новый TGID, а при запуске нового потока вы получаете новый PID при сохранении того же TGID.
Итак, когда я запускаю программу, почему все потоки, созданные из программы, не имеют другого PID?
Я знаю, что в программировании мы обычно говорим, что main – это поток, и выполнение начинается с main, поэтому, если я создаю несколько потоков из main, все потоки будут иметь тот же PID, который равен основной PID.
Так что я хотел спросить, как показано ниже:
1) Когда мы запускаем программу, она запускается как процесс или поток?
2) Есть ли разница между потоками потоков main и процессами создания потоков?
3) Есть ли разница между потоком и процессом в Linux? Поскольку я где-то читал, что linux не проводит различия между Thread и Process.
Лучший ответ:
Я получил ответ здесь в stackoverflow. В нем говорится, что если мы запустим программу на Linux, которая содержит libc libuClibc-0.9.30.1.so(1). В основном более старая версия libc, а затем созданный поток будет иметь различный PID, как показано ниже.
root@OpenWrt:~# ./test main thread pid is 1151 child thread pid is 1153
и я попытался запустить эту программу с Linux, который содержит libc из ubuntu libc6 (2) i.e более новая версия libc, тогда созданный поток будет иметь тот же PID, что и процесс.
$ ./test main thread pid is 2609 child thread pid is 2609 The libc (1) use linuxthreads implementation of pthread
И libc (2) использует NPTL ( “Native posix thread library” ) реализацию pthread
В соответствии с linuxthreads часто задаваемым вопросом (в ответе J.3):
каждый поток действительно представляет собой отдельный процесс с отдельным PID, и сигналы, отправленные в PID потока, могут обрабатываться только этим потоком
Итак, в старом libc, который использует реализацию linuxthreads, каждый поток имеет свой отдельный PID
В новой версии libc, использующей реализацию NPTL, все потоки имеют одинаковый PID основного процесса.
NPTL был разработан командой redhat. и согласно redhat NPTL document: Одна из проблем, которые решаются в реализации NPTL:
(Chapter: Problems with the Existing Implementation, page5)
Each thread having a different process ID causes compatibility problems with other POSIX thread implementations. This is in part a moot point since signals can’t be used very well but is still noticeable
И это объясняет эту проблему.
Я использую новую версию libc, содержащую реализацию pthread NPTL ( “Native posix thread library” ).
Ответ №1
Упрощение бит:
-
PID – это идентификатор процесса, TID – это идентификатор потока. Дело в том, что для первого потока, созданного fork(), PID = TID. Если вы создаете больше потоков внутри процесса с помощью команды clone(), тогда PID и TID будут разными, PID всегда будет меньше TID.
-
Нет, нет никакой разницы, кроме, может быть, что если main убит, все остальные потоки также будут убиты.
-
Да, поток фактически запланирован. Технически процесс представляет собой только отображение памяти различных сегментов кода (текст, bss, стек, кучу и ОС).
Ответ №2
Эта путаница исходит из концепции задач Linux.
В Linux мало различий между задачей и потоком.
Каждый процесс представляет собой автономную виртуальную машину, выполняющую хотя бы одну задачу.
Каждая задача представляет собой независимое исполнительное устройство в пределах области процесса.
Основная задача процесса дает ему идентификатор задачи (TID) для процесса, так как он обрабатывает идентификатор (PID).
Каждый новый поток, который вы создаете в процессе, создает в нем новую задачу. Чтобы идентифицировать их отдельно в ядре, им присваивается свой индивидуальный идентификатор задачи (TID).
Все задачи внутри процесса имеют один и тот же идентификатор группы задач (TGID).
Ответ №3
Сообщение, которое вы показали, описывает реализацию потоковой реализации Linux, которая, я полагаю, является старой версией реализации Linux, где потоки были созданы как другой процесс.
В реализации потоков POSIX потоки не создаются как другой процесс, а создают разные потоки параллельного выполнения кода, которые имеют некоторые компоненты, различаются в параллельном исполнении, информация о котором хранится дескриптором потока, сохраняющим TID,
В то время как процесс, создающий несколько потоков, может упоминаться как многопоточный процесс, таким образом, имеет один и тот же PID всей его нити, но разные TID. Основной процесс, создающий поток, можно назвать основным потоком
Ответ №4
Вы получите тот же идентификатор процесса, что и все потоки, которые делят ваши программные данные, которые являются вашим процессом, поэтому, когда вы вызываете идентификатор процесса, вы получаете то же самое.