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