Kernel

miniatura|Conexións do kernel cas aplicacións de software e hardware do computador.
O **kernel** ou núcleo é o software que actúa como compoñente central dos sistema operativos, e que ten capacidade de control de todas as compoñentes do sistema. É o primeiro elemento que se inicia no arrinque do hardware do computador, que xestiona o resto de procesos, e o que traballa directamente con estes. Como compoñente básico dun sistema operativo, o kernel fornece a capa de abstracción de nivel máis baixa para os recursos (especialmente a memoria, os procesadores e os dispositivos de entrada e saída) que logo controla cada aplicación. Tipicamente, facilita estas operacións aos procesos das aplicacións mediante mecanismos de comunicación entre procesos e chamadas ao sistema.

Existen diferentes tipos de kernels e cada un afronta estas tarefas de modo distinto dependendo do seu deseño e realización. Os kernels monolíticos tentan logralas executando todo o código no mesmo espazo de enderezos para incrementar a potencia do sistema; os microkernels executan a maioría dos seus servizos no espazo do usuario, tentando mellorar a xestión e modularidade do código básico. O normal é que os kernels compartan características de ambos os dous modelos.

## Tipos 
Hai catro grandes tipos de kernel:
* ***Kernel monolítico***. Potente kernel que facilita a abstracción do hardware. Existe unha gran variedade de kernels monolíticos.
* ***Microkernel***. Proporciona un pequeno conxunto de abstraccións simples do hardware, e usa as aplicacións chamadas servidores para ofrecer unha maior funcionalidade.
* **Kernel híbrido**. Parecido ao *microkernel*, excepto porque inclúe código adicional no espazo de núcleo para que se execute máis rapidamente.
* **Exokernel**. Non facilita ningunha abstracción, pero permite o uso de bibliotecas que proporcionan unha maior funcionalidade grazas ao acceso directo ou case directo ao hardware.

### *Microkernels* 
O enfoque micronúcleo consiste en definir unha abstracción moi simple sobre o hardware, cun conxunto de primitivas ou chamadas ao sistema que implementan servizos do sistema operativo mínimos, como a xestión de fíos, o espazo de direccionamiento e a comunicación entre procesos.

O obxectivo principal é a separación da implementación dos servizos básicos e das regras de funcionamento do sistema. Por exemplo, o proceso de bloqueo de E/S pódese implementar cun servidor en espazo de usuario executándose encima do microkernel. Estes servidores de usuario, usados para xestionar as partes de alto nivel do sistema, son moi modulares e simplifican a estrutura e deseño do núcleo. Se falla un destes servidores, non se colgará o sistema enteiro, e poderase reiniciar este módulo independentemente do resto.

Algúns exemplos de *microkernels* son AIX, BeOS, L4, Mach, Minix, MorphOS, QNX, RADIOS, VSTa e GNU Hurd.

Aínda que Mach é o *microkernel* xeneralista máis coñecido, desenvolvéronse outros *microkernels* con propósitos máis específicos. L3 desenvolveuse para demostrar que os *microkernels* non son necesariamente lentos. A familia de *microkernels* L4 é a descendente de L3, e unha das súas últimas implementacións, chamada Pistachio, permite executar GNU/Linux simultaneamente con outros procesos, en espazos de direccionamiento separados.

QNX é un sistema operativo que estivo dispoñible desde principios dos 80, e ten un deseño de *microkernel* moi minimalista. Este sistema conseguiu chegar ás metas do paradigma do *microkernel* con moito máis éxito que Mach. Úsase en situacións en que non se pode permitir que haxa fallos de software, o que inclúe desde brazos robóticos en naves espaciais, ata máquinas que púen cristal onde un pequeno erro podería custar moito diñeiro.

### *Kernels monolíticos* 
Frecuentemente prefírense os *kernels monolíticos* fronte aos *microkernels* debido ao menor nivel de complexidade que comporta o tratar con todo o código de control do sistema nun só espazo de direccionamiento.

A principios dos 90, os *kernels monolíticos* considerábanse obsoletos. O deseño de Linux como un *kernel monolítico* no canto de como un *microkernel* deu lugar a unha famosa disputa entre Linus Torvalds e Andrew S. Tanenbaum. Os argumentos de ambas as partes nesta discusión presentan algunhas motivacións interesantes.

Os *kernels monolíticos* adoitan ser máis fáciles de deseñar correctamente, e polo tanto poden crecer máis rapidamente que un sistema baseado nun *microkernel*, pero hai casos de éxito en ambos os dous bandos. Os *microkernels* adoitan usarse en robótica *embebida* ou computadoras médicas, xa que a maioría dos compoñentes do sistema operativo residen no seu propio espazo de memoria privado e protexido. Isto non sería posible cos núcleos monolíticos, nin sequera cos modernos que permiten cargar módulos.

## Notas