Os threads do kernel do Linux são realmente processos do kernel?

19

Eu li em muitos lugares que o Linux cria um thread do kernel para cada thread do usuário em uma Java VM. (Vejo o termo "thread do kernel" usado de duas maneiras diferentes:

  1. um encadeamento criado para executar o trabalho principal do SO e
  2. um segmento que o sistema operacional conhece e programa para executar o trabalho do usuário.

Eu estou falando sobre o último tipo.)

Um thread do kernel é o mesmo que um processo do kernel, já que os processos Linux suportam espaços de memória compartilhados entre pai e filho, ou é realmente uma entidade diferente?

Ellen Spertus
fonte

Respostas:

23

Não há absolutamente nenhuma diferença entre um thread e um processo no Linux. Se você observar o clone (2) , verá um conjunto de sinalizadores que determinam o que é compartilhado e o que não é compartilhado entre os threads.

Processos clássicos são apenas threads que não compartilham nada; você pode compartilhar quais componentes deseja no Linux.

Esse não é o caso em outras implementações de SO, onde há diferenças muito mais substanciais.

Daniel Pittman
fonte
22

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 /proccomo /proc/NUMBERsão TGIDs,
  • nomes numéricos das pastas, assim /proc/TGID/taskcomo /proc/TGID/task/NUMBERos 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) .

Totor
fonte
11
Sugestão: usar a palavra "tarefa" pode ajudar a se referir a algo executável sem entrar em tanta confusão no processo / segmento.
Totor 14/03
17

Threads são processos no Linux. Eles são criados com a clonechamada do sistema, que retorna um ID do processo que pode ser enviado um sinal através da killchamada do sistema, exatamente como um processo. Processos de encadeamento são visíveis na pssaída. A clonechamada é transmitida por sinalizadores que determinam quanto do ambiente do processo pai é compartilhado com o processo do encadeamento.

Kyle Jones
fonte
11
O homem pthreads(7)diz que, para a implementação atual do NPTL (Native POSIX Threads Library), "todos os threads em um processo são colocados no mesmo grupo de threads; todos os membros de um grupo de threads compartilham o mesmo PID". Na obsoleta implementação LinuxThreads, cada "thread" possui seu próprio PID.
Totor