Introduzione ai S.O.

Materie:Appunti
Categoria:Informatica

Voto:

1 (2)
Download:73
Data:28.09.2001
Numero di pagine:7
Formato di file:.doc (Microsoft Word)
Download   Anteprima
introduzione_1.zip (Dimensione: 10.84 Kb)
trucheck.it_introduzione-ai-so.doc     47 Kb
readme.txt     59 Bytes



Testo

Introduzione ai sistemi operativi
Definizione di Sistema Operativo
Il Sistema Operativo è il gestore delle risorse del calcolatore, cioè il software di base che serve all’utente per lavorare con l’hardware, creando un ambiente di lavoro virtuale.
Le risorse si dividono in quattro gruppi:
1. Memoria centrale
2. Processore/i
3. Dispositivi di I/O
4. Memoria di massa
La gestione standard delle risorse avviene con i seguenti passi:
1. Conoscere lo stato delle risorse
2. Determinare la politica di allocazione della risorsa
3. Allocare fisicamente la risorsa
4. Deallocare la risorsa secondo la strategia prescelta
Classificazione dei sistemi operativi
I sistemi operativi possono essere classificati in diversi modi. Qui verrà fatta una classificazione totale:
a) S.O. monoprogrammati
b) S.O. multiprogrammati
1. S.O. multitasking, multithread [b]
2. S.O. batch [a,b]
3. S.O. time sharing [b]
4. S.O. real-time [b]
5. S.O. dedicati [a,b]
a ) S.O. monoprogrammati
Gestiscono sistemi di elaborazione nei quali è possibile eseguire un solo programma per volta e, quindi, tutte le risorse sono costantemente dedicate ad esso. Per diretta conseguenza le risorse che non vengono utilizzate dal programma in corso rimangono non utilizzate. È un tipo di sitema operativo molto semplice da realizzare.
b ) S.O. multiprogrammati
Gestiscono sistemi di elaborazione in grado di far eseguire più programmi in contemporanea sia sul singolo PC sia su diversi terminali (in questo caso si parla anche di multiutenza). Il nodo centrale di questi S.O. sta nell’assegnazione delle risorse tra i vari programmi e/o utenti, onde ad evitare attese troppo lunghe o conflitti tra i processi. Ovviamente il S.O. diviene così molto più complesso e le risorse vengono sfruttate in maniera più efficiente.
1 ) S.O. multitasking, multithread
Sono particolari sistemi multiprogrammati che consentono di vedere più programmi avanzare contemporaneamente sulla nostra macchina. Il multithread consente una gestione dei flussi I/O ancora più avanzata ed è una tecnica tipica ad esempio del linguaggio JAVA.
2 ) S.O. batch
In questi S.O. l’utente carica il suo programma all’avvio del sistema e senza alcuna ulteriore iterazione il processo produrrà i risultati finali. La gestione delle risorse è ottimizzata anche perché è comunque disponibile la multiprogrammazione.
3 ) S.O. time sharing
Questi S.O. sono basati su sistemi multiprogrammati e sono utili quando è frequente il dialogo fra utente e macchina. Con lo scopo di ridurre i tempi di attesa dei programmi che sono in esecuzione, il tempo macchina viene diviso in maniera prefissata ed eguale fra i vari processi, con l’apparente avanzamento contemporaneo di tutti i programmi. Questo S.O. ha un grado di complessità elevato per la gestione degli intervalli di tempo e dei programmi attivi.
4 ) S.O. real-time
Prevedono un dialogo continuo tra utente e sistema e necessitano inoltre di tempi di risposta molto brevi a scapito della gestione ottimizzata delle risorse (tempi morti macchina sprecati). Da un punto di vista teorico è possibile vederlo come un sistema dedicato ad un particolare compito, magari perfino monoprogrammato.
5 ) S.O. dedicati
Sono previsti nei casi in cui il sistema debba effettuare una sequenza di complesse azioni ripetitive, come nel caso dei controlli dei processi produttivi. Potremmo vederlo come un sistema batch sviluppato solo con le funzionalità necessarie al lavoro da svolgere.
Struttura gerarchica di un S.O.
La struttura di un sistema operativo è modulare e complessa ed è riassumibile in un generico diagramma a cipolla:
In base alla funzione che si deve realizzare il S.O. provvede a scendere di livello per completare la richiesta dell’utente e dei programmi. Le utilità non sono indispensabili, dipende anche dalla filosofia dell’ S.O. Ad esempio quelli di microsoft hanno tutto il necessario per tenere in “forma” il nostro PC: scandisk, defrag, backup, system information, operazioni pianificate ... tutte abbastanza semplici e funzionali. Inoltre nei S.O. microsoft c’è tutto il necessario per la comunicazione (browser eccellente e stabile con java, gestore di posta ottimo e multiutente) e la multimedialità, che è garantita da un ottimo supporto delle periferiche e da prodotti entusiasmanti quali windows media player 7 e movie maker (con win ME).
Programmi , Processi, Processore, Risorse, Molteplicità, Priorità ...: definizioni
Un programma è un codice macchina che può essere eseguito dal sistema operativo. Esso deriva da un codice sorgente adeguatamente compilato a seconda del S.O.
Si può inoltre definire la parola processo come un’istanza di quel programma, ovvero una singola richiesta di utilizzo di una risorsa e l’utilizzo di quest’ultima, comunque come una parte del programma.
Un processore è un dispositivo hardware che è in grado di lanciare del codice e quindi anche dei processi.
Le risorse sono tutto quello che può essere utilizzato nella macchina per elaborare dati, come le periferiche, la memoria, il processore.
Molteplicità significa n. di risorse uguali, ad esempio più stampanti, più processori ecc., ma la molteplicità non porta dei vantaggi se non è gestita intelligentemente dal processore.
Priorità vuole dire assegnare ad un processo un coefficiente di importanza per la sua gestione, questo può essere pericoloso perché in alcuni casi i processi con priorità più bassa potrebbero non venire mai serviti.
Al contrario un sistema operativo time-sharing utilizza una coda dove i processi godono degli stessi tempi di servizio.
Un sistema monoprocessore ha un singolo processore che svolge i compiti di calcolo, a differenza di uno multiprocessore (generalmente, per questioni di archittettura e guadagno, il numero corrisponde ad una potenza del 2) che, con il corretto chipset, un S.O. che lo supporti (uno ottimo è windows 2000) e dei programmi con un minimo di ottimizzazione, è in grado di bilanciare il carico dei vari processi sulle varie unità di elaborazione. Naturalmente è necessario farsi carico di oneri economici ben maggiori per avere un sistema multiprocessore, per questo vengono preferite reti di calcolatori separati, nonostante non si abbiano gli stessi vantaggi.
Ciclo di vita di un processo
Un processo segue uno schema ben preciso di transizioni di stato che lo portano dal lancio al termine:
Quando un programma viene lanciato risiede nello stato di Lancio nel quale viene verificata la disponibilità delle risorse delle quali necessita. In caso non siano disponibili fisicamente nel sistema si otterrà solamente un messaggio di errore e la terminazione del programma, altrimenti verrà caricato in memoria dopo i controlli dell’apposito gestore.
Passato finalmente in fase di Acquisizione il nostro programma metterà in coda le richieste di risorse che servono per la sua esecuzione ed il job scheduler glie le assegnerà creando un processo che finirà nel process scheduler , un’altra coda che serve per gestire l’utilizzo del processore. Quando il nostro processo arriva in cima alla coda, allora entra nello stato di Esecuzione e lavora con il processore in base alle sue proprietà. Il passo successivo dipende dal tempo di esecuzione che gli è stato assegnato (time-sharing od altre tecniche) poiché:
1) se finisce nel tempo consentito andrà allo stato di terminato liberando le risorse occupate
2) se non ha ancora finito il suo lavoro tornerà nel process scheduler per riappropriarsi del processore al prossimo giro
3) se è in attesa di input o di altri eventi (programmazione ad eventi vs programmazione imperativa) viene congelato (Attesa) dopo aver liberato il processore e verrà richiamato (Pronto) quando l’evento si verificherà.
La concorrenza
Nonostante vedremo la concorrenza tra i processi in maniera semplificata è utile capire come determinate istruzioni possano essere eseguite in parallelo sulla nostra macchina, se sono di un tipo diverso, ovviamente. Ad esempio se dobbiamo leggere un dato da una periferica possiamo ritenere che siano disponibili delle classi di risorse che non vengono coinvolte nel processo e che possono essere utilizzate. In questo modo viene introdotto il concetto di processi non sequenziali che si basano non sulla semplice successione delle singole operazioni, bensì sulla più conveniente parallelizzazione di queste, consentendo così un minore spreco di risorse.
Naturalmente questa tecnica deve necessariamente osservare delle regole che sono atte a garantire la correttezza dei risultati finali, seguendo inoltre con esattezza il diagramma di precedenza per evitare che l’esecuzione di istruzioni in un ordine non consentito (le frecce indicano le operazioni consentite) alteri il risultato finale.
Spero che risulti comunque chiaro che la programmazione ad eventi risulta essere vincente rispetto a quella imperativa, perché consente uno spreco minimo di risorse del sistema. E naturalmente osservate come la programmazione sotto DOS vanifichi i nostri sforzi in quanto la multiprogrammazione è possibile solo tramite TSR, ma l’interrupt non fa altro che interrompere il programma in esecuzione per eseguire l’altro, senza una vera concorrenza alle risorse del sistema. Capiamo quindi come il sistema operativo sia fondamentale, se poi consideriamo che in windows sono disponibili API integrate che dobbiamo solo chiamare lasciando un codice estremamente compatto, arriviamo alla conclusione che la programmazione sotto DOS possa essere impiegata oramai in settori specifici tipo sistemi di controllo o per attività didascaliche.
Esistono 3 semplici regole per stabilire se un processo può essere reso concorrente di un’altro:
1) l’input del primo deve essere indipendente dall’output del secondo
2) l’input del secondo deve essere indipendente dall’output del primo
3) i due output devono essere indipendenti
I costrutti che vengono utilizzati maggiormente per la parallelizzazione di istruzioni o processi sono il cobegin-coend (che permette di risolvere le situazioni strutturate) ed il fork-join (che può risolvere praticamente ogni tipo di problema).
La concorrenza può essere di due tipi:
1) esplicita: più pezzi di software che girano contemporaneamente con costrutti tipo cobegin-coend o fork-join
2) implicita: più task o thread indipendenti se non per le risorse che devono condividere (ad esempio i semafori in JAVA)
Vediamo ora un esempio di processi concorrenti che condividono tra le altre risorse anche un’area di memoria che prende il nome di a ed è inizialmente uguale a 5:
P1: P2:
... ...
acquisisco la risorsa “a” (5) acquisisco la risorsa “a” (5)
sommo 2 ad “a” (7) sommo 2 ad “a” (7)
salvo “a” (7) salvo “a” (7)

sorge un dubbio ancestrale che è alla base della concorrenza: visto che i due processi condividono a, a dovrebbe essere uguale a 9, invece non possiamo essere certi di questo, in quanto tutto dipende dai tempi di esecuzione del nostro processo. Siamo quindi di fronte ad una situazione assolutamente imprevedibile che può dar luogo ad errori non certo facili da risolvere. È necessaria una sincronizzazione dei due processi se vogliamo avere un risultato sicuro: infatti i due processi non sono in una competizione che si potrebbe risolvere con una mutua esclusione della risorsa “a”, sono interferenti . Ed inoltre la mutua esclusione può dar luogo a pesanti rallentamenti per alcune risorse (ipotizziamo l’accesso a determinate periferiche), dobbiamo ricorrere a delle primitive di sincronizzazione che generalmente sono viste come semafori.
1

Esempio