Связь между идентификатором потока и идентификатором процесса

Вопрос:У меня возникает некоторая путаница между Id процесса и Идентификатором потока. Я прошел через несколько веб-сообщений, включая переполнение стека здесь, в котором говорится запуск нового процесса дает вам новый PID и новый TGID, а при запуске нового потока вы получаете новый PID при сохранении того же TGID. Итак, когда я запускаю программу, почему все потоки,

Вопрос:

У меня возникает некоторая путаница между 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

Вы получите тот же идентификатор процесса, что и все потоки, которые делят ваши программные данные, которые являются вашим процессом, поэтому, когда вы вызываете идентификатор процесса, вы получаете то же самое.

Оцените статью
Добавить комментарий