//
Sistemi operativi... come sono fatti?
Pagina 1 di 3 123 UltimaUltima
Risultati da 1 a 10 di 30

Discussione: Sistemi operativi... come sono fatti?

  1. #1
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559

    Sistemi operativi... come sono fatti?

    Ciao a tutti,
    ultimamente in un altro thread ci stavamo inoltrando sul discorso Sistemi Operativi. Mi rendo conto che, a volte, quando si entra nello specifico e si iniziano ad usare termini per così dire "tecnici" non sempre tutti ne sono a conoscenza o non sempre tali termini sono universalmente noti nello stesso modo.
    Ho così pensato, visto che sono sistemista oltre che programmatore, di fornire, per chi fosse interessato, un pò di spiegazioni sui sistemi operativi, sul loro funzionamento teorico e quindi le loro implementazioni pratiche, almeno le più note.
    Non ho nessuna intenzione di dire che X è meglio di Y, ma i confronti nasceranno naturalmente, per gli esseri umani è praticamente impossibile non confrontare direttamente due casi pratici assegnando dei ruoli. Se non altro, alla fine, almeno avremo le idee più chiare e partiremo tutti dagli stessi presupposti.

    Iniziamo col dare una definizione di S.O.: "Un sistema operativo è l'insieme di servizi atti a rendere più agevole la comunicazione dei software applicativi con l'hardware sottostante".
    In pratica il compito di un sistema operativo è quello di occuparsi di gestire l'hardware della macchina permettendo al software applicativo di occuparsi di altre cose. Questo non significa necessariamente che il software applicativo non deve conoscere l'hardware della macchina, semplicemente che chi programma non deve riscrivere ad esempio la routine per leggere un file dal disco fisso in quanto c'è già chi la scritta per lui e quindi sarebbe sciocco non adoperarla.
    E' altresì vero che, un S.O. (Sistema Operativo), si occupa di gestire le risorse fisiche decidendo come distribuirle in modo, per così dire, sicuro.
    Questo discorso era essenzialmente valido all'inizio, quando i computer erano grossi come stanze e facevano centinaia di operazioni al secondo. Col tempo l'informatica è divenuta un fenomeno di massa (o globalizzato) e la miniaturizzazione ci ha messo lo zampino. Risultato? Centinaia di componenti HW che fanno tutti la stessa cosa, ma di marche differenti, che comunicano con gli altri dispositivi ognuno secondo un proprio stile (i cosiddetti "protocolli"). Nel frattempo, però, non sono nati centinaia di S.O. ma in genere ve ne sono pochi che devono far funzionare, più o meno, tutto.
    Così al S.O. è stato addebitato anche il compito di "astrarre" l'hardware. Ovvero far si che il software applicativo non debba più impegnarsi nel conoscere il tipo di hardware su cui gira, ma se il S.O. mette a disposizione una funzione che svolge un determinato compito deve limitarsi a chiamarla, sarà compito poi di quest'ultima eseguire il suo lavoro "al meglio".
    In questo modo il S.O. prende letterlamente il controllo della macchina cercando di nasconderla del tutto al software applicativo e così se prima si poteva comunque optare per accedere, anche in modo rischioso, all'hardware in maniera diretta, ma magari in modo più efficiente, ora non si può fare altrimenti che adoperare le vie regolari. Soprattutto in un ambito denominato multitasking e che vedremo più avanti.

    I sistemi operativi si dividono un due grandi categorie: Monotasking e Multitasking.
    Un sistema si definisce monotasking quando permette l'esecuzione di un solo software applicativo alla volta. Per poter eseguire un altro software applicativo bisogna quindi terminare prima il software corrente e poi eseguire il nuovo. Il più famoso dei sistemi operativi monotasking è stato l'MS-DOS. Oggi tale tipo di sistema operativo sopravvive esclusivamente in ambito industriale per i compiti "mission critical". Il vantaggio di questo tipo di sistema era dato dal fatto che l'applicativo si impossessava completamente dell'hardware e quindi poteva farci sopra il bello e cattivo tempo. Lo svantaggio è dovuto al fatto che se devo trasportare delle informazioni da un applicativo ad un altro devo prima fare il lavoro sul primo, salvarlo, chiudere l'applicativo, aprire il secondo applicativo, aprire il file e quindi continuare il lavoro.
    Si definisce un S.O. multitasking quando è in grado di eseguire, apparentemente o fattivamente, più programmi applicativi "contemporaneamente". Il virgolettato è d'obbligo in quanto la risorsa principale di un computer è il processore (dove per processore si intende il singolo core) e questo è comunque in grado di eseguire un'operazione alla volta (lasciamo un attimo da parte i processori paralleli). Quindi se ho due processori (o due core) al massimo il mio multitasking reale è in grado di eseguire due programmi contemporaneamente. Ma allora cos'è il multitasking? Un processore è in grado di eseguire miliardi, ormai, di operazioni al secondo, come il nostro cervello del resto, ma i tempi di reazione del nostro organismo, infinitamente più lenti, perchè più complessi, rendono il PC più veloce, ovvero lo mettono in uno stato di attesa relativo al nostro input. Si è così pensato di sfruttare questi tempi di attesa congelando il programma che in quel momento è aspetta i nostri ordini, per farne eseguire un altro e risvegliare il primo solo quando noi "comodamente" decidevamo di inviare la tanto agognata informazione. Osservando ulteriormente la situazione si è constatato che, in ogni caso, il numero di operazioni che è in grado di eseguire il computer era comunque ancora troppo elevato per due soli programmi. Si è pensato, quindi, di suddividere il tempo in fette (o timeslice) e di assegnare ad ogni singolo programma (denominato più correttamente processo) la sua bella fetta di tempo.
    Pertanto se un processore è in grado di eseguire cento milioni di operazioni a secondo ed io divido un secondo per dieci timeslice ho, in modo molto grossolano ovviamente, la possibilità di eseguire fino a dieci processi in sequenza, ognuno dei quali può eseguire dieci milioni di operazioni prima di passare il controllo al successivo. Visti i normali tempi di reazione di un essere umano, a quest'ultimo sembrerà che i programmi vengano eseguiti tutti contemporaneamente. In questo caso però subentra un problema non da poco. Le risorse HW sono limitate, processori, RAM, disco fisso, VRAM, mentre ci sono molti pretendenti al loro utilizzo. In questo caso il S.O. assume oltre che il ruolo di astrazione anche quello di controllo e blocco delle risorse. In pratica se prima era sconsigliato ai software applicativi accedere alle risorse hardware, ora è, almeno in teoria, vietato. Vengono introdotti i meccanismi di gestione della memoria avanzati come lo spazio di indirizzamento privato, in pratica ogni programma vive all'interno di un suo spazio di memoria e non può uscire da esso ne può allargarlo senza il dovuto permesso. Può eventualmente comunicare con il mondo esterno (gli altri processi) ma solo sfruttando i meccanismi messi a disposizione dal S.O. senza alcuna possibilità di contravvenire a questa regola. Chi si ricorda di Amiga sa che una peculiarità di quel sistema operativo era quella di non avere, in teoria, indirizzi fissi, eccetto il 4, questo perchè un task (o processo) può essere caricato ogni volta in una porzione differente di memoria.
    Logicamente partendo da quanto detto può sembrare che meno programmi girano e meglio è ed in effetti è così, questo perchè la timeslice assegnata ai singoli task è più ampia. Ma il meccanismo della rotazione ha i suoi svantaggi. Immaginate una fila di persone che deve prendere un medicinale ad uno sportello, ma non tutte le persone stanno male allo stesso modo quindi c'è chi deve prendere il medicinale più frequentemente e chi deve prenderlo meno frequentemente. Il meccanismo della rotazione (denominato tecnicamente "round-robin") non fa differenze, così avremo qualcuno che stara bene, qualcuno che soffrirà per mancata assunzione del medicinale e qualcuno che soffrirà per sovradosaggio. Lo sportellista (denominato "scheduler" o schedulatore) deve quindi valutare di volta in volta quando far tornare il paziente e fissa una specie di appuntamento, o meglio gli assegna una priorità dicendogli che anzichè tornare tra dieci persone potrà tornare tra tre. Questo è il meccanismo dei livelli di priorità. Un processo che ha necessità di maggiori cure, ovvero risorse, con maggior frequenza, può chiedere una priorità più alta, se possibile lo schedulatore la accorda, altrimenti dovrà rimettersi in fila normalmente. Va da se che nell'ambito del multitasking lo schedulatore è forse il processo in assoluto più importante di tutto il S.O. un bug al suo interno può portare a conseguenze devastanti.
    E se succede un'emergenza o se il medicinale dev'essere assunto sotto sorveglianza? Nel tempo è stato tenuto conto di queste condizioni ed hanno creato le due principali branche del multitasking: il multitasking preempitivo e quello non-preempitivo.
    Per spiegarli dobbiamo introdurre il concetto di livello di esecuzione. Immaginate un bersaglio delle frecce (quello a cerchi concentrici). Il livello più al centro è quello che da più punti, ma è anche quello che è più difficile da colpire. Tutti lo mirano, pochi ci riescono. Ecco immaginate che il cuore del S.O. (il da molti citato "kernel" o nocciolo) si trova lì (in realtà li si trova l'hardware, ma è un altro discorso). Mano mano che ci si allontana dal centro i punti e la difficoltà diminuiscono. I programmi applicativi si trovano nell'anello più esterno. Va da se che più all'esterno ci si trova più sono i passaggi che il nostro processo dovrà effettuare, in modo implicito, per eseguire un'operazione. Se il programma viene scritto secondo determinate regole, sempre più stringenti, può cercare di essere eseguito nei cerchi più interni, con indubbi vantaggi sulla priorità. Tornando al discorso dello sportello, in caso di emergenza è così possibile che una persona interrompa le normali procedure per avere una cura di emergenza e che il tutto venga ripristinato solo a cura completamente somministrata. Questo è il caso del multitasking non-preempitivo.
    Ovvero un processo eseguito a livello più interno (riferendoci ai bersagli) non può assolutamente essere interrotto nella sua esecuzione da processi aventi livello più esterno, almeno fino a che il primo processo non rilascia esplicitamente il controllo. Ricadono in questa condizione tutti i processi di livello di sistema, quali quelli di accesso all'hardware o di sincronia. Va da se che se si scrive un programma in grado di girare a livello di sistema può impossessarsi della macchina bloccandola in quanto non può essere interrotto. Nel caso di multitasking non-preempitivo il livello di esecuzione è più importante della priorità.
    Nei sistemi preempitivi (Windows 95/98/ME) semplicemente non esistono i livelli di esecuzione, in pratica esistono due cerchi il S.O. ed i programmi (e non sono neanche così ben definiti), per cui qualsiasi processo con un adeguato livello di priorità può prendere il sopravvento sugli altri.
    Come conseguenza diretta del multitasking abbiamo avuto la multiutenza. Semplicemente i programmatori si sono chiesti, visto che gli umani sono così "lenti", possiamo permetterci di attendere più input, ognuno per uno specifico task, da più persone contemporaneamente, tanto il "server" sarà comunque più veloce. Da qui si è pensato di individuare prima con il termine "server" una sola macchina e poi un gruppo di macchine identificate logicamente come una singola macchina e denominate "cluster". Ma per chi fa grafica 3D il netrendering sa che è una disciplina a sé.
    Negli ultimi anni la potenza dei PC è diventata letteralmente enorme, la loro capacità di lavorare anche in sinergia li ha resi ancora più incredibili e si è passati dalle centinaia, alle migliaia, ai milioni ed infine ai miliardi di operazioni al secondo, e la disponibilità di sistemi multiprocessore prima e multicore poi al grande pubblico non ha fatto altro che rimarcare ancora di più questa condizione.
    I programmatori, sempre loro, sono partiti da una funzione di sistema di Unix (c'è sempre lui di mezzo) la "fork()", questa funzione permette di spezzare un processo in due e rendere i due processi indipendenti ma aventi alla base le stesse informazioni, o meglio uno riceve la copia delle informazioni dell'altro. Si sono chiesti e se invece di copiare le risorse le condividessero? Sono così nati i thread.
    Cosa sono quindi i thread? Sono figli di un processo che condividono con quest'ultimo le stesse risorse (fisiche e temporali) e la stessa priorità e livello di esecuzione.
    Quali sono i vantaggi? Beh in grafica 3D sono enormi, ed in genere in tutte quelle condizioni dove è possibile eseguire il calcolo parallelo. Ma anche in tutte quelle condizioni in cui lo stesso codice deve essere eseguito contemporaneamente, come ad esempio i server Web. Mi spiego meglio.
    Come funziona un server web? Immaginate un centro informazioni che ha a disposizione una serie di opuscoli ed il cui compito e distribuirli su richiesta. Inizialmente le persone si mettevano in fila davanti allo sportello, ognuno faceva la sua richiesta, riceveva il suo opuscolo e se ne andava, quindi veniva il turno della persona successiva e si ricominciava.
    Se si voleva rispondere a più richieste bisgnava aprire nuovi sportelli in tutto e per tutto identici al primo (si potrebbe dire clonati) col risultato si di andare più veloci, ma con aumento dei costi per gli stipendi (due persone costano più di una) e con la diminuzione dello spazio vitale in cui muoversi. Poi qualcuno ha detto: "Hei! Ma l'impiegato ha due mani! E se prendesse due opuscoli contermporaneamente?", a parte che se fosse uno statale e lavorasse in Italia l'impiegato avrebbe fatto sicuramente il gesto dell'ombrello, questi sono i thread.

    Per ora mi fermo qui. A presto con il resto, sempre se vi fa piacere....
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

  2. #2

    Thumbs up

    WOW!!! DEcisamente interessante! Seguo con molto piacere questa discussione... conoscere, anche solo a livello basilare, il S.O. potrebbe esserci utile per far "frullare" meglio i nostri macinini

  3. #3
    Caspita, è stata proprio una bella lettura, immersiva e facile. Non vedo l'ora di leggere le differnze tra gli OS.


    Avrei qualche domanda su Unix, che mi ha da sempre incuriosito. Unix è un sistema utilizzato prevalentemente lato server e workstation, quali sono le sue peculiarità? Come ci si interfaccia, come client/administrator o ci sono anche delle frendly GUI (escluso il SO Linux)? E, quali sono le differenze principali tra i due sistemi Unix-like, Linux e BSD?
    Luci e onde del belpaese - LWITA.com
    CALCOLATORE STILL by htsoft - FEEDBACK Calcolatore still

  4. #4
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559
    Citazione Originariamente Scritto da mikadit Visualizza Messaggio
    Caspita, è stata proprio una bella lettura, immersiva e facile. Non vedo l'ora di leggere le differnze tra gli OS.


    Avrei qualche domanda su Unix, che mi ha da sempre incuriosito. Unix è un sistema utilizzato prevalentemente lato server e workstation, quali sono le sue peculiarità? Come ci si interfaccia, come client/administrator o ci sono anche delle frendly GUI (escluso il SO Linux)? E, quali sono le differenze principali tra i due sistemi Unix-like, Linux e BSD?
    Ciao,
    le peculiarità di Unix (e più in generale dei sistemi operativi *nix) sono alla base della sua progettazione. E', in pratica, il primo S.O. multitasking a largo uso della storia. La cosa più importante è che non è un sistema operativo scritto in linguaggio macchina ma, a parte alcune trascurabili parti, scritto quasi completamente in C, in pratica è stato il primo S.O. scritto in un linguaggio di medio/alto livello (almeno per come definisco io il C), nato con l'idea della portabilità in mente e con il seme della modularità. Inoltre il C (linguaggio derivato dal BCPL) è stato creato proprio per scrivere Unix.
    Il primo sistema ad adoperarlo è stato un PDP-7 per farci girare un gioco (all'anima del gioco, con questo termine all'epoca si identificavano i simulatori di volo adoperati dall'aviazione civile e militare degli USA). La sua evoluzione l'ha avuta poi su un PDP-11.
    Era stato creato all'interno dei Bell Labs (poi in qualche modo fagocitati dalla AT&T) ed è stato il primo sistema operativo OpenSource (fino agli anni '80 i sorgenti erano pubblicamente disponibili, e le università degli stati uniti ne avevano una propria versione, la più famosa è poi divenuta la BeOS da cui è stato tirato fuori il sistema dei Next di Steve Jobs e su cui si basa OsX di Apple, che tra l'altro con Leopard ha avuto il riconoscimento di Sistema Operativo Unix Accreditato). Questo ha fatto si, anche perchè negli USA le spinte all'innovazione arrivano spesso dalle università, di divenire presto il primo sistema operativo multitasking non-preempitivo, multiuser, multithread e tra i più sicuri al mondo.
    Linux ha seguito una strada un pò più tortuosa, appartiene anch'esso ai sistemi *nix ma non è derivato direttamente da Unix bensì dal progetto Minix (vi presi parte, in modo marginale, anche io). Verso l'inizio degli anni '90 si decise di riproporre Unix come sistema OpenSource, ma siccome era sotto Copyright un gruppo di volenterosi decise di riscriverlo da zero partendo dai documenti disponibili nell'allora nascente internet e morente Fidonet...
    Venne così creato il sistema Minix. Tutti erano invitati a partecipare. Perfino la Jackson Libri pubblicò il S.O. (non il libro proprio il sistema). Tra le varie personalizzazioni quella che prese piede come diffusione fu quella di Linus Torwald, chiamata Linux.
    Le GUI per gli Unix si sprecano, con Leopard la più usata è ora il Finder, ma in alternativa vi è OSF Motif (e devo dire, avendola programmata, che merita), la SCO aveva una sua versione per OpenServer, ed in genere tutte le WKS grafiche ne hanno una più o meno personalizzata (le Silicon Graphics hanno un cuore Unix e la propria interfaccia grafica).
    In effetti le GUI non dovrebbero mai essere associate ad un S.O. ed in questo gli *nix sono perfettamente coerenti.
    La prima a rendere l'interfaccia parte del S.O. è stata, ahimé, la Apple con Lisa prima ed il Macintosh poi. Poi è arrivata MS, con le sue fotocopiatrici a lastre distorte ed OS/2 (si OS/2 chi si aspettava che dicessi Windows?) ed è stato l'inizio della fine...
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

  5. #5
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559
    continuiamo con il discorso di prima:
    Ho citato il Kernel, ma che cos'è?
    Il kernel è l'insieme di tutte le funzioni principali del sistema operativo, è letteralmente il sistema operativo, tutto il resto sono semplici appendici.
    Esistono due scuole di pensiero in proposito ai kernel. C'è quella che opta per un kernel monolitico e quella che opta per un link dinamico.
    Vediamo le differenze, definiamo però cosa ci troviamo nel kernel.
    In un kernel prendono posto tutte quelle funzionalità dedite alle seguenti attività:
    - Schedulatore
    - Gestione dei dispositivi (si sono inclusi anche i driver)
    - Gestione delle risorse (RAM, Dischi Fissi)
    - Processi di manutenzione, come il "garbage collector"

    Per kernel monolitico si intende un unico modulo fisico, in cui è racchiuso tutto quanto descritto sopra. In generale il kernel monolitico è compilato ed ottimizzato sullo specifico hardware su cui viene eseguito, i vari componenti sono staticamente collegati tra di loro (in pratica so che lo schedulatore si troverà sempre nello stesso posto senza colpo ferire) e pertanto le prestazioni sono migliori. Svantaggi? Il kernel viene caricato completamente in memoria all'atto dell'avvio e la occupa sempre fino all'arresto del sistema. Pertanto possiamo dire addio ad una bella porzione di RAM, anche se ad onor del vero non è poi così tanta vista la quantità che oramai siamo abituati ad installare sui nostri sistemi, inoltre in caso di modifiche HW o di uno dei suoi componenti il Kernel va ricompilato e questa è sempre un'operazione rischiosa. Quando andrebbe usato? Sicuramente su tutti quei sistemi che richiedono elevate prestazioni, ma anche su quei sistemi che difficilmente cambiano il proprio HW, come i servers o le workstation. In genere un kernel monolitico si pappa tra i 64 ed i 128 MB di RAM (non memoria proprio RAM, poi scoprirete cosa intendo con questa sottile differenza quando parlerò degli indirizzamenti).
    Di contro un kernel a link dinamico è il massimo della flessibilità, carica solo ciò che serve quando serve, i suoi componenti meno critici possono essere parcheggiati sulla memoria viruale, e nel caso di cambiamento di HW non va ricompilato. Svantaggi? E' lentooooo, ma tanto lento. Primo perchè i componenti, linkati dinamicamente, per poter essere richiamati bisogna fare ogni volta il calcolo di accesso, e poi perchè un programma applicativo mangiamemoria potrebbe richiedere l'uso di un componente che, magari per basso livello di priorità, viene parcheggiato sulla memoria virtuale e che quindi ogni volta dev'essere ricaricato.
    Da un pò di tempo si sta affermando la scuola de "il giusto sta nel mezzo" ovvero il kernel è monolitico per le funzioni critiche, lasciando i componenti meno cruciali linkati dinamicamente (ad esempio i driver delle stampanti). I sistemisti Unix più sfegatati, che quindi possono decidere di intervenire direttamente sul kernel, spesso si spingono al punto di decidere cosa includere e cosa no nel blocco monolitico in base alla destinazione d'uso della macchina.
    Le ultime versiondi di Windows seguono anche loro quest'ultimo approccio, prima erano un pò più dinamiche, è per questo che se prima cambiavate la piastra madre o il processore di un PC al massimo dovevate reinstallare i driver mentre ora vi compare il Blue Dead Screen. Il problema di Windows (ma per chi è un semplice utente che non vuole rivolgersi ad un sistemista scafato, va bene così) è che Microsoft ha deciso cosa inserire nel blocco monolitco e cosa no indipendentemente dalla destinazione d'uso della macchina (è per questo che esistono anche tante versioni di Windows Server 2003 e tra poco 2008).
    La differenza tra un sistema operativo *nix e Windows sta principalmente in questo punto. Quando installo uno *nix posso, se voglio, adoperare un kernel compilato da me, in grado di adoperare le specifiche della mia macchina, comprese le istruzioni avanzate del processore, compilato magari con un compilatore ottimizzato per una data piattaforma. I progettisti Microsoft, non potendo rilasciare il codice sorgente, devono pertanto mandare in giro un kernel che è dato da un minimo comune multiplo dei sistemi per cui è stato progettato per girare. Pertanto se vi viene detto che Vista gira su tutti i pentium IV allora il kernel lavora con il set comune di istruzioni dei Pentium IV e degli Athlon, quindi addio estensioni proprietarie e pertanto vi è un calo di prestazioni. (E' come se oggi usassimo i dual core duo come dei sistemi pentium IV multiprocessore), va da se che anche caratteristiche specifiche come la cache e simili vengono ignorate.
    Questa è appunto una delle più gravi accuse mosse dalla comunità internazionale nei confronti di MS, ovvero un finto avanzamento tecnologico proprio in virtù del fatto che i moderni processori non vengono sfruttati appieno dal nuovo S.O.
    Apple dal canto suo è abbastanza fortunata, essendo produttore sia del software che dell'hardware può permettersi di mandare in giro kernel precompilati specifici per il tipo di processore che troverà il sistema all'atto dell'installazione. Inoltre il kernel di OsX è OpenSource (si chiama Darwin) e pertanto può essere addirittura compilato al volo durante l'installazione senza che Apple debba temere nulla...
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

  6. #6
    Licantropo L'avatar di Solferinom
    Data Registrazione
    Apr 2005
    Località
    S.Maria di Leuca (LE) - Puglia
    Messaggi
    1,481
    Molto, mooolto interessante. La tua capacità di spiegare processi complessi con parole semplici ed esempi alla portata di tutti è stupefacente. Perchè non scrivi un libro? Lo leggerei volentieri.
    ...A quando la prossima puntata?

  7. #7
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559
    Oggi ho parecchie cose da scrivere sul forum, speriamo di non crollare prima...
    Prima ho parlato del kernel indicando in qualche modo di come esso gestisce la RAM ed in qualche modo di come la occupa.
    Su un PC in generale abbiamo sentito tutti parlare di memoria virtuale, ma cosa è e come viene usata?
    La memoria virtuale fu introdotta, indovinate un pò, con i sistemi Unix. In pratica i progettisti si resero conto che la memoria RAM, all'epoca costosissima, era effettivamente una risorsa troppo limitata come dimensione, soprattutto quando c'erano molti programmi in esecuzione contemporanea. Inoltre i processori erano già in grado di indirizzare una quantità di memoria ben superiore a quella generalmente disponibile su un computer medio. In compenso i dischi fissi si erano affacciati sul mercato e pertanto offrivano uno spazio di memoria decisamente più ampio. Il problema era la lentezza... Un disco fisso ragiona in termini di ms mentre la RAM lavora nei campo dei ns (nanosecondi). Come fare?
    Parlando dei processi quando ho illustrato lo schedulatore ho detto che spesso un processo può essere congelato. Ma se è congelato è inutile fargli occupare memoria RAM, tanto vale spostarlo sulla memoria virtuale che risiede, sotto forma di partizione o file, sul disco fisso. E con esso anche il suo stack, il suo heap ove possibile, ed il program counter.
    Ma come e quando fare tutto questo? Il quando è durante la fase di switching di processo, lo schedulatore valuta il livello di processo e può attivare le procedure di congelamento. Il come lo si ha eseguendo una mappatura settore disco/gruppo di indirizzi di memoria. I motorola 68000 e gli 80386 inoltre contenevano già dei metodi di indirizzamento che permettevano agevolmente di eseguire questa mappatura. L'idea sembra grandiosa, ma bisogna tenere conto di una serie di fattori. La memoria virtuale non dovrebbe essere mai superiore al doppio della memoria RAM fisica disponibile, pena un calo delle prestazioni, questo perchè la mappatura è trasparente anche al S.O. stesso e pertanto si rischierebbe di far risiedere un programma attivo, o una sua parte, sulla virtual memory. Va usata con parsimonia, ovvero, se il numero di scambi che avvengono tra memoria virtuale e memoria RAM è eccessivo è evidente che per le esigenze dell'utente la seconda è sottodimensionata oppure l'utente ha aumentato le sue necessità. E' per questo che in genere il primo consiglio che si da è di aumentare la RAM quando si vuole aumentare l'efficienza del proprio PC e solo in un secondo tempo il processore.
    Esistono però dei processi che non possono essere spostati dalla memoria reale e sono quelli del kernel. Il kernel risiede sempre interamente nella memoria RAM, negli indirizzi fisici più bassi, non ci sono alternative, questo perchè dev'essere quello che deve garantire la massima efficienza, immaginatevi se per errore lo schedulatore finisse sulla memoria virtuale... tanto vale tornare all'MS-DOS. (Per comprendere appieno questo discorso bisogna però sapere come lavora un microprocessore, e come solo la memoria RAM, per la sua natura di accesso diretto, possa contenere un programma attivo, se vi interessa mi riprometto di spiegarlo più in là).
    Quindi un kernel monolitico verrà caricato in memoria RAM e risiederà al suo interno fino allo spegnimento del sistema. Quindi se allestite un server di stampa va bene caricare il driver della stampante laser, in questo modo sarà sicuramente efficiente. Ma se fate un server Web, beh diciamo che è un pò uno spreco caricare lo stesso driver.
    Sui sistemi *nix con kernel a link dinamico (parziale o totale) è possibile caricare i moduli del kernel in due separati momenti, durante la fase di avvio (detta init) o su richiesta. Alcuni moduli sono residenti (prendono il nome di demoni) e se non vengono eseguiti vengono spostati nella memoria di swap. Altri esistono solo durante la fase di esecuzione strettamente necessaria e quindi vengono completamente scaricati dalla memoria una volta eseguito il loro compito.
    I sistemisti Windows hanno seguito un percorso differente, tutti i driver ed i moduli vengono caricati durante il boot e poi ci penserà lo schedulatore a decidere chi mandare nella memoria virtuale. E' per questo che quando si annuncia una nuova versione di windows si parla dei tempi di boot e shutdown, essi comprendono infatti la fase di caricamento dei moduli
    e quella di (mamma chre brutto tempo) scaricamento ed è anche per questo che quando installate un nuovo driver è sempre necessario riavviare (in realtà questo succede anche sui sistemi Apple e su molti Linux, ma non necessariamente per tutti i driver, ad esempio è possibile caricare un driver di una scheda di rete ed attivarlo dopo il boot ed il sistema potrebbe adoperarlo senza riavviarsi, ma non è detto che tutti i moduli ne sentirebbero la presenza).
    Come si è capito dopo la fase di gestione della sequenza dei processi, la gestione della memoria è il compito più delicato di un sistema operativo.

    Ma come fa un processo a chiedere di usare la memoria? Essenzialmente non funziona in stile far west, non può dire le celle da X ad Y sono mie, perchè magari in quelle celle risiede un altro software applicativo o addirittura il kernel. Deve quindi fare il bravo bambino e chiedere al S.O. "Mi dai dieci celle per piacere?" se le celle ci sono allora tutto ok, altrimenti, peccato. Ma attenzione il problema non è ottenere le celle, quello è facile, il problema è restituirle. Il sistema operativo, in genere, tiene traccia della memoria non allocata, ma non di quella allocata e da chi, ho detto in genere e dopo vedremo il perchè. E' quindi compito del processo che ha allocato la memoria rilasciarla prima del termine della propria esecuzione, pena la perdita della memoria fino al successivo riavvio.
    Prima ho però parlato del "garbage collector" che cos'è? Uno spazzino che tiene traccia della memoria allocata e da quale processo. E quando quest'ultimo termina la sua esecuzione, lo spazzino controlla che abbia rilasciato tutta la memoria e in caso negativo ne forza il rilascio.
    Serve anche ad un'altra cosa, ma la vedremo più avanti.
    Sembra grandioso vero? C'è solo un piccolo problema è per sua natura un processo pesante e che tende ad occupare memoria, inoltre non può essere spostato sulla memoria virtuale, in quanto la sua disponibilità dev'essere immediata (gira al centro del bersaglio, a livello system, quando parte nessuno può interromperlo). Di conseguenza non tutti sistemi lo implementano e sono pochi quelli che lo implementano del tutto.
    Persino gli *nix sono divisi da questo punto di vista, alcune versioni lo montano di serie, altri ne usano una versione ridotta, altri non lo usano. Il vantaggio di Unix è che è però modulare, pertanto è possibile inserire un garbage collector nel kernel, anzi si può scegliere tra vari moduli, ognuno che lavora in modo differente rispetto agli altri (tra l'altro si può fare lo stesso anche con lo schedulatore, ce ne sono diversi ed ognuno privilegia un determinato approccio).
    Windows, fino ad XP, non ha il garbage collector (e ti pareva), qualcosa si è visto con Vista (mamma), ma siamo ancora lontani.
    Volete fare una prova per vedere se è vero? Prendete un programma che sapete come mandare in crash. Avviatelo, attivate il task manager (CTRL+SHIFT+ESC) e segnatevi la memoria usata. Mandate in crash il programma (non chiudetelo) e ricontrollate, troverete che la memoria non è stata liberata. In pratica non è stato attivato alcun sistema per il recupero della memoria. Se il programma prima di andare in crash ha avviato qualche meccanismo di rilascio risorse (tramite la gestione delle eccezioni) allora bene, altrimenti...
    Il garbage collector ha anche un'altra funzione, forse la più importante, si occupa della deframmentazione della memoria. Tutti sapete cosa è la deframmentazione di un disco, o almeno così credo. Bene, sappiate che anche la memoria (RAM o virtuale che sia) necessita della stessa operazione di tanto in tanto (veramente abbastanza di frequente).
    Questo perchè il S.O. quando alloca 10 celle consecutive su un gruppo di 100, ed alla fine le riottiene non le riunirà automaticamente ma creerà due gruppi uno di 10 celle ed uno di 90.
    Sui *nix dove l'unità minima allocabile è una pagina (per cui se chiedete 10 celle e la pagina è di 64 celle, voi otterrete comunque 64 celle, ma ne vedrete 10, è anche vero che potrete sfruttare in qualche modo le altre 54, non vanno perse, ma attenzione DOVETE rilasciare le pagine non più usate) alla fine il problema è poco sentito, e si avverte soprattutto quando si allocano blocchi di memoria superiori ad una pagina (cosa che in genere non accade quasi mai, inoltre i sistemisti possono andare a definire, all'atto di compilazione del kernel, anche dimensioni di pagina differenti rispetto a quelle base), mentre su Windows dove la memoria allocata è effettivamente quella richiesta il problema della frammentazione c'è e si sente... soprattutto con la grafica.
    Ultima modifica di htsoft; 06-02-08 alle 22:44
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

  8. #8
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559
    Citazione Originariamente Scritto da Solferinom Visualizza Messaggio
    Molto, mooolto interessante. La tua capacità di spiegare processi complessi con parole semplici ed esempi alla portata di tutti è stupefacente. Perchè non scrivi un libro? Lo leggerei volentieri.
    ...A quando la prossima puntata?
    Ti ringrazio, troppo buono.
    Una volta insegnavo programmazione e sistemi a scuola ed ho avuto un breve excurus nella facoltà di ingegneria di napoli (ingegneria areospaziale) dove mi occupavo di sviluppo di programmi per analisi interferometrica di immagini radar e di applicazioni di fluidodinamica e di gestire il CED basato su macchine Alpha della Digital (poi Compaq e poi HP).
    Io il libro lo scriverei (in realtà ne sto scrivendo veramente uno relativo alla programmazione su OsX con XCode 3.0) ma il problema è chi lo pubblica...
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

  9. #9
    Licantropo L'avatar di Fire
    Data Registrazione
    Nov 2006
    Località
    N 40°37'6" - E 17°55'2"
    Messaggi
    2,726
    Ciao, seguo con interesse anch'io, ma per evitare di dover esser costretti poi a ..."deframmentare" il topic, () preferisco aspettare l'epilogo per porre qualche domanda in relazione a qualche mia perpelessità.

    Vai come un treno Robè, (...ecco qualcuno che scrive più di me ), ...complimenti anche per le tue capacità didattiche, ...come diceva un mio ex IP alla scuola di volo basico di Latina, "...spera che ti capiti uno che oltre a saper volare te lo sappia anche insegnare...", ed è proprio così, conoscere la materia non significa automaticamente saperla trasmettere, ...purtroppo.

    Mika ...ho l'impressione che ci sia altro materiale in arrivo per la serie "la collana del portale"

    Fabio.

  10. #10
    Lupo Guercio L'avatar di htsoft
    Data Registrazione
    Dec 2007
    Località
    Castellanza (VA)
    Messaggi
    559
    Citazione Originariamente Scritto da Fire Visualizza Messaggio
    Ciao, seguo con interesse anch'io, ma per evitare di dover esser costretti poi a ..."deframmentare" il topic, () preferisco aspettare l'epilogo per porre qualche domanda in relazione a qualche mia perpelessità.

    Fabio.

    Ciao Fabio,
    Illustrare i concetti su cui si basa un sistema operativo è un lavoro abbastanza lungo, se hai qualche perplessità o domande ti conviene porle subito, eventualmente saranno riprese in seguito. Aspetto le tue richieste.
    Ho fatto l'amore con Control, domani provo Caps-Lock

    Il mio blog: http://vitain3d.blogspot.com

    Roberto S.

Discussioni Simili

  1. Il Rendering e ...dintorni.
    Di Fire nel forum News e Computer Grafica
    Risposte: 81
    Ultimo Messaggio: 04-11-17, 13:54
  2. LightWave 9 è cosa buona? Vale la pena l'upgrade?
    Di Tempesta nel forum News e Computer Grafica
    Risposte: 93
    Ultimo Messaggio: 18-12-06, 23:29
  3. Mai vista una così!
    Di GinoLatino nel forum News e Computer Grafica
    Risposte: 17
    Ultimo Messaggio: 17-09-06, 11:47
  4. [film] le cronache di narnia
    Di gebazzz nel forum News e Computer Grafica
    Risposte: 41
    Ultimo Messaggio: 06-01-06, 22:00
  5. Eccomi .... sono il primo ... hehehehe
    Di DM67 nel forum Discussioni Generiche - OT & Informatica
    Risposte: 25
    Ultimo Messaggio: 29-06-04, 16:59

Segnalibri

Segnalibri

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •