A documentação pode ser bastante confusa, então aqui está o modelo Linux " real ":
- dentro do kernel do Linux, algo que pode ser executado (e agendado) é chamado de "processo",
- cada processo possui um ID do processo (PID) exclusivo do sistema e um TGID (Thread Group ID),
- um processo "normal" possui PID = TGID e nenhum outro processo compartilha esse valor de TGID,
- um processo "encadeado" é um processo cujo valor TGID é compartilhado por outros processos,
- vários processos que compartilham o mesmo TGID também compartilham, pelo menos, o mesmo espaço de memória e manipuladores de sinal (às vezes mais),
- se um processo "encadeado" tiver PID = TGID, ele poderá ser chamado "o encadeamento principal",
- a chamada
getpid()
de qualquer processo retornará seu TGID (= "main thread" PID),
- a chamada
gettid()
de qualquer processo retornará seu PID (!),
- qualquer tipo de processo pode ser criado com a
clone(2)
chamada do sistema,
- nomes numéricos das pastas com os quais você pode listar,
ls /proc
como /proc/NUMBER
são TGIDs,
- nomes numéricos das pastas, assim
/proc/TGID/task
como /proc/TGID/task/NUMBER
os PIDs,
- mesmo que você não veja todos os PIDs existentes
ls /proc
, ainda é possível cd /proc/any_PID
.
Conclusão : do ponto de vista do kernel, existem apenas processos, cada um com seu próprio PID exclusivo, e o chamado thread é apenas um tipo diferente de processo.
Nota: a implementação do conceito de "thread" no Linux levou a uma confusão de vocabulário e, se getpid()
mentir para você , não faz o que você pensava, é porque seu comportamento segue a compatibilidade com POSIX (os threads devem compartilhar um PID comum) .