Como o Linux diferencia os threads dos processos filhos?

Respostas:

28

De uma task_structperspectiva, os encadeamentos de um processo têm o mesmo líder do grupo de encadeamentos ( group_leaderintask_struct ), enquanto os processos filhos têm um líder de grupo de encadeamentos diferentes (cada processo filho individual).

Essas informações são expostas ao espaço do usuário por meio do /procsistema de arquivos. Você pode rastrear pais e filhos olhando para o ppidcampo em /proc/${pid}/statou .../status(isso fornece aos pais o pid); você pode rastrear threads observando o tgidcampo .../status(isso fornece o ID do grupo de threads, que também é o pid do líder do grupo). Os threads de um processo são visíveis no /proc/${pid}/taskdiretório: cada thread recebe seu próprio subdiretório. (Todo processo tem pelo menos um encadeamento.)

Na prática, os programas que desejam acompanhar seus próprios threads dependeriam das APIs fornecidas pela biblioteca de threading que estão usando, em vez de usar informações específicas do sistema operacional. Normalmente em sistemas tipo Unix, isso significa usar pthreads.

Stephen Kitt
fonte
Cada processo em um pipeline de shell (eco foo | cat) compartilha o mesmo líder de grupo (o shell), mas eles não são threads no mesmo processo.
Psusi 28/03
2
Você está falando sobre grupos de processos; na minha resposta, o líder do grupo é da perspectiva do kernel. Na contabilidade do kernel, processos separados são seus próprios líderes de grupo. Você pode ver isso executando (sleep 120 | sleep 120) &e observando os Tgidvalores no arquivo de cada sleepprocesso /proc/${pid}/status.
Stephen Kitt
Oh estranho. Eu não sabia que havia um "líder de grupo de threads" e pensei que todos os threads em um processo multithread são iguais e não há "líder". Qualquer um deles pode sair e enquanto permanecer, o processo não está morto.
Psusi 2/04
5
  1. Isso executa o topcomando com algumas opções extras:

    top -H -b -n 1
    
    • O -Hargumento instrui top a exibir cada thread individual. Normalmente, o topo resume todos os threads no processo pai.
    • O -bargumento executa a execução principal no modo em lote - as informações são coletadas, exibidas e depois despejadas no stdout, em vez de serem executadas em um modo interativo e atualizar os dados exibidos.
    • Com a -bopção, o usuário deve informar quantas vezes executar, isso é feito com o -nargumento e um argumento final com quantas vezes executar.

    Portanto, top -H -b -n 1instrui o sistema a “executar o topo, exibir threads individuais, executar no modo em lote e executar apenas uma vez”.

  2. O pscomando relata um instantâneo dos processos atualmente em execução.

    ps -eLf
    

    O -eLfargumento (também pode ser usado -e -L -f) é dividido da seguinte forma:

    • ediz pspara exibir todos os processos, independentemente de quem os possui ou seu status atual - ativo, inativo, pausado, aguardando E / S etc.
    • Ldiz pspara mostrar segmentos individuais
    • as finstruções pspara formatar a saída como uma listagem em formato completo e, em conjunto com o Largumento, as colunas NLWP (número de threads) e LWP (ID da thread) são adicionadas à saída.
ivanivan
fonte
1

Considere um processo com PID p1

O task_structobjeto de um processo filho terá o PPID (PID pai) como p1 e é PID e TGID definido como, por exemplo, p2.

O task_structobjeto de um encadeamento de p1 terá o PID definido como, digamos, p3, mas o TGID definido como p1.

NOLFXceptMe
fonte
Então você está dizendo a mesma coisa que Stephen Kitt , mas com muito menos clareza. PS Por que se incomodar em incluir o PPID na discussão se você não vai dizer qual é o PPID de um thread?
29318 Scott
PID e TGID são sempre os mesmos.
Tim