Windows NT contro Unix: ecco perché la piattaforma Microsoft ne usciva vittoriosa

Le caratteristiche innovative di Windows NT al momento del suo lancio nel 1993, confrontate con i sistemi Unix contemporanei. Attraverso l'analisi di un noto sviluppatore, presentiamo i vantaggi dell'architettura ibrida, del supporto per multiprocessore, del kernel preemptive e del modello di gestione della memoria virtuale.

A distanza di anni, Windows NT è spesso descritto come un sistema operativo all’avanguardia, specialmente se confrontato con i sistemi Unix dell’epoca. Julio Merino, ingegnere software in forze presso Snowflake, società specializzata nelle soluzioni per il cloud computing, ex Microsoft ed ex Google, ha voluto esplorare nel dettaglio le caratteristiche che rendevano NT così innovativo al momento del suo lancio nel 1993, mettendole a confronto con i sistemi Unix-like di allora come 4.4BSD (giugno 1994) o Linux 1.0 (marzo 1994).

Unix nacque nel 1969 con l’obiettivo primario di essere una piattaforma orientata allo sviluppo software. La portabilità e il multitasking non erano obiettivi iniziali, ma furono aggiunti successivamente nei vari fork. Windows NT, concepito nel 1989 e rilasciato nel luglio 1993, partì con finalità chiare e ambiziose: portabilità, supporto per sistemi multiprocessore (SMP), compatibilità con DOS, Windows legacy, OS/2 e POSIX.

Come sottolinea Merino, gli obiettivi immediatamente fissati per Windows NT diedero al sistema operativo Microsoft un vantaggio significativo: “NT partì con solidi principi di progettazione fin dall’inizio. In altre parole: queste caratteristiche erano tutte presenti dal primo giorno e non aggiunte in una fase successiva come in molti sistemi di derivazione Unix“.

D’altra parte lascia di stucco ancora oggi il fatto che su Windows NT i programmi si avviavano all’istante, diversamente rispetto a quanto accade oggi con hardware molto più avanzato. Sintomo di un’architettura software ben congegnata e ottimizzata al massimo per sfruttare le risorse disponibili senza inutili eccessi.

Windows NT vs Unix: architettura del kernel

Unix è tipicamente implementato come un kernel monolitico che espone una collezione di system call. Windows NT, d’altra parte, adotta un approccio ibrido che combina elementi di un kernel monolitico e di un microkernel.

L’executive è un componente di Windows NT che opera con i massimi privilegi, cioè con accesso completo e diretto alle risorse hardware e alle funzionalità critiche del sistema. Questo “componente privilegiato” integra un insieme di moduli che gestiscono vari aspetti del sistema operativo, come la gestione della memoria, il file system e le comunicazioni interprocesso. L’executive è responsabile per la fornitura di servizi fondamentali e per la gestione dell’hardware, simile al kernel in Unix, e dell’interazione con i sottosistemi user-space.

I sottosistemi user-space sono processi speciali che operano al di sopra dell’executive. Sono intermediari tra le applicazioni e il sistema operativo: ad esempio, un’applicazione che utilizza API POSIX (un insieme di standard per l’interoperabilità tra sistemi operativi) può fare richieste di servizio tramite queste API.

Hardware Abstraction Layer (HAL)

Un elemento cruciale dell’executive di Windows NT è l’Hardware Abstraction Layer (HAL), che fornisce primitive astratte per accedere all’hardware della macchina. Merino enfatizza l’importanza dell’HAL: “questo layer è la chiave che permette a NT di funzionare su varie architetture, inclusi i386, Alpha e PowerPC. Per mettere in prospettiva l’importanza del HAL, gli Unix contemporanei erano accoppiati a un’architettura specifica“.

Basti pensare, inoltre, che l’HAL è arrivato fino ai giorni nostri essendo presente anche in Windows 10 e Windows 11. HAL è una componente fondamentale di Windows, che fornisce un’interfaccia tra il sistema operativo e l’hardware sottostante, facilitando l’interazione tra i due.

Supporto per Multiprocessing e Kernel Preemptive

Windows NT nasce fin dall’inizio per supportare sistemi multiprocessore e implementa un kernel preemptive. Merino osserva: “il kernel ha vari livelli di interrupt (SPL in terminologia BSD) per determinare cosa può interrompere cosa (ad esempio, un’interrupt di clock ha priorità più alta di un’interrupt del disco), ma, cosa più importante, i thread del kernel possono essere preempted rispetto ad altri thread del kernel. Questo è ‘ovviamente’ ciò che ogni sistema Unix ad alte prestazioni fa oggi, ma non è in questo modo che molti sistemi Unix funzionavano all’epoca“.

Un kernel preemptive è una tipologia di kernel che consente l’interruzione (o “preemption“) di un thread o processo in esecuzione a partire da un altro thread o processo di priorità più alta. Questo approccio è fondamentale per garantire la reattività e l’efficienza del sistema operativo, specialmente in ambienti multiutente e multiprocessore.

Gestione degli oggetti

Merino evidenzia tre vantaggi chiave dell’approccio di Windows NT orientato agli oggetti nel kernel, una caratteristica che lo distingueva nettamente dai sistemi Unix.

Il controllo d’accesso centralizzato faceva sì che gli oggetti fossero creati esclusivamente dal gestore degli oggetti: c’era un unico punto nel codice per applicare le policy. Gli oggetti hanno un’identità e sono tutti rappresentati in un unico albero. Ciò significa che esiste un namespace unico per tutti gli oggetti, non importa se stiamo parlando di processi, handle di file o pipe.

Tutti i tipi di oggetti hanno in Windows NT uno stato segnalato, le cui semantiche sono specifiche per ogni tipo di oggetto. Ciò rende semplice scrivere codice asincrono in ambito user-space poiché una singola system call di tipo “wait” può attendere che un gruppo di oggetti cambi il proprio stato, indipendentemente dal loro tipo.

Processi e thread

Windows NT differisce significativamente da Unix nella gestione dei processi. In Unix, i processi formavano una struttura ad albero; in NT, sono entità indipendenti dopo la creazione.

Se da un lato la piattaforma Microsoft supportava i thread fin dall’inizio, molti Unix li hanno introdotti successivamente. Merino fa notare: “Linux ha scelto di rappresentare i thread come processi, ciascuno con il proprio PID, al rilascio della versione 2.0 datata giugno 1996; NetBSD non ha ottenuto i thread, rappresentati come entità separate dai processi, fino al suo rilascio 2.0 nel 2004“.

Memoria virtuale

Lo sviluppatore fa notare che Windows NT ha inoltre adottato fin dall’inizio un’architettura basata sull’uso di memoria unificata, uno schema che si pone in posizione opposta rispetto ai sistemi Unix di quell’epoca. “Le implementazioni Unix più vecchie avevano cache di memoria separate per il file system e la memoria virtuale; soltanto nel 1987 che SunOS implementò un’architettura di memoria virtuale unificata per ridurre l’overhead di questo vecchio design“, chiarisce Merino.

Come caratteristica aggiuntiva, assolutamente avanzata per quegli anni, Windows NT supportava anche il paging di parti del kernel.

Sottosistema I/O e file system

Progettato per supportare più file system, Windows NT introdusse il suo NTFS. Per quei tempi NTFS era un file system molto avanzato, dal momento che integrava anche caratteristiche “inedite” come l’indirizzamento a 64 bit, il journaling e i nomi file Unicode.

Merino ricorda, a questo proposito, che soltanto nel 1990, con il rilascio di 4.3BSD, i sistemi BSD ottennero l’astrazione del Virtual File System (VFS) per supportare più di UFS. “Linux non ha ricevuto il supporto per i file a 64 bit fino alla fine degli anni ’90 e non ha ottenuto il journaling fino al lancio del file system ext3 nel 2001“.

Conclusioni

Merino conclude che NT era una tecnologia rivoluzionaria al momento del lancio, con molte caratteristiche che oggi diamo per scontate nei sistemi operativi moderni.

Nel frattempo il mondo è cambiato, tanto che oggi le differenze tra l'”approccio NT” e i moderni sistemi Unix-like sono meno marcate: “è vero che NT aveva principi di progettazione più solidi all’inizio e più funzionalità rispetto ai suoi sistemi operativi contemporanei, ma oggi… le differenze sono sfocate“.

L’analisi tecnica di Merino conferma ancora una volta come NT abbia introdotto innovazioni significative nel campo dei sistemi operativi, molte delle quali sono state successivamente adottate in altre piattaforme. La forte spinta verso l’innovazione, figlia dello strenuo lavoro degli storici ingegneri software Microsoft, si è annacquata con il rilascio delle versioni Windows più recenti.

Ti consigliamo anche

Link copiato negli appunti