LINHAS: Threads do kernel vs. threads suportados pelo kernel vs. threads no nível do usuário?

9

Alguém sabe qual é a diferença entre estes?

Parece-me que os threads do kernel correspondem ao código que executa o kernel (intuitivamente), mas não tenho certeza dos outros dois ...

Além disso, o padrão pthreads seria considerado compatível com o nível do usuário e com o kernel, já que você está acessando uma biblioteca enquanto o kernel faz todo o agendamento / troca de threads?

Templário Sombrio
fonte

Respostas:

14

O termo "threads do kernel" pode ser usado para se referir a threads reais que são executados inteiramente no espaço do kernel ou a threads do espaço do usuário agendados pelo kernel. O termo encadeamentos "suportados pelo kernel" significa os últimos, que são executados no espaço do usuário, mas são facilitados pelo kernel, o que geralmente significa que o kernel os agenda.

"Encadeamentos no nível do usuário" geralmente significa encadeamentos visíveis ao espaço do usuário. Ou seja, o que você cria quando chama a função "create thread" do seu padrão de segmentação. Geralmente, o termo "encadeamento no nível do usuário" é usado para significar um encadeamento criado pelo código do aplicativo, independentemente de como ele é implementado pelo sistema. Pode ser um thread puro do espaço do usuário com pouco ou nenhum suporte ao kernel ou pode ser um thread agendado pelo kernel.

O padrão pthreads pode ser implementado como threads do espaço do usuário puro (onde o kernel agenda o processo e o processo agenda os threads), threads suportados pelo kernel (onde o kernel agenda os threads diretamente) ou uma abordagem híbrida (onde o kernel agenda um encadeamento no nível do kernel que, no espaço do usuário, agenda um encadeamento no nível do usuário). O padrão não exige nenhum meio específico de implementação. A implementação mais comum é o mapeamento 1 para 1, onde cada encadeamento no nível do usuário tem um encadeamento correspondente agendado pelo kernel.

David Schwartz
fonte
como é a implementação no Linux?
yati sagade
3
Em todos os sistemas Linux modernos (kernel 2.6 ou posterior) que eu conheço, a implementação de encadeamento padrão do sistema é 1 para 1, cada encadeamento no nível do usuário tem um KSE (entidade de agendamento do kernel correspondente) - basicamente, um encadeamento agendado pelo Kernel do Linux). O segmento que você criar com 'pthread_create' será agendado diretamente pelo kernel. Sistemas modernos geralmente usam NPTL , sistemas mais antigos usam LinuxThreads - ambos são 1 para 1.
David Schwartz
"ou uma abordagem híbrida (onde o kernel agenda um thread no nível do kernel que, no espaço do usuário, agenda um thread no nível do usuário)." Ei David, você poderia explicar isso de novo? Não sei ao certo o que está acontecendo ... Quando você diz que o mapeamento 1 para 1 está se referindo aos Blocos de Controle de Thread ao mencionar theads no nível do kernel?
Escuro Templar
Por 1 para 1, quero dizer que toda vez que você chama 'pthread_create', um novo contexto é criado, agendado pelo kernel. Em uma abordagem híbrida , o número de contextos agendados pelo kernel é menor que o número de threads criados - o kernel agenda um desses contextos e, em seguida, a biblioteca de encadeamento agenda um dos threads criados pelo aplicativo.
David Schwartz