Por que o Linux é chamado de kernel monolítico?


208

Eu li que o Linux é um núcleo monolítico. O kernel monolítico significa compilar e vincular o código completo do kernel em um executável?

Se o Linux é capaz de suportar módulos, por que não dividir todos os subsistemas em módulos e carregá-los quando necessário? Nesse caso, o kernel não precisa carregar todos os módulos inicialmente e pode manter um índice das funções no módulo e carregá-las quando necessário.

Respostas:


290

Um kernel monolítico é um kernel em que todos os serviços (sistema de arquivos, VFS, drivers de dispositivo etc.), bem como a funcionalidade principal (agendamento, alocação de memória, etc.) são um grupo unido que compartilha o mesmo espaço. Isso se opõe diretamente a um microkernel .

Um microkernel prefere uma abordagem em que a funcionalidade principal é isolada dos serviços do sistema e dos drivers de dispositivo (que são basicamente apenas serviços do sistema). Por exemplo, o VFS (sistema de arquivos virtual) e os sistemas de arquivos de dispositivo de bloco (por exemplo, minixfs) são processos separados que são executados fora do espaço do kernel, usando o IPC para se comunicar com o kernel, outros serviços e processos do usuário. Em resumo, se é um módulo no Linux, é um serviço em um microkernel, indicando um processo isolado.

Não confunda o termo kernel modular como algo menos monolítico. Alguns kernels monolíticos podem ser compilados para serem modulares (por exemplo, Linux), o que importa é que o módulo seja inserido e executado no mesmo espaço que lida com a funcionalidade principal (espaço do kernel).

A vantagem para um microkernel é que qualquer serviço com falha pode ser facilmente reiniciado, por exemplo, não há interrupção do kernel se o sistema de arquivos raiz lançar um aborto. Isso também pode ser visto como uma desvantagem, pois pode ocultar bugs bastante críticos (ou fazê-los parecer não tão críticos, porque o problema parece se corrigir continuamente). É visto como uma grande vantagem em cenários em que você simplesmente não pode consertar algo convenientemente depois que ele foi implantado.

A desvantagem de um microkernel é que as mensagens IPC assíncronas podem se tornar muito difíceis de depurar, especialmente se fibrilas forem implementadas. Além disso, apenas rastrear um problema de FS / gravação significa examinar o processo de espaço do usuário, o serviço de dispositivo de bloco, o serviço VFS, o serviço de sistema de arquivos e (possivelmente) o serviço PCI. Se você ficar em branco, é hora de olhar para o serviço IPC. Isso geralmente é mais fácil em um kernel monolítico. O GNU Hurd sofre com esses problemas de depuração ( referência ). Nem vou entrar em pontos de verificação ao lidar com filas de mensagens complexas. Microkernels não são para os fracos de coração.

O caminho mais curto para um núcleo estável e funcional é a abordagem monolítica. Qualquer uma das abordagens pode oferecer uma interface POSIX, onde o design do kernel se torna de pouco interesse para alguém que simplesmente deseja escrever código para executar em qualquer design.

Eu uso Linux (monolítico) na produção. No entanto, a maior parte do meu aprendizado, hacking ou mexer no desenvolvimento do kernel vai para um microkernel, especificamente o HelenOS .

Editar

Se você chegou até aqui com a minha resposta muito extensa, provavelmente se divertirá lendo o ' Grande debate Torvalds-Tanenbaum sobre o design do kernel '. É ainda mais engraçado ler em 2013, mais de 20 anos após a sua transpiração. A parte mais engraçada foi a assinatura de Linus em uma das últimas mensagens:

Linus "my first, and hopefully last flamefest" Torvalds

Obviamente, isso não se concretizou mais do que a previsão de Tanenbaum de que o x86 logo seria obsoleto.

NB:

Quando digo "Minix", não implico o Minix 3. Além disso, quando menciono The HURD, estou referenciando (principalmente) o microkernel Mach. Não é minha intenção depreciar o trabalho recente de outros.


5
Curiosamente, Linus Torvalds foi bastante influenciado pelo MINIX de Andew Tanenbaum quando ele criou o Linux. No entanto, o MINIX é baseado em um design de micro kernel, enquanto o Linux usa um kernel monolítico.
Martin Liversage 27/11/2009

2
@ Martin Liversage: Mais frustrado do que influenciado :) Editei minha resposta para refletir isso.
Tim Post

25
@DigitalRoss: Você deve ver minha caixa de entrada depois de responder, Linus é manso em comparação com os entusiastas de Minix e Mach.
Tim Post


3
@p_l Acho que é bem próximo do momento em que precisamos conversar sobre as diferenças entre micro, monolítico e híbrido. Essa poderia ser uma pergunta muito boa:) #
4701 Tim Tim

15

Kernel monolítico significa que todo o sistema operacional é executado no modo kernel (isto é, altamente privilegiado pelo hardware). Ou seja, nenhuma parte do sistema operacional é executada no modo de usuário (privilégio mais baixo). Somente aplicativos na parte superior do SO são executados no modo de usuário.

Nos sistemas operacionais de kernel não monolítico, como o Windows, grande parte do sistema operacional é executada no modo de usuário.

Em qualquer um dos casos, o sistema operacional pode ser altamente modular.


9
Definitivamente, o Windows é um núcleo monolítico.
Adam Rosenfield

7
@ Adam: Eu discordo. O Windows antigo de 16 bits era um kernel monolítico, assim como o Windows 95 e similares. Mas as edições do Windows baseadas no NT, incluindo todas as versões do servidor, além do Vista e 7, são claramente microkernel ou talvez híbridas, dependendo da definição de "microkernel" que você usa.
CesarGon

8
Só porque os drivers de impressora não são executados em ring0 não torná-lo um microkernel :)
caf

7
@caf: Sugiro que você dê uma olhada em en.wikipedia.org/wiki/Windows_NT_kernel e en.wikipedia.org/wiki/Comparison_of_operating_system_kernels . Você verá que o Windows NT e seus sucessores, incluindo o Vista, 7 e os Servidores, são descritos como "kernel híbrido". Dois grandes subsistemas do sistema operacional são executados totalmente no modo de usuário, não apenas um driver de impressora. :-)
CesarGon

7
Meu comentário foi um tanto irônico - a designação "híbrida" parece tão livre de informações que é inútil.
caf

10

; tl-dr - Não, o Linux é sempre monolítico.

Módulos Linux podem significar modular em algum sentido. Como outros observaram, o monolítico geralmente representa um microkernel versus um kernel monolítico . Um microkernel tradicional possui apenas esses recursos,

  1. Agendamento
  2. Gerenciamento de memória
  3. Comunicações entre processos

Não há drivers de hardware , pilhas de protocolos , sistemas de arquivos , suspender / retomar , gerenciamento de clock , etc. no kernel principal. Essas coisas são idênticas a qualquer tarefa do usuário (embora possam ter privilégios diferentes via MMU / planejador).


As previsões de Tanenbaum

  1. Microkernels são o futuro
  2. x86 desaparecerá e as arquiteturas RISC dominarão o mercado
  3. (Daqui a cinco anos) todo mundo estará executando um sistema operacional GNU grátis

Programadores de PC e servidor podem rir, mas dois e três certamente são verdadeiros para a maioria dos telefones celulares existentes. Tanenbaum estaria certo em todas as contas se o BlackBerry QNX fosse um sucesso.

Além disso, muitos hipervisores L1 têm um micro-núcleo embaixo. Isso ocorre porque um hiper-visor geralmente não faz muito além da troca de contexto .

Aparentemente, três prevê o sucesso do Linux. ;-)


Um argumento para os microkernels é que todos os subsistemas monolíticos precisam sincronizar vários valores ao mesmo tempo. Para fazer isso, eles devem usar bloqueios e sofrerão com a lei de Amdahl quando estendidos a arquiteturas paralelas. O contador é que os microkernels resultam em muitas mensagens IPC.

Um grande desenvolvimento é o uso de programação sem bloqueio para evitar contenção em um kernel monolítico. Isso evita o bloqueio em um kernel monolítico enquanto reduz a sobrecarga do IPC. Recentemente, todas as CPUs estenderam seu ISA para incluir melhores primitivas para algoritmos sem bloqueio . Portanto, o Linux provavelmente continuará sendo um kernel monolítico por algum tempo.


1
Sim, eu sei que Tanenbaum quis dizer Hurd. Mas o GNU mudou para o Linux, então as palavras são engraçadas.
ruído artless

Por que falta o uso do x86 para dispositivos móveis? O que torna as outras arquiteturas vantajosas?
Abdul


Sim, esses são importantes. É difícil criar um SOC x86 (sistema no chip). Não há código HDL padrão para fazer um x86 que um fornecedor de SOC (Broadcom, Freescale etc.) possa comprar.
ruído artless

9

Da Wikipedia :

Um kernel monolítico é uma arquitetura de kernel em que todo o sistema operacional está trabalhando no espaço do kernel e sozinho como modo supervisor. Diferentemente de outras arquiteturas, o kernel monolítico define sozinho uma interface virtual de alto nível sobre o hardware do computador, com um conjunto de primitivas ou chamadas de sistema para implementar todos os serviços do sistema operacional, como gerenciamento de processos, simultaneidade e gerenciamento de memória e um ou mais drivers de dispositivo como módulos.

Versões recentes do Windows, por outro lado, usam um kernel híbrido .

Um kernel híbrido é uma arquitetura de kernel baseada na combinação de aspectos de arquiteturas de microkernel e kernel monolítico usadas em sistemas operacionais de computador. A categoria é controversa devido à semelhança com o núcleo monolítico; o termo foi descartado por alguns como simples marketing. As categorias tradicionais de kernel são kernels monolíticos e microkernels (com nanokernels e exokernels vistos como versões mais extremas dos microkernels).


7
Se eu fizer alguma coisa no espaço do kernel, devo lembrar de usar o "hybric kerkel" em algum lugar. SCNR ;-)
Jürgen A. Erhard

1
O Windows NT sempre foi um sistema híbrido. O kernel pode não ser exatamente híbrido, mas você correr em questão do que você contar como parte dela (winapi, por exemplo, é implementado como serviço de espaço de usuário)
p_l

5

'Monolítico' neste contexto não se refere à existência de um único executável grande e, como você diz, o Linux suporta o carregamento dinâmico de módulos do kernel em tempo de execução. Ao falar sobre kernels, 'monolítico' significa que todo o sistema operacional é executado no modo 'privilegiado' ou 'supervisor', em oposição a outros tipos de sistemas operacionais que usam um tipo de kernel como um 'microkernel', onde apenas um mínimo O conjunto de funcionalidades é executado no modo privilegiado e a maior parte do sistema operacional é executada no espaço do usuário.

Os defensores dos microkernels dizem que isso é melhor porque código menor significa menos erros, e os erros em execução no modo supervisor podem causar problemas muito maiores do que no código do espaço do usuário (como uma chance maior de ter vulnerabilidades de segurança ou falhas totais do sistema na forma de um 'kernel panic'). Alguns microkernels são suficientemente mínimos para que possam ser 'formalmente verificados', o que significa que você pode provar matematicamente que o kernel está 'correto' de acordo com uma especificação. L4 é um bom exemplo disso.


Verifique suas fontes. A página da Wikipédia não foi citada. www2.cs.uh.edu/~rzheng/course/COSC6397sp2008/…
monksy

2

O kernel monolítico é um processo grande e único, executando inteiramente em um único espaço de endereço. É um único arquivo binário estático. Todos os serviços do kernel existem e são executados no espaço de endereço do kernel. O kernel pode invocar funções diretamente. Os exemplos de sistemas operacionais monolíticos baseados em kernel são Linux, Unix.

Acho que este post vai ajudar você a entender melhor o conceito.

http://learnlinuxconcepts.blogspot.in/2014/03/what-are-monolithic-and-micro-kernels.html


Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.