65536 * 16 = 1048576 byteGrazie a questo accorgimento, la CPU converte facilmente un indirizzo logico in un indirizzo fisico. La formuletta che consente alla CPU di convertire un indirizzo logico seg:offset in un indirizzo fisico a 20 bit è:
(seg * 16) + offsetQuesto modo di accedere alla RAM prende il nome di modalità di indirizzamento reale 8086. Il termine "reale" si riferisce al fatto che gli indirizzi logici specificati dal programmatore corrispondono ad indirizzi fisici realmente esistenti in memoria; per parecchio tempo la modalità reale è stata un vero e proprio incubo per i programmatori costretti a spezzettare i loro programmi in tanti blocchi da 64 Kib ciascuno.
2.1 Il computer IBM XT 8086
L'IBM XT 8086 è un computer destinato non solo alle università o ai grandi centri di ricerca, ma anche ad un mercato più vasto formato soprattutto dalle piccole e medie aziende; l'obiettivo fondamentale quindi è quello di diffondere l'uso del computer anche tra un pubblico privo di conoscenze di informatica. Per consentire a chiunque di utilizzare un computer senza conoscerne il funzionamento interno, la IBM equipaggia l'XT 8086 con un apposito Sistema Operativo (SO); il SO è un software che ha lo scopo di creare un'interfaccia tra l'utente e il computer. L'utente dialoga con il computer impartendogli dei comandi formati da termini come DIR, MKDIR, COPY, DEL, etc; il SO riceve questi comandi, li traduce nel linguaggio binario del computer e li fa eseguire dall'hardware. Un'altro compito fondamentale di un SO è quello di far girare i programmi; in questo modo gli utenti possono anche scrivere o acquistare i programmi più adatti alle loro esigenze, facendoli eseguire dal computer.2.1.1 Il sistema operativo del computer IBM XT 8086 (MS-Dos)
Questo nome deriva dal fatto che all'epoca, la configurazione standard dell'XT 8086 era formata dal PC con 1 Mib di RAM, scheda video in modalità testo (alfanumerica) e memoria permanente formata da un lettore di floppy disk da 5"1/4, o al massimo "ben" due lettori di floppy disk; gli hard disk da pochi Mib rappresentavano ancora un lusso che solo pochi fortunati potevano permettersi. Il DOS organizza il disco come se fosse un armadio da ufficio suddiviso in tanti ripiani; ogni ripiano rappresenta una cartella (directory)."640 Kib rappresentano una quantità enorme di memoria, più che sufficiente per qualunque applicazione presente e futura!"Uno degli aspetti più scomodi del DOS è rappresentato dalla sua interfaccia in modalità testo; dopo aver acceso il computer l'utente si trova davanti uno schermo nero con un cursore bianco lampeggiante che viene chiamato prompt del DOS. Lo schermo viene trattato dal DOS come se fosse il foglio di una macchina da scrivere, o per meglio dire, il foglio di una telescrivente (l'antenata della stampante); il prompt rappresenta la testina della telescrivente che può muoversi in orizzontale e andare a capo grazie ad una sorta di carrello virtuale. Non a caso, il tasto [Invio] (o [Enter]) viene chiamato "ritorno carrello" perché premendolo si manda a capo il prompt posizionandolo all'inizio di una nuova linea; questo tipo di interazione tra utente e computer è piuttosto grossolano ed ha anche il difetto di costringere l'utente stesso a leggere grossi manuali per poter imparare tutti i comandi del DOS. Questo problema riguarda praticamente tutti i SO dell'epoca anche perché l'hardware disponibile non consente ancora l'applicazione di una soluzione alternativa ideata ben dieci anni prima; questa soluzione alternativa si chiama Interfaccia Grafica Utente o GUI (Graphic User Interface).
2.2 La Graphic User Interface (GUI)
Nei primi anni 70 un gruppo di ricercatori dei laboratori Xerox di Palo Alto (California) mette a punto un progetto destinato a sconvolgere completamente il mondo dei computers; secondo questo progetto l'utente interagisce con il computer attraverso uno schermo grafico che mostra tutta una serie di oggetti tra i quali figurano finestre, menu di scelta, pulsanti, icone, immagini, etc. L'oggetto più importante di una GUI è sicuramente la finestra (window) che rappresenta una sorta di "schermo virtuale"; un SO capace di far girare più programmi contemporaneamente, associa una finestra a ciascun programma in modo che ogni programma abbia a disposizione il suo schermo virtuale attraverso il quale dialogare con l'utente. I ricercatori della Xerox mettono a punto anche un dispositivo di puntamento corrispondente all'attuale mouse, che permette all'utente di muoversi agevolmente tra gli oggetti dello schermo; tutti questi concetti oggi possono apparire abbastanza ovvi, ma negli anni 70 vengono accolti come una vera e propria rivoluzione.2.3 Le schede di espanzione di memoria
L'irruzione della grafica nel mondo dei PC mette in risalto non solo le scarse prestazioni delle CPU 8086 ma anche l'assoluta insufficienza dell'unico Mib di memoria disponibile; la caratteristica fondamentale degli oggetti grafici come le icone, i menu e soprattutto le immagini, è proprio quella di richiedere notevoli quantità di memoria. Per cercare di risolvere questi problemi, cominciano a comparire sul mercato costosissime schede hardware chiamate espansioni di memoria; grazie a queste schede anche le CPU a 16 bit possono disporre di ben 32 Mib di memoria oltre al solito Mib di RAM; per poter accedere a questa memoria esterna chiamata memoria espansa, la CPU utilizza la solita tecnica dell'I/O memory mapped. In sostanza, viene creata nella RAM una frame window da 64 Kib che può essere fatta "puntare" dai programmi alla zona desiderata della memoria espansa; anche in questo caso quindi si nota che i programmi possono vedere al massimo 64 Kib di memoria espansa alla volta. Per mettere ordine nel mondo delle schede di espansione di memoria, nasce un consorzio di aziende formato da Lotus, Intel e Microsoft (LIM); il lavoro svolto dal consorzio LIM porta alla nascita dello standard EMS (Expanded Memory Specifications). Lo standard EMS definisce l'interfaccia di programmazione (API) attraverso la quale i programmi possono accedere alla memoria espansa; per maggiori dettagli sullo standard EMS si veda la sezione Assembly Avanzato.2.4 Windows 2.0
Nel 1987 la Microsoft annuncia l'uscita di Windows 2.0 che oltre a presentare diversi miglioramenti estetici rispetto a Windows 1.0, offre anche il supporto completo della memoria espansa; in questo modo, le applicazioni per Windows 2.0 possono beneficiare di una notevole quantità di memoria rispetto all'unico Mib di RAM sfruttabile con Windows 1.0. Ogni applicazione riceve da Windows 2.0 un'area di memoria espansa riservata in esclusiva all'applicazione stessa e protetta quindi da tentativi di "intrusione" da parte di altre applicazioni; pur permanendo il problema della segmentazione a 64 Kib della memoria, bisogna dire che l'avvento della memoria espansa rappresenta un notevole passo avanti per il mondo dei PC.2.5 La CPU Intel 80286
La vera novità arriva invece con l'80286 che è una CPU dotata di registri a 16 bit, Data Bus a 16 bit e soprattutto Address Bus a 24 bit; con un Address Bus a 24 bit l'80286 può gestire sino a 224 byte di memoria RAM fisica, pari a 16777216 byte (16 Mib). L'aspetto importante è dato dal fatto che non si tratta di memoria periferica distinta dal solito Mib di memoria base, ma di un vero e proprio prolungamento della memoria RAM che viene chiamato memoria estesa; questo significa che una CPU 80286 accede a questi 16 Mib specificando l'indirizzo lineare a 24 bit 0, 1, 2, ..., sino a 16777215. L'obiettivo fondamentale della Intel è quello di mantenere la compatibilità con l'enorme quantità di software scritta per le CPU 8086; per questo motivo, appena si accende il computer l'80286 viene inizializzata in modalità di emulazione dell'8086. Questa modalità viene ottenuta disabilitando la linea A20 dell'Address Bus; in questo modo si impedisce ai programmi di accedere agli indirizzi fisici superiori a FFFFFh, proprio come accade con l'8086.2.5.1 La modalità protetta della CPU Intel 80286
In alternativa alla modalità reale la CPU 80286 dispone anche di una nuova modalità operativa chiamata modalità protetta; questo nome deriva dal fatto che in questa modalità l'80286 permette ad un SO di far girare "contemporaneamente" più programmi con meccanismi di protezione che impediscono ai programmi stessi di interferire tra loro. In modalità protetta i programmi hanno la possibilità di sfruttare tutti i 16 Mib di memoria fisica indirizzabile dalla CPU superando in questo modo il limite dei 640 Kib imposto dalla modalità reale; questo obiettivo viene raggiunto grazie ad un uso differente dei registri di segmento. In modalità protetta i registri di segmento vengono chiamati selettori e il loro contenuto assume la struttura mostrata in Figura 2.1. I 13 bit più significativi del registro di segmento contengono un numero compreso tra 0 e 8191. Questo numero rappresenta un indice che seleziona uno tra gli 8192 possibili elementi presenti in una tabella chiamata descriptor table (tavola dei descrittori); ciascun elemento di questa tabella viene chiamato appunto descrittore e contiene la descrizione completa del segmento di programma puntato dal registro di segmento. Questa descrizione comprende il tipo di segmento (scrivibile, leggibile, eseguibile), le dimensioni del segmento (segment limit) e soprattutto l'indirizzo di memoria da cui parte il segmento stesso (base address); nel caso delle CPU 80286 questo indirizzo è formato da 24 bit. Ogni volta che la CPU deve accedere ad un offset all'interno di un segmento di programma, somma quest'offset al base address del segmento stesso per ottenere l'indirizzo lineare a 24 bit; se la CPU incontra ad esempio il codice macchina di una istruzione del tipo:mov ax, [bx]somma l'offset contenuto in BX al base address del segmento di programma puntato da DS ottenendo un indirizzo fisico a 24 bit; a questo punto la CPU accede a quell'indirizzo, legge 16 bit di dati e li trasferisce in AX. Come si può facilmente intuire, l'80286 con i suoi registri a 16 bit permette di specificare offset compresi tra 0 e 65535; questo significa che neanche questa CPU riesce a risolvere il problema della segmentazione a 64 Kib della memoria. In pratica, quando si opera in modalità protetta, la CPU 80286 permette di scavalcare la barriera dei 640 Kib e di accedere ad un massimo di 16 Mib di RAM; questi 16 Mib vengono però suddivisi in tanti blocchi da 64 Kib analogamente a quanto succede con l'8086.
2.5.2 Il supporto per la memoria virtuale della CPU Intel 80286
Un'altra importante caratteristica dell'80286 è il supporto per la cosiddetta memoria virtuale; in pratica, anche se il computer non dispone fisicamente di tutti i 16 Mib di RAM, l'80286 permette ugualmente di simulare la memoria sfruttando l'hard disk. In questo modo è possibile eseguire programmi che richiedono più memoria di quella fisicamente disponibile; il trucco consiste nello scaricare sull'hard disk quei segmenti di programma che in un dato momento non sono necessari per l'esecuzione del programma stesso. Per sapere se un segmento di programma si trova in memoria o sull'hard disk si utilizza un bit del descrittore di segmento; questo bit viene indicato con P e prende il nome di present bit (bit di presenza). Se P=1, il corrispondente segmento di programma è in memoria; se invece P=0 allora il corrispondente segmento di programma è sull'hard disk. Se si prova ad accedere ad un segmento di programma che ha P=0, la CPU genera un errore (eccezione di segmento non presente); il SO intercetta questo errore, scarica sull'hard disk un segmento di programma non più necessario e carica in memoria il segmento di programma richiesto dal precedente tentativo di accesso.2.5.3 Il multi-tasking
Tutte queste caratteristiche della CPU 80286 sono state concepite espressamente per favorire la realizzazione di SO capaci di far girare più programmi contemporaneamente; i SO di questo tipo vengono definiti multitask per indicare la capacità di eseguire più compiti (task) alla volta. Naturalmente con un'unica CPU a disposizione è possibile eseguire un solo programma alla volta; per ottenere il multitasking si utilizza un noto espediente chiamato time sharing (ripartizione del tempo). In sostanza, il SO fa girare uno alla volta tutti i programmi assegnando a ciascuno di essi un piccolo intervallo di tempo di esecuzione; in questo modo l'utente ha l'impressione che i vari programmi stiano girando contemporaneamente.2.5.4 Il table indicator
I SO multitasking sfruttano ampiamente gli altri due campi presenti nel selettore di segmento descritto in Figura 2.1; il bit in posizione 2 del selettore viene indicato con TI e rappresenta il Table Indicator (indicatore del tipo di tabella). Se TI=0 allora il selettore punta ad una Global Descriptor Table (GDT); se invece TI=1 allora il selettore punta ad una Local Descriptor Table (LDT). Generalmente il SO riserva per se stesso la GDT ed assegna ad ogni programma in esecuzione una propria LDT; queste tabelle vengono inizializzate dal SO e caricate in memoria con le apposite istruzioni LGDT (Load GDT) e LLDT (Load LDT) disponibili solo in modalità protetta.2.5.5 Il Request Privilege Level
I due bit in posizione 0 e 1 nel selettore di Figura 2.1, vengono indicati con RPL e rappresentano il Request Privilege Level (livello di privilegio); l'RPL indica il livello di privilegio assegnato al segmento di programma puntato dal campo indice del selettore. In questo modo, il SO può implementare un meccanismo che protegge determinati segmenti di programma dai tentativi di intrusione da parte di altri segmenti di programma meno privilegiati; infatti, se da un segmento di programma si prova ad accedere ad un'altro segmento di programma più privilegiato, la CPU genera un errore (violazione di privilegio). Con i due bit del campo TI possiamo formare i quattro numeri 0, 1, 2 e 3; per convenzione, il livello 0 rappresenta il privilegio più alto (ring 0) mentre il livello 3 rappresenta il privilegio più basso (ring 3). Per questo motivo i SO riservano per se stessi i livelli di privilegio più alti e assegnano ai normali programmi i livelli di privilegio più bassi; in questo modo si evita che un normale programma possa danneggiare il SO. La Figura 2.2 mostra un esempio sulla ripartizione dei livelli di privilegio in un SO; la parte più privilegiata è quella colorata in rosso che rappresenta il kernel. Il termine kernel deriva dal tedesco e significa "nucleo" per indicare la parte più interna del SO che gestisce direttamente l'hardware del computer; si tratta chiaramente della componente più delicata di un SO e deve quindi godere del massimo livello di protezione dalle interferenze esterne. Il livello di privilegio 1 viene in genere assegnato ai servizi di sistema; si tratta dell'insieme di servizi (gestione files, gestione memoria, etc) che i SO mettono a disposizione dei normali programmi. Il livello di privilegio 2 viene in genere assegnato alle estensioni del SO; si tratta di programmi che pur non facendo parte del SO ne estendono le capacità fornendo ulteriori servizi per le normali applicazioni. Un esempio pratico è rappresentato dai device drivers attraverso i quali i SO possono pilotare periferiche collegate al computer; il livello di privilegio più basso (3) viene naturalmente assegnato ai normali programmi utilizzati dall'utente.2.5.6 La modalità d'indirizzamento in modalità protetta della CPU Intel 80286
In base alle considerazioni appena svolte, si deduce che l'80286 è in grado di indirizzare sino a 1 Gib di memoria virtuale; osserviamo infatti che con i 13 bit del campo indice del selettore di segmento possiamo rappresentare 213=8192 descrittori di segmento differenti. Attraverso il campo TI del selettore possiamo specificare se i descrittori si trovano nella GDT o nella LDT; con queste due tabelle possiamo gestire in totale:2 * 8192 = 16384descrittori differenti, e siccome ogni segmento di programma è grande 65536 byte, otteniamo una memoria virtuale totale pari a:
16384 * 65536 = 1073741824 byte (1 Gib).
2.6 La CPU Intel 80386
Per superare anche il problema della segmentazione a 64 Kib della memoria è stato necessario attendere l'arrivo della CPU 80386; si tratta di una CPU dotata di registri a 32 bit, Data Bus a 32 bit e Address Bus a 32 bit. Con un Address Bus a 32 bit l'80386 può indirizzare sino a 232 byte di memoria fisica (4 Gib); questa CPU estende e potenzia la modalità protetta dell'80286 ed apre veramente una nuova era per i PC. In modalità protetta il base address di un descrittore di segmento dell'80386 è un indirizzo a 32 bit, ma la cosa più importante è che anche i registri dell'80386 sono a 32 bit; con un registro a 32 bit possiamo specificare un offset che può assumere tutti i valori compresi tra 0 e 4294967295. Tutto ciò significa che anche l'80386 gestisce la memoria in modo segmentato, con la differenza però che con questa CPU i segmenti sono virtualmente da ben 4 Gib ciascuno! Un'altra caratteristica che testimonia l'abisso che esiste tra l'80286 e l'80386 è che l'80386 sfruttando l'hard disk e i segmenti da 232 byte è in grado di gestire sino a:2 * 213 * 232 = 246byte di memoria virtuale pari a 64 Tib (terabyte)!
2.6.1 La modalità virtual 86 della CPU Intel 80386
Come accade per tutte le CPU Intel e compatibili, anche l'80386 appena si accende il computer viene inizializzata in modalità reale; in questo modo viene garantita la compatibilità con tutto il software scritto per le CPU precedenti. Proprio per quanto riguarda la compatibilità con i vecchi programmi, l'80386 offre una caratteristica veramente rivoluzionaria rappresentata dalla cosiddetta modalità virtuale 8086 (V86) che permette a questa CPU di eseguire programmi DOS senza uscire dalla modalità protetta; nel caso dell'80286, se ci troviamo in modalità protetta e vogliamo eseguire un programma DOS, dobbiamo prima tornare in modalità reale. La modalità V86 dell'80386 crea una macchina virtuale 8086 costituita da un'area di memoria virtuale da 1 Mib; un programma DOS gira in questo Mib virtuale credendo di trovarsi in un tipico ambiente DOS. Il Mib virtuale creato dalla modalità V86 può trovarsi in qualunque area della memoria; l'aspetto straordinario della modalità V86 è che un SO multitask può creare più macchine virtuali facendo girare più programmi DOS contemporaneamente.2.7 Windows 3.x
Per poter sfruttare tutta la potenza delle nuove CPU la Microsoft nel 1990 annuncia l'uscita di Windows 3.0; oltre ai soliti miglioramenti estetici, questa nuova versione di Windows mette a disposizione dell'utente ben tre differenti modalità operative chiamate modo reale, modo standard e modo avanzato. Nel modo reale Windows funziona come i suoi predecessori comportandosi come una normale GUI che si appoggia sul DOS; in questa modalità quindi è possibile eseguire un programma alla volta (in modalità reale) ed è possibile indirizzare solo 1 Mib di memoria RAM fisica più l'eventuale memoria espansa.2.7.1 Modalità standard di Windows 3.x
Il modo standard equivale alla modalità protetta dell'80286; in questa modalità Windows prende il controllo del computer e si comporta come se fosse un vero SO mentre in realtà non lo è. Grazie alla modalità protetta dell'80286, Windows è in grado di indirizzare 16 Mib di memoria fisica e 1 Gib di memoria virtuale; in questo modo diventa possibile far girare più programmi contemporaneamente come in un vero SO multitask. Il problema principale del modo standard è legato al fatto che se tra i vari programmi in esecuzione ci sono anche programmi DOS, allora Windows deve continuamente commutare tra la modalità reale e la modalità protetta con notevole calo delle prestazioni; inoltre se un programma DOS và in crash, manda in crash tutta la sessione Windows facendoci perdere tutto il lavoro che stavamo svolgendo e che, come al solito, ci eravamo dimenticati di salvare.2.7.2 Modalità avanzata 386 di Windows 3.x
Il modo avanzato equivale alla modalità protetta dell'80386; in questo caso la situazione migliora enormemente grazie alle sofisticate caratteristiche di questa CPU. Nel modo avanzato Windows è in grado di indirizzare 4 Gib di memoria fisica e 64 Tib di memoria virtuale; grazie anche alla tecnica della paginazione della memoria il multitasking diventa molto più affidabile perché può beneficiare di meccanismi di protezione più severi. La modalità V86 inoltre, permette l'esecuzione di più programmi DOS contemporaneamente eliminando la necessità di commutazioni continue tra modalità reale e modalità protetta; in questo modo un programma DOS che và in crash viene chiuso da Windows senza danneggiare gli altri programmi in esecuzione.2.8 Windows 16 bit (Win16)
Tutte queste considerazioni sono vere solo da un punto di vista teorico; gli utenti e soprattutto i programmatori che hanno conosciuto Windows 3.x lo considerano come una sorta di entità aliena scesa sulla terra per impadronirsi dei nostri computers e spargere il terrore. In effetti le vecchie versioni di Windows sono diventate tristemente famose per i continui blocchi di sistema annunciati dalla classica schermata blu; i motivi di tutta questa instabilità sono numerosi. La prima cosa da osservare è che tutte le versioni di Windows dalla 1.x alla 3.x vengono definite con il termine Win16 per indicare il fatto che si tratta di "ambienti operativi" a 16 bit; questo aspetto è legato alla continua ossessione della Microsoft di voler garantire a tutti i costi la compatibilità con il vecchio software e con il vecchio hardware. Basti pensare al fatto che Windows 3.x potrebbe girare persino su un 8086 dotato di un solo lettore di floppy disk; la conseguenza di tutto ciò è che all'interno di Win16 è presente una autentica bolgia infernale fatta di programmi DOS, programmi Windows, modalità reale, modalità protetta e chissà cos'altro. Un'altro difetto di Win16 è rappresentato dal meccanismo rudimentale che viene utilizzato per il multitasking; questo meccanismo viene chiamato multitasking cooperativo per indicare il fatto che Win16 si affida al "buon comportamento" dei vari programmi in esecuzione. In sostanza Win16 fa girare a turno i vari programmi sperando che ciascuno di essi gli restituisca il controllo nel più breve tempo possibile; se tutti i programmi si comportano "educatamente", allora questo meccanismo funziona discretamente bene. Se uno dei programmi impiega un quarto d'ora prima di restituire il controllo a Win16, allora tutto il sistema rimane bloccato per un quarto d'ora; come molti ricorderanno, in un caso del genere l'unica cosa da fare consisteva nel riavviare il computer perdendo come al solito tutto il lavoro che non era stato ancora salvato.2.9 Windows 32 bit (Win32)
Tra il 1990 e il 1995 la situazione in casa Microsoft comincia decisamente ad evolversi nella direzione dei SO a 32 bit; il primo passo consiste nell'arrivo di Windows NT che è un SO destinato all'utenza professionale e al mondo dei server. In termini di qualità la situazione non sembra però migliorare; in breve tempo Windows NT balza al primo posto nella poco invidiabile classifica dei SO più colpiti dai virus. Per quanto riguarda il mondo di Win16, la Microsoft inizia la distribuzione di uno strumento di sviluppo software chiamato win32s; attraverso questa libreria è possibile iniziare a sviluppare applicazioni a 32 bit destinate a girare nella modalità avanzata di Windows 3.x. L'obiettivo della Microsoft è chiaramente quello di dare inizio alla migrazione degli utenti e dei programmatori verso il mondo dei SO a 32 bit; verso la fine del 1995 infatti, esce sul mercato Windows 95 che viene presentato dalla Microsoft come un vero SO a 32 bit destinato al grande pubblico. Passano pochi mesi e alcuni hackers dimostrano in modo inconfutabile che in realtà Windows 95 continua ad essere una GUI che si appoggia sul DOS; infatti Windows 95 installa sul disco una sorta di versione a 32 bit del DOS che rappresenta il vero SO su cui si appoggia l'interfaccia grafica. La conseguenza pratica è che anche Windows 95 in breve tempo diventa tristemente famoso per i continui crash; a tale proposito appare molto eloquente il giudizio di Matt Pietrek (probabilmente il massimo esperto mondiale di programmazione in ambiente Windows) che vedendo in azione Windows 95 afferma:Windows 95 è un'ottimo Sistema Operativo per giocare a Solitario!Successivamente la situazione subisce un certo miglioramento con l'arrivo di Windows 98 e Windows ME; in questi casi si può parlare di veri SO decentemente stabili anche se dietro le quinte continua a farsi notare la presenza del DOS.
2.10 Le risorse condivise di Win16
Uno degli obiettivi fondamentali di Win32 consiste nell'eliminare un grave problema presente in Win16; in Win16 i vari programmi in esecuzione possono vedersi l'uno con l'altro e per risparmiare memoria condividono tra loro molte risorse. Questa situazione crea due gravi conseguenze; la prima conseguenza è legata al fatto che i vari programmi potendosi vedere tra loro, possono anche danneggiarsi l'uno con l'altro compromettendo così il meccanismo di protezione. La seconda conseguenza è legata al fatto che la condivisione delle risorse crea il fenomeno degli orfani; con questo termine si indicano quelle risorse che rimangono in memoria anche quando non vengono più utilizzate. Questo fenomeno può verificarsi sia quando un programma termina dimenticandosi di rimuovere le risorse caricate in memoria, sia quando un programma và in crash lasciando la memoria piena di "rifiuti". A causa della confusione che regna al suo interno, Win16 non è assolutamente in grado di individuare il programma che non ha ripulito la memoria; anche se individuasse il "responsabile", Win16 non potrebbe fare niente perché le risorse rimaste in memoria potrebbero essere condivise con altri programmi ancora in esecuzione. Tra le varie risorse si possono citare in particolare le DLL (Dynamic Link Libraries); le DLL sono librerie software che invece di essere collegate al programma in fase di linking, vengono collegate in fase di esecuzione rendendo così più "snello" il programma stesso. Se due programmi devono utilizzare la stessa DLL, invece di caricare in memoria due copie della DLL ne viene caricata una sola da condividere tra i due programmi; Win16 utilizza un contatore per sapere quanti programmi stanno utilizzando la stessa DLL. Se uno dei programmi termina, il contatore viene decrementato di 1; quando il contatore diventa 0, Win16 scarica la DLL dalla memoria. Non ci vuole molto a capire che se uno dei programmi và in crash, il contatore non viene aggiornato e la DLL rimane in memoria anche quando non viene più utilizzata; una conseguenza pratica di tutti questi problemi è che in Win16 si verifica spesso il fenomeno della saturazione della memoria.2.11 Le risorse esclusive di Win32
Per cercare di eliminare tutti questi aspetti negativi di Win16, Win32 si basa sul fatto che, al giorno d'oggi, i PC non hanno certo problemi di penuria di RAM; non sussiste più quindi la necessità di risparmiare memoria attraverso la condivisione delle risorse. Eliminando la condivisione delle risorse si elimina anche la necessità di consentire alle varie applicazioni in esecuzione di potersi vedere l'una con l'altra; in questo modo si garantisce un meccanismo di protezione molto più efficiente in quanto in Win32 ogni applicazione ha il suo spazio di indirizzamento privato nel quale vengono caricate anche le risorse necessarie. La Figura 2.3 mostra la "realtà virtuale" che Win32 crea per ogni programma in esecuzione; questo significa che indipendentemente dalla configurazione fisica del computer, una applicazione in esecuzione sotto Win32 crede di vedere la situazione di Figura 2.3. Come si può notare, i primi 4 Mib vengono riservati al codice per il supporto dei programmi DOS; ogni programma DOS gira all'interno di una macchina virtuale V86. Il DOS è un SO monotask che consente cioè di eseguire un solo programma alla volta; i programmi DOS hanno quindi tutto il computer a loro completa disposizione e sono liberi di accedere direttamente all'hardware del computer senza il rischio di entrare in conflitto con altri programmi. Tutto ciò non avrebbe nessun senso in un SO multitask dove girano contemporaneamente più programmi che devono condividere lo stesso hardware; uno dei compiti fondamentali della macchina virtuale V86 è proprio quello di intercettare i tentativi di accesso diretto all'hardware da parte dei programmi DOS. Il SO riceve queste richieste e le esaudisce al momento opportuno in modo da non creare conflitti tra i vari programmi in esecuzione; tutti questi aspetti vengono quindi gestiti con l'ausilio del codice di supporto per i programmi DOS.2.12 Le limitazioni imposte da Windows NT / 2000 / XP per migliorare la stabilità
Abbiamo visto che la necessità di garantire la compatibilità con le applicazioni Win16 crea parecchi problemi a Win32; in particolare Win32 è costretto a definire una vasta area di memoria virtuale da condividere tra le varie applicazioni. Tutto ciò si ripercuote negativamente sul meccanismo di protezione che dovrebbe impedire alle applicazioni di vedersi tra loro; tanto è vero che come molti hanno avuto modo di constatare, le schermate blu continuano ad imperversare anche su Windows 9x. Il SO Windows NT e i suoi successori Windows 2000 e Windows XP cercano di risolvere questo problema attraverso il controllo totale sui 4 Gib di memoria virtuale; di conseguenza, la condivisione della memoria subisce in questi SO drastiche limitazioni. Proprio per questo motivo, le applicazioni scritte esplicitamente per Windows NT, 2000 e XP possono anche non funzionare in Windows 9x; fortunatamente però grazie alla compatibilità verso il basso, le applicazioni scritte per Windows 9x girano benissimo (o quasi) anche sulle versioni superiori di Windows.2.13 Conclusione
In conclusione comunque bisogna dire che nonostante i grandi sforzi compiuti dalla Microsoft, Windows XP e compagnia non sono ancora in grado di competere con la proverbiale affidabilità dei SO della famiglia Unix; basti pensare al fatto che esistono server Unix che ormai funzionano ininterrottamente da venti anni! Proprio per questo motivo, i SO basati su Unix (come ad esempio Linux) vengono largamente impiegati in quei settori nei quali, non essendo possibile l'intervento umano, viene richiesta una grandissima affidabilità operativa per lunghissimi periodi di tempo; un esempio pratico abbastanza eloquente è rappresentato dall'utilizzo di Unix/Linux per la gestione dei computers di bordo dei satelliti artificiali e delle sonde spaziali (meditate gente, meditate)!