Como o kernel Linux se compara às arquiteturas de microkernel?

39

Li uma vez que uma vantagem de uma arquitetura de microkernel é que você pode interromper / iniciar serviços essenciais como redes e sistemas de arquivos, sem precisar reiniciar o sistema inteiro. Mas considerando que o kernel do Linux atualmente (sempre foi o caso?) Oferece a opção de usar módulos para obter o mesmo efeito, quais são as vantagens (restantes) de um microkernel?

tshepang
fonte
5
No tópico microkernels e Linux, veja também esta resposta muito boa para “Por que o linux é chamado de kernel monolítico” ?
Gilles 'SO- stop be evil'
1
Você pode ler o debate sobre o MicroKernel vs Monolithic kernel. oreilly.com/openbook/opensources/book/appa.html Neste artigo, Andrew Tanenbaum suporta Microkernel e Linus Torvalds suporta kernel monolítico.
Bhuwan 4/11/15

Respostas:

35

Os microkernels exigem menos código para serem executados no modo mais íntimo e confiável do que os kernels monolíticos . Isso tem muitos aspectos, como:

  • Os microkernels permitem que recursos não fundamentais (como drivers para hardware que não está conectado ou não esteja em uso) sejam carregados e descarregados à vontade. Isso é possível em Linux, através de módulos.
  • Os microkernels são mais robustos: se um componente que não seja do kernel travar, ele não levará todo o sistema. Um sistema de arquivos com defeito ou um driver de dispositivo pode travar um sistema Linux. O Linux não tem como mitigar esses problemas além de práticas e testes de codificação.
  • Os microkernels têm uma base de computação confiável menor . Assim, mesmo um driver de dispositivo ou sistema de arquivos mal-intencionado não pode assumir o controle de todo o sistema (por exemplo, um driver de origem duvidosa para o seu mais recente dispositivo USB não seria capaz de ler seu disco rígido).
  • Uma conseqüência do ponto anterior é que usuários comuns podem carregar seus próprios componentes que seriam componentes do kernel em um kernel monolítico.

As GUIs do Unix são fornecidas via janela X, que é o código da terra do usuário (exceto (parte do) driver de dispositivo de vídeo). Muitos departamentos modernos permitem que usuários comuns carreguem drivers do sistema de arquivos através do FUSE . Parte da filtragem de pacotes de rede Linux pode ser feita na terra do usuário. No entanto, drivers de dispositivo, agendadores, gerenciadores de memória e a maioria dos protocolos de rede ainda são apenas do kernel.

Uma leitura clássica (se datada) sobre Linux e microkernels é o debate Tanenbaum-Torvalds . Vinte anos depois, pode-se dizer que o Linux está caminhando muito lentamente para uma estrutura de microkernel (os módulos carregáveis ​​apareceram no início, o FUSE é mais recente), mas ainda há um longo caminho a percorrer.

Outra coisa que mudou foi a crescente relevância da virtualização em computadores desktop e embarcados de última geração: para alguns propósitos, a distinção relevante não está entre o kernel e a região do usuário, mas entre o hipervisor e os sistemas operacionais convidados.

Gilles 'SO- parar de ser mau'
fonte
1
Essa é toda a teoria muito boa. Se um dispositivo for entupido de alguma forma, o sistema estará pronto. Se um driver travar no meio de uma operação, nenhuma reinicialização o driver restaurará o sistema ao estado funcional. Se você deseja algum desempenho, os drivers devem ter vários threads ... e a vantagem de "um agendador" está completamente perdida. Para obter desempenho, você precisa evitar (cada vez mais caras) cópias de memória e comutadores de contexto ... e a "modularidade" é perdida. Procure tamanhos de alguns microkernels e você verá tamanho e complexidade comparáveis ​​aos kernels monolíticos com os drivers incluídos .
vonbrand
15

Um microkernel limita o tempo em que o sistema está no modo kernel, em oposição ao espaço do usuário, ao mínimo absoluto possível.

Se ocorrer uma falha no modo kernel, o kernel inteiro será desativado, e isso significa que o sistema inteiro será desativado. Se ocorrer uma falha no modo de usuário, esse processo será interrompido. O Linux é robusto nesse aspecto, mas ainda é possível para qualquer subsistema do kernel gravar na memória de qualquer outro subsistema do kernel, intencional ou acidentalmente.

O conceito de microkernel coloca muitas coisas tradicionalmente no modo kernel, como rede e drivers de dispositivo, no espaço do usuário. Como o microkernel não é realmente responsável por muito, isso também significa que pode ser mais simples e mais confiável. Pense na maneira como o protocolo IP, por ser simples e estúpido, realmente leva a redes robustas, empurrando a complexidade para o limite e deixando o núcleo enxuto e mesquinho.

LawrenceC
fonte
5

Você deve ler o outro lado da questão:

Computação de alto desempenho extremo ou por que os microkernels sugam

O sistema de arquivos pertence ao kernel

Bruce Ediger
fonte
Obrigado por postar os links para o material de leitura! O ponto de vista abstrato de Brent W é sólido e, até certo ponto, simpatizo com a preocupação de Christoph L sobre a complexidade excessiva nos mecanismos de sincronização de microkernel; no entanto, acho que o último artigo pode estar ignorando os loops de eventos baseados em mensagens. Como os loops de eventos não compartilham memória entre si, o bloqueio não é necessário e, como (IMO) eles se prestam a um estilo de codificação declarativo, um algoritmo consistente pode ser definido explicitamente (o ponto do cálculo lambda ...) - Eu costumo aplicativos de código, mas isso Q tem sido uma experiência de aprendizagem agradável
antrópico android
1

Dê uma olhada na arquitetura x86 - o kernel monolítico usa apenas os anéis 0 e 3. Um desperdício, na verdade. Mas, novamente, pode ser mais rápido, devido à menor alternância de contexto.

anéis x86

vartec
fonte
A estrutura do anel x86 é apenas superengenharia. No uso prático (exceto máquinas virtuais, mas que é cada vez mais utilizado ...)
vonbrand
1
  1. O kernel monolítico é muito mais antigo que o microkernel . É usado no Unix enquanto a idéia de microkernel apareceu no final dos anos 80 .

  2. Exemplos de sistemas operacionais com os núcleos monolíticos são UNIX, LINUX, enquanto os sistemas operacionais com microkernel são QNX, L4, HURD e inicialmente Mach (não o MacOS X), que foi posteriormente convertido em kernel híbrido. Mesmo o MINIX não é um microkernel puro porque seus drivers de dispositivo são compilados como parte do kernel.

  3. Os núcleos monolíticos são mais rápidos que os micro núcleos . O primeiro microkernel Mach é 50% mais lento que os grãos monolíticos. Versões posteriores como L4 são apenas 2% ou 4% mais lentas que o kernel monolítico .

  4. Os núcleos monolíticos geralmente são volumosos, enquanto o microkernel puro precisa ser pequeno em tamanho , até caber no cache de primeiro nível do processador (microkernel de primeira geração).

  5. Nos kernels monolíticos, os drivers de dispositivo residem no espaço do kernel, enquanto nos drivers de dispositivo do microkernel residem no espaço do usuário .

  6. Como os drivers de dispositivo residem no espaço do kernel, ele torna o kernel monolítico menos seguro que o microkernel (a falha no driver pode causar uma falha). Os microkernels são mais seguros que os monolíticos, portanto, são usados ​​em muitos dispositivos militares.

  7. Os núcleos monolíticos usam sinais e soquetes para garantir o IPC, enquanto a abordagem por microkernel usa filas de mensagens . O 1 st gen de microkernel mal implementado IPC para que eles eram lentos em trocas de contexto.

  8. Adicionar novos recursos a um sistema monolítico significa recompilar todo o kernel enquanto você pode adicionar novos recursos ou patches sem recompilar

Rahul Bhadana
fonte
Em (4), você está comparando maçãs e melancias. O próprio microkernel (por design) contém apenas funcionalidade mínima, o kernel monolítico contém muito mais. (6) é uma teoria legal, depende de como as peças são desenvolvidas com competência e da vazão do mecanismo real do IPC (para desempenho, não pode ser uma "transmissão de mensagens" real). Nota (7) significa um tratamento muito complexo de "filas de mensagens", negando principalmente suas vantagens. Para (8), no caso do Linux, é certamente possível compilar um módulo independente do kernel. Isso é feito rotineiramente para o desenvolvimento de drivers, de fato.
vonbrand
0

O Windows NT (o kernel subjacente aos sistemas Windows atuais) começou como um design de microkernel bastante básico. Devido a problemas de desempenho, cada vez mais o código "userland" foi migrado para o "micokernel" ... hoje sua estrutura de microkernel é vestigial.

vonbrand
fonte
-1

O caso é que o linux kernel é um híbrido de monolítico e microkernel. Em uma implementação monolítica pura, não há módulos carregando no tempo de execução.


fonte
9
não é. o fato de os módulos serem carregados dinamicamente não muda o fato, eles são executados com privilégios completos do kernel e como parte do kernel monolítico.
vartec
3
Para o design híbrido, seria mais importante quando alguns drivers (para USB, Scanners, Impressoras e gráficos) são implementados no espaço do usuário e não no kernel. A distinção não é clara e o Linux pode ser declarado como kernel híbrido, pois há libusb, sane, cups e mesa - não porque exista insmod e rmmod.
Maciej Piechotka
-1

Os termos monolithic kernele microkernelnão podem ser seriamente comparados, pois descrevem diferentes aspectos do design do kernel (estrutura versus tamanho).

Um kernel monolítico típico era o kernel SunOS-4.x e o Linux ainda é semelhante, pois você configura manualmente o conteúdo do kernel básico.

O kernel Solaris (começando com 2.1 em 1992) não pode mais ser chamado de monolítico, pois todos os drivers são carregados automaticamente sob demanda e apenas uma pequena parte é carregada durante a inicialização inicial.

SunOS-4.xe Solaris (SunOS-5.x) e Linux são implementações de contexto único. Seu código inteiro é executado em um único contexto MMU.

O Mac OS X é baseado em Mach e é executado como uma implementação de múltiplos contextos com vários processos separados por contextos MMU. Nesse conceito, os drivers estão em processos separados e em contextos MMU separados.

Muitas pessoas chamam o Mac OS X de "sistema de microkernel", mas pode ser que o kernel básico não seja menor que o kernel básico do Solaris.

Assim, parece que seria melhor para falar sobre single context kernelsvs. multi context kernels.

esperto
fonte
1
O MacOS executa um calço BSD (essencialmente monolítico) sobre um microkernel. Nenhuma separação em processos separados, nem um design real de microkernel.
vonbrand
1
Então você admite um design que usa pelo menos dois processos chamados de kernel. O termo microkernelestá errado de qualquer maneira, pois geralmente é usado para algo que deve ser chamado multi context kernel.
schily