Diferença entre encadeamentos e processos
Questão importante no Linux, porque a documentação perpetua dúvidas (sobre os threads não terem seu próprio PID, por exemplo).
Observação: esta resposta explica o Linux tópicos precisamente.
Resumindo: o kernel somente manipula "entidades executáveis", isto é, algo que pode ser executado e programado . No kernel, essas entidades são chamadas de processos. Um thread, é apenas um tipo de processo que compartilha (pelo menos) espaço de memória e manipuladores de sinais com outro.
Todo processo desse tipo tem um identificador exclusivo em todo o sistema: o PID (ID do processo). Para os chamados threads, às vezes é chamado TID (Thread ID), mas do ponto de vista do sysadmin (e do kernel!), O TID e o PID são a mesma coisa (eles compartilham o mesmo namespace).
Como resultado, você pode renice
each "thread" individualmente porque tem seu próprio PID 1 .
Localizando todos os PIDs para renice
recursivamente
Precisamos obter os PIDs de todos os processos ("normal" ou "thread") que são descendentes (filhos ou no grupo de threads) do processo to-be-niced. Isso deve ser recursivo (considerando os filhos das crianças).
O Anton Leontiev responde da seguinte maneira: todos os nomes de pastas em /proc/$PID/task/
são PIDs de segmentos contendo um arquivo children
listando possíveis processos filhos.
No entanto, falta recursividade, então aqui está uma rápida & script de shell sujo para encontrá-los:
#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1
PID_LIST=
findpids() {
for pid in /proc/$1/task/* ; do
pid="$(basename "$pid")"
PID_LIST="$PID_LIST$pid "
for cpid in $(cat /proc/$1/task/$pid/children) ; do
findpids $cpid
done
done
}
findpids $1
echo $PID_LIST
Se o processo PID 1234 for o que você deseja recursivamente bom, agora você pode fazer:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
1 Observe que, para conformidade com POSIX, chamar getpid(2)
dentro de um encadeamento não fornecerá o ID exclusivo (PID) do sistema dessa entidade executável, mas sim o PID do processo principal dentro do "grupo de threads". Você precisaria chamar gettid(2)
. Consulte esta resposta para obter mais informações.