Na arquitetura de kernel Linux da Mauerer,
Os threads do kernel são processos iniciados diretamente pelo próprio kernel. Eles delegam uma função do kernel para um processo separado e a executam em paralelo aos outros processos do sistema (e, de fato, paralelamente à execução do próprio kernel). Os threads do kernel geralmente são chamados de daemons (kernel) . Eles são usados para executar, por exemplo, as seguintes tarefas:
- Sincronizar periodicamente as páginas de memória modificadas com o dispositivo de bloco do qual as páginas se originam (por exemplo, arquivos mapeados usando o mmap).
- Para gravar páginas de memória na área de troca, se elas raramente são usadas.
- Para gerenciar ações adiadas.
- Implementar diários de transações para sistemas de arquivos.
Basicamente, existem dois tipos de thread do kernel:
- Tipo 1 - O encadeamento é iniciado e aguarda até ser solicitado pelo kernel para executar uma ação específica.
- Tipo 2 - Uma vez iniciado, o encadeamento é executado em intervalos periódicos, verifica a utilização de um recurso específico e atua quando a utilização excede ou cai abaixo de um valor limite definido. O kernel usa esse tipo de encadeamento para tarefas de monitoramento contínuo.
Como o livro de Mauerer diz que os threads do kernel são processos, acho que eles devem estar em execução no modo de usuário, em vez do modo de kernel. (ou estou errado? Um processo pode ser executado no modo de usuário ou no kernel em momentos diferentes ou apenas em um modo?)
Mas o Understanding Linux Kernel da Bovet diz que os threads do kernel estão sendo executados apenas no modo kernel (veja a citação abaixo). Os conceitos de "thread do kernel" nos dois livros são o mesmo conceito?
Os sistemas Unix tradicionais delegam algumas tarefas críticas para processos de execução intermitente, incluindo a limpeza de caches de disco, a troca de páginas não utilizadas, a manutenção de conexões de rede e assim por diante. De fato, não é eficiente executar essas tarefas de maneira linear estrita; suas funções e os processos do usuário final obtêm uma melhor resposta se forem agendados em segundo plano. Como alguns dos processos do sistema são executados apenas no Modo Kernel, os sistemas operacionais modernos delegam suas funções aos threads do kernel , que não são sobrecarregados com o contexto desnecessário do Modo do Usuário. No Linux, os threads do kernel diferem dos processos regulares das seguintes maneiras:
- Os threads do kernel são executados apenas no Modo Kernel, enquanto os processos regulares são executados alternadamente no Modo Kernel e no Modo Usuário.
- Como os threads do kernel são executados apenas no Modo Kernel, eles usam apenas endereços lineares maiores que PAGE_OFFSET. Os processos regulares, por outro lado, usam todos os quatro gigabytes de endereços lineares, no Modo Usuário ou no Modo Kernel.
O livro de Mauerer diz que os threads do kernel são iniciados diretamente pelo kernel, e parece também dizer que daemons são sinônimos de threads do kernel. Então, acho que os daemons devem ser iniciados diretamente pelo kernel.
Mas https://unix.stackexchange.com/a/193918/674 diz que
screen
o daemon é iniciado pelascreen
interface do usuário (veja a citação abaixo). Eu acho quescreen
a interface do usuário é um processo, em vez do kernel. Os conceitosdaemon
do livro de Mauerer e da resposta vinculada são o mesmo conceito?Quando você inicia
screen
, na verdade você está iniciando uma interface do usuário (ui), que por padrão criará um daemon (o gerenciador de sessões).Em geral, como você entende os conceitos de "threads do kernel", "processo" e "daemon", suas relações e diferenças?
Respostas:
Primeiro: o crédito é /programming/15983872/difference-between-user-level-and-kernel-supported-threads
Os threads do usuário e do Kernel são exatamente iguais. (Você pode ver olhando em / proc / e também os threads do kernel.)
Um encadeamento de usuário é aquele que executa o código de espaço do usuário. Mas pode chamar o espaço do kernel a qualquer momento. Ele ainda é considerado um encadeamento de "Usuário", embora esteja executando o código do kernel em níveis de segurança elevados.
Um thread do Kernel é aquele que executa apenas o código do kernel e não está associado a um processo no espaço do usuário. Eles são como "daemons UNIX", exceto que são daemons apenas do kernel. Então você pode dizer que o kernel é um programa multiencadeado. Por exemplo, há um thread do kernel para troca. Isso força todos os problemas de troca a serem "serializados" em um único fluxo.
Se um segmento de usuário precisar de algo, ele chamará o kernel, que marca esse segmento como inativo. Posteriormente, o encadeamento de troca localiza os dados e, portanto, marca o encadeamento do usuário como executável. Mais tarde, o "thread do usuário" retorna do kernel de volta à terra do usuário como se nada tivesse acontecido.
De fato, todos os threads iniciam no espaço do kernel, porque a operação clone () acontece no espaço do kernel. (E há muita contabilidade de kernel a ser feita antes que você possa 'retornar' a um novo processo no espaço do usuário.)
fonte