Qual é a diferença entre threads operando no espaço do usuário, espaço do kernel e híbridos?

Quem gerencia a alternância entre threads e (como, no caso de híbridos). Os threads do usuário são executados em um único processo (e, portanto, o kernel nunca fica ciente de sua existência), os threads do kernel são tratados como se fossem processos independentes pelo algoritmo de agendamento.

Os encadeamentos híbridos distribuem um certo número de encadeamentos entre um certo número (menor ou potencialmente igual) de entidades que serão tratadas pelo algoritmo de agendamento. Como eles são trocados exatamente é um pouco mais complexo do que qualquer um dos outros dois métodos.

Observe que, apesar do nome, o código dos threads do kernel ainda é executado no espaço do usuário.

A diferença está nos privilégios. Um processo no modo Usuário é limitado no que pode fazer no hardware subjacente; por exemplo, ele não pode executar E / S ou alocar memória. Além disso, um processo no modo Kernel tem todos os privilégios. Esse suporte ao modo de execução é fornecido no nível do hardware.

Os modos de execução são introduzidos para impedir que os processos criados por um programa do usuário façam coisas indesejáveis ​​(ilegais), permitindo a execução direta na CPU.

Um processo no modo Usuário pode

armadilha

no modo Kernel apenas chamando as chamadas do sistema fornecidas pelo sistema operacional.

Depende do sistema operacional. Cada sistema operacional possui suas próprias políticas sobre threads.

Deixe-me tomar o OS X como exemplo.

No Mach, que é o kernel do OS X, ele contém apenas Tarefas e Threads. Task é um contêiner de Threads, algo como Process in BSD Layer. Um processo no espaço do usuário corresponde a uma tarefa no kernel, mas uma tarefa no kernel pode não ter um processo correspondente no espaço do usuário. O Kernel Thread é a menor unidade no sistema de agendamento. Na verdade, o kernel_task (pid 0) no OS X é uma coleção de Threads do Kernel. Não é um processo BSD.

Como o relacionamento entre Tarefas e Processo, os threads no kernel podem ou não ter um thread correspondente em um Processo no Espaço do Usuário, mas um thread do Espaço do Usuário certamente possui um thread do kernel correspondente. Então, você sabe que o OS X usa o modelo de encadeamento híbrido.

A principal diferença entre o thread de espaço do usuário e o thread do kernel é o modo Um encadeamento em execução no modo kernel pode ter todo o acesso ao kernel e seu encadeamento correspondente no espaço do usuário, mas isso não pode acontecer vice-versa. Um encadeamento no modo de usuário pode facilmente fazer comunicação ou operação com outro encadeamento ou recurso do espaço do usuário. O OS X tem um exemplo típico dessa implementação: Pagers. Um Thread do Kernel mantém a política de como fazer a troca de página (thread do kernel do pager) e quando fazê-lo (thread do kernel do pager), mas a operação, especialmente a operação de armazenamento de backup de arquivo (arquivo de troca), é tratada por um Processo de Espaço do Usuário ( thread) dynamic_pager. Isso traz benefícios chamados separação de política e mecanismo.