Il Sistema Operativo Windows
Evoluzione Storica
Il sistema operativo windows fu proposto all’inizio degli anni 80 come evoluzione del sistema
operativo MS-DOS. Quest’ultimo era un sistema operativo mono-programmato e mono-utente.
Il primo sistema Windows ad essere diffuso largamente fu la versione 3.0. Esso supportava in
maniera limitata la multi-programmazione; non esisteva ancora il concetto di protezione, né di
multi-utenza; lo schedulatore era non-preemptive. Esso era pensato più come una interfaccia di MSDOS piuttosto che come sistema operativo a se stante.
Parallelamente alla commercializzazione e allo sviluppo di Windows 3.0 e successive versioni, la
Microsoft cominciò a sviluppare un nucleo di sistema operativo multi-programmato che avesse tutte
le caratteristiche dei sistemi operativi allora in auge come Unix e VMS. Il risultato di tale sforzo fu
il rilascio del sistema Windows NT, rivolto principalmente al mercato professionale e al mercato
dei server. Windows NT supporta la separazione degli spazi di indirizzamento, la multiprogrammazione, la gestione della memoria, la multi utenza, la protezione delle risorse, il supporto
al networking.
Per un certo tempo la Microsoft continuò a supportare due diverse linee di prodotti: sistemi
operativi per i personal computer e per l’utenza casalinga, quali Windows 95, Windows 98,
Windows Me e sistemi operativi per l’utenza professionale e per il mercato dei server, quali
Windows NT 3.5, NT 4.0 , Windows 2000, Windows 2003 server. Recentemente la Microsoft ha
unificato le due linee di prodotti in un unico sistema operativo, Windows XP. Tale sistema
operativo viene commercializzato in due versioni home e professional con alcune differenze nella
tipologia dei servizi supportati. Si tratta comunque dello stesso sistema operativo. Successivamente
la microsoft ha proposto Vista.
Windows NT, 2000, XP
 Sistema operativo a 32 bit con multitasking preemptive per microprocessori moderni .
Sottosistemi e moduli del nucleo
IL sistema operativo Windows, nato con l’idea del microkernel, è strutturato in maniera modulare e
stratificata. Si possono distinguere almeno tre diversi strati di software al suo interno:
1. lo strato di astrazione della macchina fisica (HAL, Hardware Abstraction Layer)
2. il nucleo ( Kernel)
3. l’esecutivo (Executive)
Tutti questi moduli software vengono eseguiti in modo Kernel. I sottosistemi di ambiente ( Win32
Subsystem) sono moduli e librerie che traducono le richieste dei processi utente in opportune
richieste di servizi all’Executive.
Attraverso HAL il nucleo del sistema operativo è indipendente dalla macchina fisica e può essere
portato da una macchina fisica ad un’altra cambiando lo HAL. HAL per esempio gestisce le
interruzioni a basso livello.
Il nucleo è il cuore del sistema operativo e fornisce quattro servizi fondamentali: lo scheduling dei
thread, la gestione delle interruzioni, la sincronizzazione a basso livello e la gestione del consumo
energetico. Il nucleo non viene mai paginato cioè le sue pagine non vengono mai trasferite su
memoria di massa e gira sempre in modo tale da non subire mai revoca (non preemptive).
Lo strato Executive fornisce un insieme di servizi per la modalità utente quali la gestione della
memoria virtuale, del file system, dell’I/O, la creazione dei processi e dei thread, il controllo della
sicurezza, la comunicazione inter-processo.
I processi utente possono accedere alle funzionalità del sistema tramite i sottosistemi di ambiente.
Tali moduli girano in modalità utente e il più importante , sempre presente su ogni sistema
Windows è Win32, che fornisce un’interfaccia (API) ai processi utente mappati uno a uno sui
servizi dell’executive.
Process A
User Mode
Process B
Process C
API
Win 32 Subsystem, Posix
Executive
Kernel
Mode
windowing
graphics
Kernel
Device drivers
HAL
Hardware
Il sottosistema Win 32 transla una funzione documentata in un appropriato e non documentato
servizio windows.
 Executive
-servizi base del S.O.
-gestione memoria, processi e thread
-sicurezza, I/O, comunicazione tra i processi
 Kernel
-funzioni a basso livello del sistema operativo
-schedulazione dei thread, interrupt
-sincronizzazione multiprocessore
-provvede un insieme di sottoprogrammi e oggetti di base che l’executive usa per implementare
costrutti ad alto livelloEntrambi sono contenuti nel file NtoSkrnl.exe di 2 MByte
 Device drivers (*.sys)
-convertono le funzioni I/O dell’utilizzatore in specifiche richieste I/O al dispositivo hardware
 Windowing and graphics driver (win32k.sys) GUI (graphics user interface)
 Hal isola il kernel, i device driver e l’executive dall’hardware
Quando fu progettato NT non c’era una architettura dominante per un processore. Esso fu
quindi sviluppato per essere portatile.
La maggior parte del codice e i device driver sono scritti in C. Hal e il Kernel contengono anche
linguaggio assembly. Alcuni componenti sono scritti in C++: i driver del sottosistema grafico.
NT4 aveva supporto per : X86, MIPS, Power PC, Digital Alpha
Il Kernel è pienamente rientrante, le funzioni possono essere invocate da più thread
simultaneamente. Il sistema I/O lavora in maniera pienamente asincrona
Esempio in linguaggio C di chiamata alle API di windows:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR lpCmdLine, int nCmdShow)
{
if( MessageBox(0, "Ti piace il C",
"Messaggio al mondo", MB_YESNO)==IDYES )MessageBox(0, "Sono contento",
"Risposta", MB_OK) ;
return 0;
}
Kernel Objects
Quasi tutte le risorse che Windows mette a disposizione del programmatore, sono implementate
internamente secondo il paradigma di programmazione orientata agli oggetti. Sono oggetti i
processi, i thread, i semafori, i file, le directory e così via. Gli oggetti del nucleo risiedono nella
memoria del nucleo. Il programmatore non può in nessun caso accedere direttamente a tali oggetti,
ma può manipolarli indirettamente e in maniera sicura tramite le funzioni di interfaccia
dell’executive di Windows. Tipicamente i nomi delle funzioni per creare un oggetto di nucleo
cominciano per Create, mentre le funzioni per creare un riferimento ad un oggetto esistente
cominciano per Open. Ad esempio nel caso in cui vogliamo usare un semaforo di sincronizzazione
tra due processi, il primo dovrà creare il semaforo usando la chiamata di sistema CreateSemaphore
mentre il secondo potrà aprire lo stesso semaforo chiamando la OpenSemaphore(…).
Ogni volta che un processo crea un oggetto, o apre un oggetto esistente, ottiene un riferimento di
tipo HANDLE all’oggetto. Se due processi aprono lo stesso oggetto, possono ottenere due handle
diversi.
Gestione dei processi e dei thread
In Windows il concetto di processo e il concetto di thread sono nettamente separati. Un processo in
Windows è un tipo di oggetto di nucleo che possiede determinate caratteristiche:
 Un identificatore di processo unico nel sistema
 Uno spazio di indirizzamento privato
 Uno o puù thread di esecuzione
 Una directory corrente
 Varie tabelle contenenti le risorse del processo (ad esempio la tabella degli handle aperti
Un processo è una entità che definisce uno spazio di indirizzamento ed ha bisogno di almeno un
thread da eseguire. Quando tutti i thread del processo sono terminati, il processo termina. Un thread
è una unità concorrente e schedulabile che è descritta da oggetti di nucleo. Ad un thread viene
associato un identificatore univoco nel sistema, un puntatore allo stack. Tutti i thread appartenenti
allo stesso processo condividono il suo spazio di indirizzamento.Quando un processo viene creato,
viene automaticamente creato il suo thread primario. Windows supporta due tipi di applicazione. Le
applicazioni grafiche (o GUI Graphical User Interface) e le applicazioni testo ( Consol User
Interface).