Qual é a diferença entre os threads no nível do usuário e os do nível do kernel?

33

Depois de ler várias fontes, ainda estou confuso sobre os threads no nível do usuário e do kernel.

Em particular:

Os encadeamentos podem existir no nível do usuário e no nível do kernel

Qual é a diferença entre o nível do usuário e o kernel?

Sheldon
fonte
1
Isso é realmente Comp Sci (teoria) ou apenas programação?
Mehrdad
6
@Mehrdad, Sistemas Operacionais faz parte da ciência da computação.
Kaveh

Respostas:

28

Uma das funções de um kernel de sistema operacional multitarefa é o agendamento : determinar qual encadeamento de execução executar quando. Portanto, esse kernel tem alguma noção de thread ou processo . Um encadeamento é um pedaço de código sequencial que está sendo executado e possui sua própria pilha e algumas vezes outros dados. Em um contexto de sistema operacional, as pessoas geralmente usam processo para significar um encadeamento que possui seu próprio espaço de memória e encadeamento para significar um encadeamento que compartilha seu espaço de memória com outros encadeamentos. Um processo pode ter um ou mais encadeamentos.

Alguns sistemas operacionais, por exemplo, sistemas unix mais antigos, fornecem apenas processos: todo encadeamento que o kernel gerencia possui seu próprio espaço de memória. Outros sistemas operacionais, por exemplo, os sistemas unix mais modernos, permitem que os processos contenham vários threads de execução: eles fornecem uma noção de threads no nível do kernel.

Também é possível para um processo gerenciar seu próprio encadeamento. No multithreading cooperativo , o código de cada thread contém instruções para alternar para outro thread. No multithreading preventivo , o processo solicita notificações assíncronas periódicas do kernel e reage a essas notificações alternando para um thread diferente. Dessa forma, o multithreading é implementado sem cooperação do kernel, no nível do usuário, em uma biblioteca.

Um sistema pode oferecer threads no nível do kernel e no nível do usuário; isso é conhecido como encadeamento híbrido .

Cada um dos threads no nível do usuário e do kernel tem seus benefícios e desvantagens. A alternância entre os encadeamentos no nível do usuário geralmente é mais rápida, porque não requer a redefinição das proteções de memória para alternar para o agendador no kernel e novamente para voltar ao processo. Isso é importante principalmente para sistemas concorrentes maciços que usam um grande número de encadeamentos de vida muito curta, como algumas linguagens de alto nível ( Erlang em particular) e seus encadeamentos verdes . Os threads no nível do usuário requerem menos suporte ao kernel, o que pode tornar o kernel mais simples. Os encadeamentos no nível do kernel permitem que um encadeamento seja executado enquanto outro encadeamento no mesmo processo é bloqueado em uma chamada do sistema; processos com encadeamentos no nível do usuário devem tomar cuidado para não fazer chamadas de sistema de bloqueio, pois bloqueiam todos os encadeamentos do processo. Os threads no nível do kernel podem ser executados simultaneamente em máquinas com multiprocessadores, o que os threads no nível do usuário não podem alcançar.

Gilles 'SO- parar de ser mau'
fonte
Sua última linha diz "Os threads no nível do kernel podem ser executados simultaneamente em máquinas com multiprocessadores, o que os threads puramente no nível do usuário não conseguem". Mas, segundo o link fornecido, o ULT pode executar simultaneamente stackoverflow.com/questions/14791801/… . Estou entendendo algo errado?
Garrick
Você pode verificar meu comentário acima?
Garrick
1
@Garrick Vários threads no nível do usuário podem executar em núcleos diferentes ao mesmo tempo, desde que estejam executando dentro de diferentes threads no nível do kernel. Se você tiver apenas o ULT como ferramenta, estará limitado a um único processador. Se o KLT estiver disponível, você poderá espalhar os threads do kernel por vários processadores e enviar seu ULT entre os threads do kernel disponíveis.
Gilles 'SO- stop be evil'
4

Pense nos threads no nível do kernel como " processadores virtuais " e nos threads no nível do usuário como simplesmente threads (vamos chamá-los como tal por enquanto). Agora, para um thread ser executado, ele foi atribuído a um processador, certo? Portanto, cada encadeamento é atribuído a um processador virtual para que possa ser executado.

Aqui estão os fatos

  • Criar um novo processador virtual é um pouco caro. (O kernel precisa criar uma entrada no Thread Control Block , atribuir pilha etc.)

  • Criar um encadeamento é bem simples comparado à criação de um novo processador virtual. Um desenvolvedor de aplicativos pode criar threads usando as Bibliotecas de Threads fornecidas pelas linguagens de programação e são gerenciadas no Espaço do Usuário . E diferentes idiomas implementam multithreading de maneiras diferentes.

Modelos

  • Se os threads forem mapeados em um único processador virtual, é preciso ter cuidado para não fazer uma chamada de sistema de bloqueio em nenhum dos threads, porque outros threads não podem mais ser executados simultaneamente.

  • Essa limitação pode ser superada se mais alguns processadores virtuais puderem ser criados. Agora, os threads podem ser executados simultaneamente (em paralelo, se vários processadores reais estiverem presentes). Um thread não afetará outros threads mapeados em outros processadores virtuais.

  • No último modelo, um ou vários encadeamentos podem ser mapeados em processadores virtuais.

  • Os modelos acima são nomeados Muitos para Um, Um para Um e Muitos para Muitos, respectivamente.

Referências: Conceitos de sistema operacional de Galvin et al. Tópico: Threads -> Modelos Multithreading

azam
fonte