Como o Linux informa os threads para além dos processos filhos?

19

O Linux não distingue entre processos e threads, e implementa ambos como uma estrutura de dados task_struct .

Então, o que o Linux oferece a alguns programas para que eles indiquem segmentos de um processo a partir de seus processos filhos? Por exemplo, Existe uma maneira de ver detalhes de todos os threads que um processo tem no Linux?

Obrigado.

    
por Tim 28.03.2018 / 15:36

3 respostas

26

De uma perspectiva task_struct , os threads de um processo têm o mesmo líder de grupo de threads ( group_leader em task_struct ), enquanto os processos filhos têm um líder de grupo de threads diferente (cada processo filho individual).

Esta informação é exposta ao espaço do usuário via o sistema de arquivos /proc . Você pode rastrear pais e filhos observando o campo ppid em /proc/${pid}/stat ou .../status (isso dá ao pai pid); você pode rastrear segmentos observando o campo tgid em .../status (isso fornece o id do grupo de threads, que também é o pid do líder do grupo). Os encadeamentos de um processo são visíveis no diretório /proc/${pid}/task : cada encadeamento recebe seu próprio subdiretório. (Todo processo tem pelo menos um thread.)

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

    
por 28.03.2018 / 16:10
3
  1. Isso executa o comando top com algumas opções extras:

    top -H -b -n 1
    
    • O argumento -H instrui o início para exibir cada encadeamento individual. Normalmente top resume todos os threads sob o processo pai.
    • O argumento -b é executado no modo em lote - as informações são reunidas, exibidas e, em seguida, despejadas no stdout, em vez de serem executadas em um modo interativo e atualizando os dados exibidos.
    • Com a opção -b , o usuário deve informar ao topo quantas vezes executar, isso é feito com o argumento -n e um argumento final com quantas vezes executar.

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

  2. O comando ps relata um instantâneo dos processos em execução no momento.

    ps -eLf
    

    O argumento -eLf (também pode ser usado como -e -L -f ) divide-se da seguinte forma:

    • e informa ps para exibir todos os processos, independentemente de quem os possui ou do status atual deles - ativo, suspenso, pausado, aguardando E / S, etc.
    • L informa ps para mostrar tópicos individuais
    • o f indica ps para formatar a saída como uma listagem de formato completo e, em conjunto com o argumento L , as colunas NLWP (número de encadeamentos) e LWP (ID de encadeamento) são adicionadas à saída .
por 28.03.2018 / 16:04
1

Considere um processo com PID p1

O objeto task_struct de um processo filho terá PPID (pai PID) como p1, e seu PID e TGID serão configurados para, digamos, p2.

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

    
por 28.03.2018 / 18:58