Si sente spesso insultare Linux in questo modo:

È un sistema operativo che usa ancora un kernel monolitico degli anni ‘70

Farà piacere sapere a chi afferma questo con lo scopo di denigrare Linux che Windows ha un kernel monolitico, e anzi.. “più” monolitico di Linux.. (anche se lo chiamano Kernel Ibrido)

E ora vi spiego anche perché..

Iniziamo a capire cos’è un kernel..

Kernel

Prima di tutto: Linux È il kernel, dire “Kernel di Linux” non è corretto.. perché il kernel non è parte di Linux, Linux è un kernel! :D

il kernel (nucleo) è un programma che si occupa di dare le funzionalità di base per l’utilizzo di un computer come:

  • gestione della CPU (o processore), che è quell’hardware che esegue effettivamente i programmi
  • gestione della memoria (RAM e non solo), nella quale vengono caricati i dati su cui si lavora, compresi i programmi stessi (un programma viene caricato in RAM prima di poter essere eseguito)
  • gestione della comunicazione con le periferiche ( I/O – Input/Output)
  • può fornire il multi-tasking: a voi sembra che più programmi funzionino contemporaneamente, in realtà è un illusione creata grazie alla velocità di esecuzione del processore, si esegue un pezzo di ogni programma per volta, ma sempre uno alla volta (a meno di non avere sistemi a più processori, come i nuovi Dual Core / Quad Core e dei programmi scritti per sfruttare questi sistemi)
  • schedulazione dei processi: decide in che ordine e “quanto” allocare il processore ai singoli programmi (processi) attivi.
  • crea lo spazio degli indirizzi che le applicazioni sovrastanti possono utilizzare (qui si crea il limite dei 4 GB di RAM nei kernel Windows ad esempio, in Linux questo limite è 64GB )
  • fornire dei modi per far comunicare i programmi
  • meccanismi di sicurezza
  • una serie di servizi.. ( system calls – chiamate di sistema )

Il Kernel è il sistema operativo, anche se siamo abituati a concepirlo come “un insieme di programmi”. In windows anche l’interfaccia grafica fa parte del Kernel, in Linux invece è un programma “utente” che gira sopra il kernel.

I servizi messi a disposizione dal server non sono in genere orientati agli utenti, non direttamente almeno. Sono orientati ai programmi: ad esempio ci sarà un servizio che permette di preparare l’esecuzione di un programma, uno che permette di scrivere sulla memoria.. e così via.. In windows anche tutto il server grafico (come già detto) è composto da servizi, tutti forniti dal Kernel del sistema.

Ma se il Kernel è un programma.. cos’ha di diverso dagli altri programmi?

È molto semplice: è molto più difficile programmare un kernel perché si utilizza direttamente l’hardware, non esistono meccanismi di protezione e un piccolo errore può bloccare tutto il sistema.

I programmi che utilizziamo di solito girano SOPRA al kernel, in uno spazio protetto (detto user space, spazio utente). I programmi in user-space non possono scrivere in qualunque area di memoria (neppure per sbaglio) perché è il kernel che si preoccupa che questo non accada! Se un programma si blocca (auspicabilmente) il Kernel non si blocca e il sistema resta utilizzabile.

In contrapposizione non c’è nulla che controlla l’operato del Kernel e quindi, come già detto, un piccolo errore può far crashare l’intero sistema, bloccandolo e forzandoci al riavvio! Lo “spazio” senza protezioni e complesso in cui “gira” il kernel si chiama kernel-space.

In genere anche tutti i driver e l’architettura di rete funzionano in kernel space, ecco perché un driver difettoso può rendere instabile tutto il sistema (sia su windows che su Linux).

Come state iniziando a capire.. tutti i programmi che girano in kernel-space possono causare problemi di stabilità, corruzione dei dati ecc.. ecc..

Kernel Monolitico e Microkernel

Esistono sostanzialmente 2 tipologie di kernel:

  • microkernel: visto che scrivere un programma in kernel space è difficile e rischioso si scrive un kernel minimale con “lo stretto indispensabile” ad utilizzare l’hardware, e quindi si scrivono tutti i servizi (chiamate di sistema) in user-space, esse comunicano direttamente con il kernel minimale, tutte le altre applicazioni in user-space possono decidere di utilizzare le chiamate di sistema o riferirsi direttamente al microkernel. L’approccio è più sicuro e semplice da programmare ma meno efficiente dal punto di vista delle prestazioni perché la comunicazione tra chiamate di sistema e kernel deve avvenire tramite uno scambio di messaggi che appesantisce tutto il sistema. I driver girano in user space.
  • kernel monolitico: tutto quanto necessario ad usare il sistema e a fornirne un utilizzo ai programmi che vi girano è programmato in un unico programma (monolitico) che gira in kernel-space. I driver (solitamente) girano in kernel-space.

Alcuni sostengono che il kernel monolitico sia obsoleto e i microkernel siano superiori.
Kernel Linux, Kernel Windows

Linux è un kernel monolitico ma modulare..

mi spiego: un kernel monolitico “standard” prevede che tutto il kernel funzioni come un blocco unico, in Linux invece parti di kernel (moduli), in genere driver, possono essere inseriti nel kernel durante il suo utilizzo, e secondo le necessità.

Il kernel Windows è stato battezzato dalla Microsoft: Kernel Ibrido ( Hybrid Kernel )

Il motivo è che (secondo Microsoft) il kernel di windows è un “miscuglio” di microkernel e kernel monolitico, nella pratica hanno scritto un microkernel, e lo hanno fatto comunicare tramite messaggi con i restanti servizi ( server grafico compreso ) ma fanno girare il tutto in “kernel-space”

In altre parole hanno preso il peggio dei 2 sistemi ( unico vantaggio una semplicità maggiore ad implementarlo )

In più il numero di chiamate di sistema messe a disposizione dal kernel Windows è molto più alto del kernel Linux (questo è dovuto principalmente alla presenza del server grafico di windows all’interno del kernel), e più chiamate non vuol dire meglio, vuol dire più complessità.. e più possibilità di trovare problemi e bachi di sicurezza!

Ecco perché il kernel di windows è “più” monolitico di Linux, e di conseguenza l’insulto: “Linux è obsoleto perché usa ancora un kernel monolitico” denota ignoranza, inclinazione a parlare senza prima informarsi e per sentito dire / luoghi comuni nonché un certo grado di trollaggine¹

Nota finale: su Linux esistono alcuni driver che funzionano in User-Space

Link di approfondimento:

Wikipedia [EN]: Kernel

Wikipedia [EN]: Kernel Monolitico

Wikipedia [EN]: MicroKernel

Wikipedia [EN]: Kernel Ibrido

Kernel Linux ( 2.6.20 ) e Kernel di Windows (Vista) a confronto ( grazie a Debianway per il link)

Descrizione del kernel Linux [EN]

¹ trollaggine: troll è una parola che si utilizza nel gergo di internet per indicare una persona che comunica in modo provocatorio, irritante o stupido.. “trollaggine” è un derivato che ho inventato sul momento :P