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..

Versione 1.1 – 2010/01/04

  • Spiegato dove trovare il kernel Linux e i suoi moduli
  • Separato sezione Kernel Linux da Kernel Windows
  • Spiegato meglio le differenze tra microkernel e kernel monolitico
  • Aggiunte informazioni sul WDDM di microsoft prendendo direttamente dalla documentazione microsoft
  • Aggiornamento a Windows Seven
  • Un po’ di chiarimenti per i sistemi multiprocessori nell’introduzione sui kernel

Kernel

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

Windows invece è l’insieme di software forniti con un dvd/computer, tra cui il kernel di windows.

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 (o dei processori in caso di multi-processore/multi-core)
  • 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 (o i processori) ai singoli programmi (processi) attivi.
  • In caso di sistemi multi-processore / multi-core ne coordina l’operato e la distribuzione del calcolo
  • 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. L’esempio tipico in questo caso è Andy Tanenbaum, un docente di informatica americano che sostiene i microkernel definendo sorpassati i kernel monolitici (nel 92 c’è stata un’accesa conversazione tra il professore e Linux Torvalds [1]). Io qui espongo solo dei fatti, penso semplicemente che non sia tutto bianco o nero, buono o sbagliato. Il kernel monolitico ha dei pregi e il microkernel ne ha degli altri. A seconda dell’utilizzo che se ne fa (e dei kernel di un tipo e dell’altro che si trovano in circolazione) si può scegliere una delle due strade.

Nei commenti mi hanno accusati di dar dell’ignorante a Andy Tanenbaum: se leggete attentamente il mio articolo non dico mai che un kernel monolitico è meglio di un microkernel; confronto in realtà 2 kernel monolitici: Windows e Linux.
Kernel Linux

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à.

Su una qualunque distribuzione Linux potete trovare il file contenente il kernel nella directory /boot/, il nome del file può essere qualunque ma in genere comincia con vmlinuz-; solitamente ce ne sono diversi perché all’avvio potete scegliere quale eseguire; nella stessa directory trovate anche le configurazioni dei vari kernel (che cominciano per config-): ovvero le opzioni con cui è stato compilato il kernel, com’è stato costruito.

Quasi tutta la configurazione è un elenco di moduli del kernel, per ognuno è specificato il tipo di compilazione con il kernel: fuso insieme al kernel principale, come modulo o assente.

Ciò che è compilato come modulo si trova nella directory /lib/modules/, ogni modulo per ogni kernel installato ha un suo file che può essere caricato o scaricato in qualunque momento.

Su Linux esistono alcuni driver che funzionano in User-Space

Kernel Windows

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!

In XP il server grafico era totalmente integrato nel kernel, in Vista c’è stato uno sforzo per tentare di portarlo al di fuori del kernel ma il lavoro è stato svolto solo in parte e il nucleo del sistema grafico è ancora nel kernel. In Windows Seven non è cambiato molto (per quest’aspetto) riguardo il kernel e il driver grafico che è ancora in parte nel kernel.

Per gli scettici riporto qui un estratto della documentazione Microsoft [2]

“In Windows XP, display drivers, which are large and complex, can be a major source of system instability. These drivers execute entirely in kernel mode (i.e., deep in the system code) and hence a single problem in the driver will often force the entire system to reboot.
[…]
(Parlando ora di Windows Vista)

At a technical level, WDDM display drivers have two components, a kernel mode driver (KMD) that is very streamlined, and a user-mode driver that does most of the intense computations. With this model, most of the code is moved out of kernel mode”

e lo traduco per i non anglofoni

“In Windows XP, i driver grafici, che sono grandi e complessi, possono essere una delle cause maggiori di instabilità del sistema. Questi driver eseguono interamente in kernel mode (cioè profondamente all’interno del codice del sistema) di conseguenza un piccolo problema nel driver causerà il più delle volte un riavvio dell’intero sistema.
[…]
(Parlando ora di Windows Vista)

Ad un livello tecnico, il driver grafico WDDM ha due componenti, un driver in kernel mode (KMD) molto semplificato, e un driver in user mode che effettua i calcoli più complessi. Con questo modello gran parte del codice è spostato all’esterno del kernel mode”

E’ Microsoft stessa a confermarvi quel che vi dico in questo articolo, ancora dubbi in proposito? Se leggendo “driver grafici” avete pensato a quelli della scheda video vi correggo immediatamente: si parla dei WDDM (per Vista) e del suo predecessore in XP, che sono appunto i driver del sistema grafico di windows. In Seven WDDM è stato aggiornato ma una parte funziona ancora in kernel mode.

Corollario

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¹

Link di approfondimento:

Wikipedia [EN]: Kernel

Wikipedia [EN]: Kernel Monolitico

Wikipedia [EN]: MicroKernel

Wikipedia [EN]: Kernel Ibrido

Wikipedia [EN]: Windows Display Driver Model (WDDM)

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😛