O kernel do Linux é realmente um processo do kernel?

14

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

  1. um encadeamento criado para fazer o trabalho principal do SO e
  2. um encadeamento que o SO está ciente e agenda para executar o trabalho do usuário.

Eu estou falando sobre o último tipo.)

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

    
por Ellen Spertus 13.02.2012 / 22:43

3 respostas

18

Não há absolutamente nenhuma diferença entre um encadeamento e um processo no Linux. Se você olhar para clone (2) , verá um conjunto de sinalizadores que determinam o que é compartilhado e o que é não compartilhada, entre os tópicos.

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

Este não é o caso de outras implementações de SO, onde existem diferenças muito mais substanciais.

    
por 13.02.2012 / 23:39
15

Threads são processos no Linux. Eles são criados com a chamada do sistema clone , que retorna um ID do processo que pode receber um sinal por meio da chamada do sistema kill , assim como um processo. Processos de encadeamento são visíveis em ps output. A chamada clone é passada a sinalizadores que determinam quanto do ambiente do processo pai é compartilhado com o processo de encadeamento.

    
por 13.02.2012 / 23:38
14

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 tem um ID de processo (PID) exclusivo do sistema e um ID de grupo de threads (TGID),
  • um processo "normal" tem PID = TGID e nenhum outro processo compartilha esse valor de TGID,
  • um processo "encadeado" é um processo cujo valor de TGID é compartilhado por outros processos,
  • vários processos compartilhando o mesmo TGID também compartilham, pelo menos, o mesmo espaço de memória e manipuladores de sinais (às vezes mais),
  • se um processo "encadeado" tiver PID = TGID, ele pode ser chamado de "o encadeamento principal",
  • chamar getpid() de qualquer processo retornará seu TGID (= "thread principal" PID),
  • chamar gettid() de qualquer processo retornará seu PID (!),
  • qualquer tipo de processo pode ser criado com a chamada do sistema clone(2) ,
  • nomes numéricos das pastas que você pode listar com ls /proc como /proc/NUMBER são TGIDs,
  • nomes numéricos das pastas em /proc/TGID/task como /proc/TGID/task/NUMBER são PIDs
  • mesmo que você não veja todos os PIDs existentes com ls /proc , ainda é possível fazer cd /proc/any_PID .

Conclusão : do ponto de vista do kernel, existem apenas processos, cada um com seu próprio PID, e um chamado thread é apenas um tipo diferente de processo.

Nota: a implementação do conceito "thread" no Linux levou a uma confusão de vocabulário, e se getpid() está mentindo para você não faz o que você pensamento, é porque o seu comportamento segue a compatibilidade POSIX (threads devem compartilhar um PID comum).

    
por 20.10.2016 / 19:42