CAPITOLO 4 - Evoluzione dei Sistemi Operativi EVOLUZIONE DEI SISTEMI OPERATIVI I Sistemi che si presenteranno vanno dai sistemi monoprogrammati ai sistemi multiprogrammati e anche multiutenti. Questi ultimi sono i sistemi evoluti contemporanei. OBIETTIVI DI UN SISTEMA OPERATIVO I motivi per cui viene intrapresa la progettazione di un sistema operativo generalmente sono: 1° rendere facile l’uso delle componenti del computer, 2° rendere efficiente l’uso di tutte le parti di un computer, cioè fare un buon uso delle risorse, 3° avere la possibilità di far facilmente evolvere le sue componenti per adattarle alle nuove esigenze del software e dell’hardware. Al limite potendosi cambiare le caratteristiche di parti con l’aggiunta di nuove petch che consentono l’upgrade del sistema e quindi di poter modificare le prestazioni del sistema senza per questo doverlo sostituire integralmente. IL S.O. COME INTERFACCIA UTENTE/COMPUTER In questa slide è presentata la collocazione del sistema operativo all’interno della macchina e come si vede esso è immediatamente al di sopra dell’hardware giust’appunto a significare che ogni altro programma farà uso del sistema operativo per utilizzare l’hardware. Lo strato più basso in questa piramide è rappresentato dall’hardware sul quale opera tutto il sistema operativo e tutti i programmi utenti. Il sistema operativo per funzionare utilizza diversi programmi o utility. Per esempio durante una lezione in aula ci può essere l’utility relativa alla routine di invio al proiettore delle slides di presentazione degli argomenti da trattare e c’è contemporaneamente l’utility di invio al monitor degli stessi file che consentono al docente di vedere quello che si sta proiettando sullo schermo. E’ chiaro che per la realizzazione di slides di presentazione si è utilizzato un programma applicativo, in questo esempio è il Power Point. Nella slide utilità e programmi applicativi li vediamo rappresentati più in alto nella piramide. Al vertice è riportato l’utente finale che in questo esempio sarebbe il docente che presenta la lezione se svolta in aula. SERVIZI FORNITI DAL SISTEMA OPERATIVO Creazione dei programmi Esecuzione dei programmi Accesso ai dispositivi di I/O Accesso controllato ai file Accesso al sistema Rilevazione e correzione degli errori Contabilità e statistiche d’uso Un sistema operativo fornisce i servizi per la creazione di programmi, per la loro esecuzione, per l’effettuazione d’operazioni di I/O verso dispositivi. Nell’esempio illustrato nella slide precedente si tratta d’operazioni di accesso al dispositivo monitor e il dispositivo proiettore. Inoltre, il sistema operativo fornisce servizi che consentono l’accesso controllato ai file, infatti un docente può scegliere di illustrare agli studenti la lezione numero due o numero tre. Infine esso fornisce l’accesso al sistema, fa le rilevazioni e la correzione degli errori, effettua la contabilità e raccoglie le statistiche di uso del computer. 1 SISTEMA OPERATIVO COME GESTORE DELLE RISORSE In questa slide è mostrata una guida schematica di rappresentazione di un sistema operativo in un sistema multiprocessore. Il sistema operativo, con il suo kernel, occupa la memoria centrale. Le altre componenti vengono spostate in base all’occorrenza dalla memoria secondaria nella memoria centrale. La memoria centrale contiene anche i programmi, i dati e i driver di controllo dei dispositivi periferici attraverso il controller di Input/Output. La macchina, rappresentata in questa figura, utilizza i dispositivi periferici, rappresentati tramite ellissi, mentre nella memoria secondaria sono memorizzati i dati e i programmi dell’intero sistema operativo. Importante è notare che il sistema operativo nella sua interezza normalmente si trova su disco, mentre una parte o tutto il kernel può trovarsi nella memoria centrale. A seconda delle necessità, l’utilizzazione del sistema operativo richiede operazioni di trasferimento dalla memoria secondaria alla memoria principale e viceversa, ossia quando le varie parti di sistema operativo non sono più utili queste vengono ritrasferite nella memoria secondaria. Qui si pone il problema se è necessario ritrasferirle oppure No. E’ chiaro che se non sono modificate, e normalmente le parti di sistema operativo non sono modificate, non c’è bisogno di ritrasferirle nella memoria secondaria. E’ solo per poterle usare che diventa necessario trasferire, dalla memoria secondaria alla memoria principale, le parti che non sono presenti nella memoria centrale. FACILITÀ DI EVOLUZIONE DI UN SISTEMA OPERATIVO Nella fase di progettazione di un sistema operativo bisogna tenere conto che se cambia l’hardware, e molto facilmente sul mercato si affacciano nuovi tipi di hardware, il sistema operativo deve poter continuare a funzionare anche su nuove piattaforme hardware. Inoltre, il sistema operativo potrebbe col tempo richiedere l’inserimento di nuovi servizi, c’è quindi bisogno di progettarlo almeno in maniera modulare, anche se il concetto di modularità è ormai sorpassato. Infine, poiché è facile che malfunzionamenti di parti del sistema operativo siano individuati nel corso del tempo, deve poter essere sempre facile intervenire per eseguire le dovute correzioni. Queste sono le caratteristiche fondamentali di un sistema operativo affinché esso abbia un ciclo di vita il più lungo possibile. SISTEMI BATCH Per poter correttamente introdurre i moderni sistemi operativi è opportuno menzionare due antesignani che sono i sistemi a lotti (o sistemi batch) e i sistemi time sharing. In questa slide sono riportate le principali caratteristiche dei sistemi a lotti. Inizialmente per utilizzare al meglio le risorse di un computer bisognava facilitare l’uso del processore evitando il problema dei tempi d’attesa della macchina per il completamento delle operazioni di Input/Output. Nei sistemi Batch all’inizio i vari programmi erano inseriti nella macchina istruzione dopo istruzione, essendo normalmente le istruzioni scritte su schede perforate e lette dai lettori di schede, il tempo necessario per scrivere i programmi e 2 agli operatori per inserire le schede era lungo rispetto ai pochissimi secondi necessari alla CPU per eseguire le istruzioni. Per migliorare l’utilizzo delle macchine si crearono quindi i sistemi a lotti. I vari programmi erano dati attraverso pacchi di schede al lettore di schede, dal lettore di schede, si passò alla registrazione dell’input su nastri magnetici e questa fu una prima evoluzione. Si ebbero, così, computer satelliti di I/O che operavano intorno al computer centrale. E’ il caso negli anni 60 del 360 o anche del più piccolo IBM 1800. Dopo la lettura, i nastri magnetici venivano trasferiti ai lettori di nastro sul computer centrale e questi provvedeva all’esecuzione dei programmi. Si formò così un insieme di programmi messi in un unico blocco, detto lotto. Il linguaggio di macchina dominante per i sistemi IBM e altri sistemi era il Fortran. L’organizzazione di ogni programma, riportata nella parte destra della figura, consisteva di alcune schede prioritarie dette schede job, a cui seguivano le istruzioni in Fortran a cui erano collegati i dati. Alla fine dei programmi nei vari lotti erano inserite le schede di ritorno. Il sistema batch funzionava in questo modo: il monitor, una volta individuate le schede job, caratterizzate dal simbolo dollaro ($) che precedeva l’istruzione, leggeva sulle schede job il nome dell’utente, la richiesta di spazio di memoria, il tempo stimato per l’esecuzione del programma e ciò consentiva di individuare le risorse da impegnare, risorse di tempo e risorse di spazio di memoria. Non appena l’istruzione dollaro run era processata dal monitor, il programma veniva eseguito. Alla fine il ritorno al monitor era ottenuto attraverso la scheda dollaro end. Quindi un sistema batch consisteva di un monitor centrale il quale aveva il preciso scopo di serializzare i job, di gestire i dispositivi, di controllare le interruzioni e di eseguire l’interpretazione delle istruzioni del linguaggio del programma utente. Elaborazione seriale interazione diretta schedulazione fissa preparazione del job Sistemi batch monoprogrammati utilizzo del monitor raccolta dei job in lotti esecuzione di tutti i job di un lotto Le caratteristiche principali di un sistema batch erano l’interazione diretta, la schedulazione fissa e la preparazione del job. Per riassumere il monitor era utilizzato per l’avanzamento dei diversi job raccolti in lotti e provvedeva all’esecuzione di tutti i job all’interno di un lotto. Protezione della memoria non alterare area riservata al monitor Timer prevenire monopolizzazione delle risorse Istruzioni privilegiate istruzioni eseguibili solo dal sistema operativo Interruzioni possibilità di interrompere l'esecuzione del programma utente Nella progettazione del sistema operativo bisognava porre attenzione a non alterare in memoria l’area riservata al monitor. Infatti, ogni volta che un programma utente faceva riferimento a locazioni di memoria riservate al monitor era generato un interrupt e la macchina si fermava. Si è anche visto che al fine di evitare la monopolizzazione di una risorsa, ad esempio il processore da parte di un processo, era utilizzato un timer e sulla base del tempo stimato in assegnazione al processo, ogni volta che tale tempo veniva superato, il lotto era espulso. Ciò significa che esistono delle istruzioni privilegiate eseguite dal sistema operativo, che sono quelle contrassegnate in ingresso dal simbolo $. Il sistema operativo aveva pure la possibilità di essere interrotto da particolari segnali d’interruzione, quali ad esempio quello di nastro finito o, se aveva delle stampanti in linea, quello di mancanza di carta e via dicendo. BATCH MULTIPROGRAMMATI TIME-SHARING Sistemi batch multiprogrammati limitare l’inattività del processore elaborazione seriale dei task Sistemi time sharing condivisione del tempo di processore fra i vari processi elaborazione dei processi utente in quanti di tempo forma evoluta di multiprogrammazione Un altro tipo di sistema operativo che apparve sul mercato fu il sistema time-sharing, in particolare il Compatible Time-Sharing System (CTSS). L’origine dell’ideazione di questi sistemi operativi usati per le prenotazioni aeree, risiedeva nella possibilità di fare delle prenotazioni da varie agenzie. Il principio base di un time-sharing era quello di assegnare un certo intervallo di tempo fissato, chiamato in inglese “slice”, ad ognuno dei terminali in linea con il sistema centrale. Quello che accadeva era che a turno uno dopo l’altro le varie periferiche prendevano il controllo del sistema centrale provvedendo a fare le prenotazioni, cioè le transazioni sulle tabelle dei voli. 3 Questo principio è stato poi sfruttato in quasi tutti i sistemi operativi che uniscono le capacità batch alle capacità timesharing. In questo caso non si tratta di fare assegnazioni alle diverse agenzie, ma si tratta di fare l’assegnazione della risorsa processore per quanti di tempi uguali e successivi ai diversi processi in avanzamento nel sistema. In questo modo si è avuta una forma evoluta di multiprogrammazione giacché la multiprogrammazione semplice del batch impegnava ad eseguire i programmi uno dopo l’altro. Il time sharing dà la possibilità di eseguire i vari programmi contemporaneamente assegnando a ciascuno dei processi in avanzamento nel sistema una slice o quanto di tempo. REQUISITI DELLA MULTIPROGRAMMAZIONE Tutti i requisiti necessari alla monoprogrammazione In più: gestione Interrupt avanzato per gestire il cambio dei processi oltre che per la gestione dello I/O DMA I moderni sistemi operativi, per un efficiente ed efficace passaggio dalla monoprogrammazione alla multiprogrammazione, hanno richiesto l’inserimento di due altri concetti base ossia l’interrupt e il DMA (Direct Memory Access). Per evitare che il processore sia in controllo attivo delle esecuzioni di istruzioni o di routine, può essere più semplice utilizzare il meccanismo d’Interrupt, ma per effettuare trasferimenti tra dispositivi non c’è bisogno che tutto passi attraverso la CPU, quindi nei sistemi è stato inserito il DMA che consente, via bus, il trasferimento da un dispositivo ad un altro semplicemente posizionando l’indirizzo di partenza nel buffer o nella parte di memoria riservata ad un dispositivo. Questo trasferimento avviene con incremento automatico dei contatori e senza che il processore stia a controllarli. ESEMPIO DI UTILIZZO MONOPROGRAMMATO Questa slide fa la dimostrazione contabile delle economie che sarebbe opportuno fare tenendo conto di quello che accade in un sistema di calcolo monoprogrammato . Se si deve elaborare un programma di 100 istruzioni normalmente sono sufficienti 1.000 microsecondi. Per trasferire però 100 istruzioni dalla memoria secondaria alla memoria principale occorrono 15.000 microsecondi ed in seguito l’elaborazione per riscrivere il record nella memoria secondaria richiede altri 15.000 microsecondi. Quindi, un totale di 31.000 microsecondi sono necessari perché questo programma di 100 istruzioni possa essere eseguito. Se andiamo a vedere la percentuale d’uso della CPU scopriamo che solo 0.0001 secondi su un totale di 0.0031 secondi viene utilizzato per la CPU e quindi lo 0.032 cioè la CPU è utilizzata in totale per il 3,2% del tempo, mentre il 96,8% non viene utilizzata. Ciò dimostra che in un sistema monoprogrammato si ha un grande sperpero di risorse con l’inutilizzo del processore. 4 ESEMPIO DI UTILIZZO MULTIPROGRAMMATO Vediamo un esempio d’uso di un sistema multiprogrammato. Se due programmi A e B devono essere eseguiti, potrebbe accadere che, nel momento in cui sul processore vengono eseguite le istruzioni del programma A, non possono essere eseguite le istruzioni del programma B. Con il meccanismo della multiprogrammazione il programma B va ad effettuare operazioni di trasferimento nello stesso tempo in cui va in esecuzione sul processore il programma A, quindi, la multiprogrammazione consente di far avanzare in parallelo più programmi sulla macchina, anche se è un parallellismo fittizio. Di qui a compiere il successivo passo per la multiprogrammazione facendo avanzare non due ma tre o n processi nel sistema è facile e questo è rappresentato nella parte c dell’immagine. ISTOGRAMMA DI UTILIZZO IN MONOPROGRAMMAZIONE In questa slide sono illustrati 3 esempi di programmi di cui il primo ha una durata di 5 secondi, il secondo di 15 secondi e il terzo di 10 secondi. Questi hanno però caratteristiche diverse perché il primo programma richiede una memoria d’estensione 50, il secondo 100 e il terzo 80. Inoltre il primo e il secondo programma non utilizzano il disco, il terzo sì. Solo il programma P2 fa uso del terminale, mentre i programmi P1 e P3 no. Inoltre la stampante è utilizzata solo dal programma P3. Ciò dimostra che dispositivi diversi sono coinvolti nell’avanzamento e questo facilita la multiprogrammazione. 5 PROCESSI DI FACILE MULTIPROGRAMMABILITÀ Questa illustrazione mostra l’istogramma d’utilizzazione monoprogrammata delle risorse. Si nota che per le prime 5 unità di tempo il programma 1 utilizza la CPU, nelle successive 15 unità di tempo, diciamo 15 secondi, è il programma 2 che utilizza la CPU e solo negli ultimi 10 secondi è il programma 3 che impegna oltre alla CPU altre risorse, per esempio la memoria, il disco ed ecc… . ISTOGRAMMA DI UTILIZZO IN MULTIPROGRAMMAZIONE Se il sistema è multiprogrammato, in 15 secondi, che è la durata massima del JOB 2 o se vogliamo del processo 2, tutti e tre i processi possono essere eseguiti con il meccanismo delle DMA e degli interrupt. 6 EFFETTI DELLA MULTIPROGRAMMAZIONE Questa slide riporta alcune valutazioni quantitative, mostra i vantaggi della multiprogrammazione rispetto alla monoprogrammazion e e dà il modo di meglio apprezzare i vantaggi del multiprocessing cioè i vantaggi d’uso di più processori. Si osserva che se il lavoro è eseguito a porzioni ma in parallelo, un sistema con molti processori dà migliori risultati rispetto ad un sistema dello stesso tipo a singolo processore. Ma al di là dei sistemi multiprocessori, tornando a quelli a singolo processore , ci rendiamo conto che con la multiprogrammazione giungiamo a risultati d’ottimizzazione che portano la percentuale d’uso del processore dal 17% nella monoprogrammazione al 33% nella multiprogrammazione. Nella tabella sono anche comparati i risultati tra la monoprogrammazione e la multiprogrammazione per l’utilizzo della memoria, del disco, della stampante, del tempo totale, del throughput, che è il numero di processi che attraversano il sistema, e del tempo medio sull’esecuzione di tutti i job. FUNZIONAMENTO DI SISTEMA TIME SHARING Una più precisa descrizione del sistema time sharing è riportata in questa slide. In questo caso ci sono 4 job in avanzamento. Accade che ognuno di questi job viene trasferito dalla memoria secondaria alla memoria principale, ovviamente al di fuori della zona riservata al monitor che in questo esempio occupa i primi 5 KB di memoria. Quando il tempo assegnato al job 1 è finito ( end of slice), si carica in memoria il job 2 e viene mandato in esecuzione per lo stesso “quanto” di tempo. Così di seguito viene caricato il job 3 e potrebbe essere che, essendo il job 3 più corto, non ha bisogno di usare tutto l’intervallo di tempo che gli viene assegnato,a questo punto vari perfezionamenti dei sistemi time sharing possono essere intuiti. Andando avanti, al successivo passo viene caricato di nuovo il job 1 e viene scaricato il job 4. Importante è far notare come al momento del ricarico di job, poiché alcuni pezzi non sono stati scaricati o meglio non sono stati ricoperti, può essere semplicemente effettuata la riscrittura in memoria principale della parte di codice mancante del job che deve andare in esecuzione. 7 MULTIPROGRAMMAZIONE BATCH vs. TIME SHARING Questa slide riporta le caratteristiche essenziali dei sistemi batch e dei sistemi time sharing. I sistemi batch sono stati inventati per massimizzare l’uso del processore, invece i sistemi time sharing per minimizzare il tempo di risposta. Per chiarezza, se uno dei job fosse molto lungo e impegnasse il processore per molto tempo, un altro job, che deve utilizzare il processore per un tempo minimo, è costretto ad aspettare che venga prima eseguito tutto il programma che lo precede e a prendere il controllo del processore solo in seguito. Il time sharing, avendo diviso il tempo d’assegnazione del processore a diversi processi, fa sì che tutti possano avanzare nel sistema, quindi il time sharing combinato col batch è la base principale degli attuali sistemi di multiprogrammazione moderni. E’ importante notare che le sorgenti delle istruzioni sono il linguaggio di controllo dell’avanzamento dei job, oppure, nel caso del time sharing i comandi inseriti dal terminale. Quest’ultimo aspetto mette in evidenza la differenza tra i due sistemi per essere il primo eseguibile a programma ed il secondo con comandi interattivi. CAUSE DI ERRORE Sincronizzazione impropria perdita o duplicazione dei segnali Fallimento della mutua esclusione accesso non esclusivo a risorse condivise Operazioni non determinate uso di dati comuni in modo incontrollato Stallo (deadlock) attesa reciproca di risorse ASPETTI DELLA PROGETTAZIONE DI S.O. Governo dei processi Gestione della memoria Protezione e sicurezza informazione Schedulazione risorse Struttura di sistema Questa slide riporta le principali cause d’errore nei moderni sistemi operativi. La slide si commenta da sola. Gli aspetti fondamentali controllati da un sistema operativo sono la gestione dei processi e della memoria, la protezione e la sicurezza dell’informazione, la schedulazione delle risorse e la struttura di sistema. Per vedere più nei particolari questi aspetti fondamentali del sistema operativo si tratterà nelle successive slide uno per uno questi aspetti. PROCESSO I moderni sistemi operativi ruotano e si spiegano bene, intorno al concetto base di processo. DEFINIZIONI DI PROCESSO Un programma in esecuzione La "anima" di un programma L'entità assegnata ad un processore In questa slide sono riportate alcune tra le più note definizioni di processo. Se si pensa ad un programma, quando le diverse istruzioni sono eseguite una dopo l’altra, si può affermare che il programma in esecuzione è il processo. Eseguire un programma significa dare una certa animazione alle istruzioni e quindi il processo è la “anima” di un programma. Se si guarda al processo come entità assegnata o se si pensa alle risorse che sono utilizzate per l’avanzamento di un processo si potrebbe dire che un processo è una entità assegnata ad un processore, ovvero, l’esecuzione di un programma su un processore costituisce il processo. 8 COMPONENTI DI PROCESSO Programma codice eseguibile Dati variabili spazio di lavoro buffer Contesto di esecuzione contenuto dei registri altre informazioni: es. priorità, stato di attesa Le componenti di un processo possono essere così riassunte. Il codice eseguibile costituisce il programma che è parte del processo. I dati, ossia le variabili, lo spazio di lavoro e il buffer, sono altre componenti di cui il processo si serve durante la sua esecuzione. Un altro componente importante del processo è il contesto di esecuzione, cioè un processo viene eseguito nell’ambito di un contesto che è descritto dai contenuti di tutti i registri della CPU, inoltre, il contesto di esecuzione conserva altre informazioni come la priorità con cui il processo viene eseguito, oppure lo stato di attesa in cui esso si trova. IMPLEMENTAZIONE TIPICA DI PROCESSO Processo = struct {programma, dati, contesto} Questa slide mostra vari processi residenti nella memoria principale e come il sistema operativo li gestisce. La memoria principale contiene la lista dei processi costruita e gestita dal sistema operativo, ossia un blocco di memoria che contiene il programma, i dati e il contesto del particolare processo i, j e così via. Nella figura si vede, a sinistra, la mappa della memoria principale. C’è una zona riservata alla lista dei processi con i puntatori ai processi, cioè alle aree di memoria relative ai processi in cui sono allocati i dati forniti dal processo che permettono di poter far avanzare l’esecuzione dei processi stessi. Sulla destra ci sono i registri del processore. In particolare c’è il Registro indice dei processi con l’indice del processo i che punta al contesto. Il contesto permette di trasferire all’interno dei registri del processore non solo l’indice del processo ma anche il valore del Program Counter da cui il processo si avvia. Prima di arrivare, dal contesto vengono trasferiti nelle liste di sicurezza l’indirizzo di base da cui inizia l’esecuzione e il valore di limite. Ogni volta che l’indirizzo va al di fuori del range “base + limite” si genera un errore e di conseguenza il processo è arrestato. Naturalmente per dare la possibilità al processo in esame di essere eseguito occorre trasferire nei registri i valori che sono normalmente conservati nel contesto. Tutto questo perché occorre definire all’inizio i valori iniziali dei registri e poi man mano che il processo avanza nel sistema è necessario che nel contesto venga conservato lo stato delle interruzioni per poter poi essere riprese nel riavvio del processo in questione, quindi il processo è una struttura in cui sono conservati sia il programma, sia i dati, sia il contesto. 9 MEMORIA Diciamo ora qualcosa su un’altra importante parte di un sistema che è la memoria. GESTIONE DELLA MEMORIA Per assolvere alle richieste dei diversi utenti il sistemi operativi deve provvedere a: Isolamento dei processi Allocazione e gestione automatica Supporto alla programmazione modulare Protezione e controllo dell’accesso (Memorizzazione a lungo termine) Un sistema operativo ha la responsabilità di gestire la memoria che viene utilizzata per contenere i dati, il programma e il contesto relativi a ogni processo. Questo deve farlo avendo la sicurezza di isolare i vari processi, di allocare i processi e tutte le strutture relative ai processi in maniera automatica, avendo una struttura tale da poter consentire la programmazione modulare, potendo effettuare protezione e controllo di accesso alla memoria e contemporaneamente potendo garantire la memorizzazione a lungo termine. SISTEMI DI MEMORIZZAZIONE Ci sono due modi di vedere il sistema di gestione della memoria: uno è quello del punto di vista dell’utente e l’altro dal punto di vista del progettista del sistema operativo. Il primo vede il processore virtuale con la memoria virtuale astraendo dal contesto, programma e dati che si trovano. Tutto è eseguito sul processore come se tutto risiedesse nella memoria centrale. In verità le strutture dati e i vari dati sono in memoria secondaria e solo all’occorrenza vengono trasferiti dalla memoria secondaria nella memoria principale. Questo viene fatto attraverso uno schema che è ben noto al progettista di sistema operativo. Infatti, accade che un mapper, traduttore di indirizzi, effettua i trasferimenti delle varie pagine dalla memoria secondaria alla memoria principale attraverso operazioni di swap, ossia swap-in e swap-out, a seconda che le pagine vadano dalla memoria secondaria alla memoria principale o viceversa dalla memoria principale alla memoria secondaria. PROTEZIONE DELL’INFORMAZIONE Le principali operazioni di competenza del sistemi operativi per la salvaguardia della sicurezza coinvolgono: Controllo dell’accesso Controllo del flusso dell’informazione Certificazione SCHEDULAZIONE La politica di allocazione delle risorse deve considerare i seguenti fattori: Equità Tempo di risposta differenziale Efficienza L’uso crescente dei sistemi time sharing ha portato in evidenza i problemi relativi alla protezione dell’informazione. Questi problemi riguardano l’accesso ai sistemi di elaborazione e all’informazione memorizzata in essi. Per quanto riguarda, quindi, la protezione dell’informazione, è compito del sistema operativo eseguire il controllo dell’accesso degli utenti al sistema, ai sottosistemi e ai dati. Il sistema operativo, inoltre, fa il controllo del flusso dell’informazione nel sistema e verso gli utenti e la certificazione, ossia la verifica d’esecuzione delle specifiche dei meccanismi di controllo d’accesso e del flusso. Un altro aspetto di cui si deve occupare un sistema operativo è la schedulazione. Per essere chiari i processi avanzano nel sistema volendo ognuno utilizzare le risorse. A tal fine è necessaria una politica che assegni ai diversi processi le risorse del sistema, qualunque esse siano, sia che si stia parlando di processore, di memoria, che di dispositivi. Una politica d’allocazione delle risorse deve rispettare determinati principi. I principi della schedulazione sono equità, per esempio, tutti i processi che sono in avanzamento nel sistema devono avere la possibilità di utilizzare il processore senza esclusioni di sorta. Deve anche essere prevista una risposta differenziale nel tempo, ossia ci può essere un processo che richiede una risorsa da utilizzare per lungo tempo e un altro per un breve periodo. Quest’ultimo deve poter utilizzare tale risorsa 10 per il tempo di cui ha bisogno e il tutto deve essere fatto in maniera efficiente, cioè le risorse devono essere gestite dal sistema operativo in maniera efficiente qualunque esse siano. ELEMENTI CHIAVE PER LA MULTIPROGRAMMAZIONE Questa slide mostra i principali elementi di un sistema operativo coinvolti nella schedulazione dei processi e nell’allocazione delle risorse in un ambiente multiprogrammato . EVOLUZIONE SISTEMI OPERATIVI In questa slide sono riportati i più importanti sistemi operativi prodotti negli anni tra il 1963 e il 1975. Il primo sistema operativo time sharing, prodotto nel 1963 è stato il Compatible Time Sharing System, esso conteneva ben 32.000 istruzioni. Già l’anno dopo, nel 1964, fu prodotto il 360 dall’IBM e consisteva in oltre un milione d’istruzioni. Dieci anni dopo il sistema operativo Multix, progenitore di Unix, conteneva già 20 milioni d’istruzioni. PROBLEMI Prima di descrivere la struttura di un sistema operativo è conveniente fare alcune valutazioni sui problemi generali dei sistemi operativi. Innanzitutto i sistemi operativi sono in genere in ritardo rispetto alle esigenze che devono soddisfare, esigenze espresse dagli utenti. Il secondo problema è che nella progettazione di un sistema operativo e nella verifica delle sue funzionalità l’esistenza dei bachi latenti è rilevata soltanto dopo un tempo consistente. Per dare la possibilità di avere sistemi operativi all’altezza delle esigenze degli utenti è necessario che gli stessi siano realizzati sulla base della modularità e organizzati, e questo già nei primi sistemi operativi avveniva, secondo una gerarchia di livelli che passa dall’ utente all’hardware. 11 ARCHITETTURA DI UN SIST. OP. GERARCHICO Architettura di un sistema operativo gerarchico. Dalla figura si vede che esistono tre strati in un sistema operativo gerarchico. Quello relativo all’hardware, quello del low level del sistema operativo e la parte high level del sistema operativo. La parte hardware contiene tutti i circuiti l’insieme delle istruzioni, le procedure e le interruzioni. Gli oggetti dei circuiti sono normalmente registri, porte, bus e così via e le operazioni che i rispettivi circuiti fanno sono operazioni del tipo clear, cioè azzeramento, trasferimento, attivazione e complementazione. Gli oggetti, invece, dell’insieme delle istruzioni sono stack di valutazione, interpreti di microprogrammi, dati scalari, array e così via, le operazioni sono carica, memorizza, addiziona, sottrai, salta. Gli oggetti delle procedure sono procedure, stack di chiamate, di display, le operazioni che consentono di fare le procedure sono ad esempio il mark stack, call e return. Al quarto livello, sempre nello strato dell’hardware ci sono le interruzioni. I suoi oggetti sono i programmi per la gestione delle interruzioni e normalmente le operazioni del sistema operativo sono quelle di mascheramento, eliminazione del mascheramento, il rientro, l’invocazione. Il low level di un sistema operativo contiene al quinto livello i processi primitivi, con oggetti come i semafori e le liste dei processi pronti. Le operazioni che si eseguono con i processi primitivi sono la sospensione, il wait signal e il resume. Al livello sei c’è la memoria secondaria locale. Gli oggetti sono blocchi di dati, canali di dispositivi e le operazioni sono quelle di lettura e scrittura, di allocazione e di liberazione delle parti di memoria. Il settimo livello nel low level di un sistema operativo è la memoria virtuale che consente l’utilizzazione di pagine e segmenti per leggere e scrivere le varie parti di memoria. L’high level del sistema operativo contiene le comunicazioni, i cui oggetti sono i pipe e le operazioni sono quelle di creazione, distruzione, apertura, chiusura, lettura e scrittura, invece, il file system gli oggetti sono i file con operazioni relative al file system che consentono di creare, distruggere, aprire, chiudere, leggere e scrivere i file. Poi c’è il livello dieci del sistema operativo che è quello dei dispositivi che sono dispositivi esterni come stampanti, schermi, tastiera. Vengono visti dal sistema operativo per la creazione, la distruzione, l’apertura e la chiusura, la lettura e la scrittura dei dispositivi. Al livello undici del sistema gerarchico ci sono le directory. Gli oggetti sono le directory e le operazioni sulle directory sono create, destroy, attach, detach, search e list. Di seguito al livello dodici ci sono i processi utente. Gli oggetti sono i processi utente e le operazioni su tali oggetti sono quit, kill, suspend e resume. Da ultimo c’è la shell il cui oggetto è a livello di programmazione utente. Essa utilizza i comandi del linguaggio di shell e rappresenta l’interfaccia più prossima all’utente mettendolo in condizione di utilizzare tutto il sistema. 12