SO1 - Sistemi Operativi PDF
Document Details
Uploaded by DashingCypress379
Università degli Studi di Bari Aldo Moro
Gabriele Imbrici
Tags
Summary
Questi appunti forniscono un'introduzione agli obiettivi e ai servizi di un Sistema Operativo (SO). Vengono discussi concetti chiave come convenienza, efficienza, capacità e gestione delle risorse.
Full Transcript
SO1 Gabriele Imbrici 1° semestre Quali sono gli obiettivi di un Sistema Operativo? Il sistema operativo (SO) ha principalmente, ma non solo tre obiettivi: Convenienza: il sistema operativo deve sempl...
SO1 Gabriele Imbrici 1° semestre Quali sono gli obiettivi di un Sistema Operativo? Il sistema operativo (SO) ha principalmente, ma non solo tre obiettivi: Convenienza: il sistema operativo deve semplificare l’interazione tra l’utente e l’hardware del calco- latore. Questo significa che l’utente può eseguire operazioni complesse in modo intuitivo senza doversi preoc- cupare dei dettagli tecnici o hardware sottostanti; come la gestione delle risorse. Efficienza: un buon sistema operativo deve ottimizzare l’uso delle risorse del calcolatore (come CPU, memoria, spazio di archiviazione e dispositivi periferici). Capacità: un sistema operativo deve non solo funzionare bene con l’hardware e rispondere alle ne- cessità attuali degli utenti, ma deve anche essere abbastanza flessibile e aggiornabile per affrontare cambiamenti futuri in termini di tecnologia, esigenze degli utenti e sicurezza. Il SO agisce come interfaccia trasparente, nascondendo i dettagli hardware al programmatore e fornendo strumenti per l’uso del sistema. Per interfaccia si intende il componente fisico o logico che permette a due o più sistemi elettronici di co- municare e interagire. Quali sono i servizi offerti dal Sistema Operativo? Creazione dei programmi (compilatore, debugger come utilità): questi strumenti non fanno parte direttamente del sistema operativo, ma sono utilità offerte attraverso il sistema operativo per facilitare lo sviluppo del software. Il compilatore traduce il codice sorgente scritto in linguaggi ad alto livello in codice macchina eseguibile, mentre il debugger aiuta a identificare e correggere gli errori nel programma. Esecuzione dei programmi: caricamento in memoria dei programmi, inizializzazione dei dispositi- vidi I/O, ecc... Accesso ai dispositivi di I/O: il sistema operativo fornisce driver e astrazioni che consentono l’accesso ai dispositivi in modo uniforme e semplice, senza che l’utente debba preoccuparsi delle speci- fiche tecniche di ogni dispositivo. Accesso controllato ai file: comprensione del formato, meccanismi di protezione, associazione file indirizzi di memoria. Accesso al sistema (inteso in senso lato): il sistema operativo gestisce l’accesso globale al sistema, che include la gestione degli utenti, dei loro privilegi e dell’autenticazione. 1 Rilevazione e correzione degli errori: hardware o generati da programmi in esecuzione. Contabilità e statistiche d’uso delle risorse: il sistema operativo tiene traccia dell’uso delle risorse del sistema, come CPU, memoria, spazio di archiviazione e dispositivi di I/O. Può raccogliere statistiche di utilizzo per determinare come vengono impiegate le risorse. Sistema Operativo come gestore delle risorse Il sistema operativo, si occupa fondamentalmente di dirigere la CPU nell’utilizzo delle altre risorse del sis- tema e nella temporizzazione dell’esecuzione dei programmi e; decide quando un programma in esecuzione può utilizzare una risorsa (esempio: il processore). Il KERNEL è una parte fondamentale e indispensabile che gestisce le risorse hardware e le interazioni tra il software e l’hardware del computer, che contiene le funzioni del SO usate più frequentemente. Batch multiprogrammati Il termine batch multiprogrammato si riferisce a un modello di esecuzione in cui più programmi (o lavori chiamati ”batch”) vengono caricati nella memoria e gestiti dal sistema operativo in sequenza, ma senza in- terazione diretta con l’utente. L’obiettivo principale di questa tecnica è migliorare l’efficienza del processore, sfruttando al massimo i tempi in cui un programma è in attesa di I/O (input/output) mentre altri programmi sono in esecuzione. A questo punto differenziamo la MONO-PROGRAMMAZIONE e la MULTI-PROGRAMMAZIONE. Mono-Programmazione: il sistema operativo esegue un solo programma alla volta. Durante l’esecuzione di un programma, nessun altro programma può essere eseguito finché il primo non è terminato. Multi-Programmazione: il sistema operativo può eseguire più programmi contemporaneamente (in memoria), sfruttando i periodi in cui un programma è in attesa di I/O per eseguire un altro programma. In altre parole, il processore è utilizzato in modo più efficiente, riducendo i tempi morti e, limitando l’inattività del processore. 2 I processi Un processo è un’entità in esecuzione all’interno di un sistema operativo. È un programma che è stato caricato in memoria e che il sistema operativo gestisce durante la sua esecuzione. Quest’ultimo si compone di: Programma: Codice eseguibile; Dati: variabili, spazio di lavoro e buffer; Contesto di esecuzione (informazioni necessarie al SO per gestire il processo): contenuto dei registri della CPU, priorità, stato di esecuzione e stato di attesa su un dispositivo I/O. Il sistema operativo deve assolvere 5 compiti: 1. Isolamento dei processi; 2. Allocazione e gestione automatica della memoria la gerarchia delle memorie deve essere trasparente all’utente; 3. Supporto alla programmazione modulare variazione di dimensione dei programmi; 4. Protezione e controllo dell’accesso gestione di aree di memoria condivise tra i processi; 5. Memorizzazione a lungo termine; In particolare, è possibile classificare lo stato attuale di un processo mediante, appunto, uno stato. Il Sis- tema Operativo necessita di uno strumento per gestire i processi, che tenga traccia di tutte le informazioni disponibili. Esso prende il nome di Descrittore di Processo oppure Process Control Block (PCB). Cos’è il Process Control Block? Il Process Control Block (PCB) è una struttura dati fondamentale per la gestione dei processi da parte del sistema operativo. Ogni processo che viene creato nel sistema ha il suo PCB, che ontiene tutte le informazioni necessarie per tracciare e gestire lo stato del processo durante il suo ciclo di vita. In altre parole, il PCB è utilizzato dal sistema operativo per monitorare e controllare l’esecuzione di un processo. STRUTTURA E COMPONENTI DEL PCB Identificatore del Processo (Process ID); Informazioni sullo stato del processore: Registri visibili all’utente: questi registri contengono informazioni sui dati di stato del processo che sono accessibili all’utente. 3 Registri di controllo e di stato; Program Counter; Registri di stato; Puntatori alla stack: Ogni processo ha uno stack che viene utilizzato per gestire le chiamate di funzione e le variabili locali. Stato del processo: ogni processo può trovarsi in vari stati, ad esempio: Ready, pronto per essere eseguito; Running, in esecuzione; Waiting, in attesa di una risorsa, come I/O; Terminated, terminato. Priorità nelle code di scheduling: i processi hanno una priorità che determina l’ordine in cui ven- gono eseguiti. Le informazioni di priorità e di schedulazione sono memorizzate nel PCB per guidare il sistema oper- ativo nella selezione del prossimo processo da eseguire. Informazioni correllate alla schedulazione; Evento in attesa. EVENTI DI CREAZIONE E TERMINAZIONE DEI PROCESSI Gli eventi che portano alla creazione di un processo sono 3, ovvero: 1. Richiesta (un utente accede al sistema). 2. Il SO genera un processo sulla base della richiesta di un processo utente. 3. Un processo utente genera un nuovo processo(Padre - figlio). Gli eventi che portano alla terminazione di un processo sono: 1. Terminazione normale (End, il processo ha terminato il suo compito). 2. Uscita dell’utente dalla applicazione. 3. Superamento del tempo massimo. 4. Memoria non disponibile. 5. Violazione dei limiti di memoria. 6. Fallimento di una operazione (aritmetica – I/O). 7. Terminazione del genitore. 8. Richiesta del genitore. 4 MODELLO A 2 STATI Il compito principale di un SO è il controllo dell’esecuzione dei processi per questo il SO deve sapere lo stato di ogni processo per poter allocare le risorse che richiede il processo. Quando un processo viene creato, il sistema operativo lo imposta in stato di “not running”, il processo esiste e attende il momento in cui può passare in esecuzione e quindi, in quel caso, lo stato del processo cam- bia in “running”, una volta che il processo ha terminato la sua esecuzione, il suo stato passa nuovamente in “not running” e il processo in coda, verrà allocato e il suo stato passerà in “running”. Si giunge quindi al modello a 5 stati: Vengono introdotti gli stati New, Exit e Terminated; Lo stato di Not Running viene diviso negli stati Ready (pronto all’esecuzione) e Blocked (in attesa di un evento, una risorsa, ecc...).. 5 MODELLO A 5 STATI Nel modello a 5 stati, il sistema operativo gestisce più dettagliatamente lo stato di ciascun processo, intro- ducendo nuovi stati per risolvere le ambiguità del modello a 2 stati. I 5 stati principali sono: New: quando un processo è appena stato creato, ma non è ancora pronto per l’esecuzione; Ready: il processo è pronto per essere eseguito, ma la CPU non è ancora disponibile. È in attesa di essere scelto dal dispatcher (pianificatore) per ottenere il controllo della CPU; Running: il processo è in esecuzione e sta utilizzando la CPU; Blocked: il processo non può continuare la sua esecuzione perché è in attesa di un evento o di una risorsa, come l’esecuzione di un’operazione I/O; Terminated (o Exit): il processo ha terminato la sua esecuzione. I vantaggi del modello a 5 stati sono: Migliore gestione della schedulazione: il separare lo stato di un processo in Ready e Blocked permette al sistema operativo di distinguere tra processi che sono pronti per l’esecuzione e quelli che sono in attesa di una risorsa; Ottimizzazione dell’uso della CPU; Gestione più precisa delle risorse: con l’introduzione di New e Exit, è possibile gestire meglio la creazione e la terminazione dei processi. CONTEXT SWITCH Il context switch è il meccanismo che consente al sistema operativo di passare da un processo a un altro, salvando e caricando lo stato dei processi coinvolti. 6 QUALI SONO LE CAUSE? 1) Clock Interrupt: il processo che sta eseguendo ha terminato il suo tempo assegnato, quindi il sistema operativo lo sospende e lo rimette in coda (ready), mentre seleziona un altro processo da eseguire. 2) Interruzione da I/O: se un processo stava aspettando un’operazione I/O (ad esempio, in stato Blocked), quando l’operazione è terminata, il sistema operativo lo sposta nello stato Ready, pronto per essere eseguito di nuovo. 3) Memory Fault (Errore di memoria): l’indirizzo di memoria generato è sul disco (memoria virtuale) deve essere portato in RAM. Il SO carica il blocco, nel frattempo il processo che ha generato la richiesta è in blocked al termine del trasferimento andrà in ready. 4) Trap (Eccezione o errore di esecuzione). 5) Supervisor Call (Chiamata al supervisore o sistema). Nel tempo detto Overhead impiegato per il context switch, il sistema non svolge nessun compito (utile all’utente), più l’overhead è basso, maggiore è la quantità di tempo CPU che si può utilizzare per i processi utente ed il tempo dipende dalla complessità del SO e dall’hardware. MODALITA’ DI ESECUZIONE DEI PROCESSI Un processo può essere eseguito in due modalità, utente e sistema (Kernel o controllo). Nella modalità utente, un processo è in uno stato caratterizzato da un numero relativamente basso di privilegi verso la memoria, l’hardware e altre risorse. Nella modalità kernel i processi hanno come scopo: Gestione dei processi Creazione e terminazione Schedulazione Cambio di contesto Sincronizzazione PCB Gestione della memoria Allocazione Trasferimento disco/RAM e viceversa Gestione paginazione/segmentazione Gestione I/O Gestione buffer Allocazione canali I/O Supporto Gestione interruzioni Contabilità 7 MODALITA’ DI CREAZIONE DEI PROCESSI Quando un processo viene creato, prima di andare in esecuzione vengono creati tutti i campi del PCB. 1. Assegnare al processo un PID unico aggiungere una entry level alla tabella dei processi. 2. Allocare lo spazio per il processo e per tutti gli elementi della sua immagine (PCB, User Stack, Area di memoria dati e istruzioni, aree condivise). 3. Inizializzazione del PCB (stato del processore = 0/PC= prossima istruzione/Puntatori allo stack/Stato = ready). 4. Inserimenti nella coda di ready. 5. Estende le strutture al fine della fatturazione o delle statistiche. MODELLO A 6 STATI Swap out: scaricamento del processo sul disco, ovvero la transizione da blocked a suspended. Swap in: operazione inversa allo swap out. Il modello a 6 stati pone un problema analogo a quello a 2 stati: scindiamo quindi lo stato di suspended in Ready/ Suspended e Blocked Suspended. Ciò consente al Sistema Operativo di scegliere tra i processi in New e in Suspended per essere portati in Ready. 8 MODELLO A 7 STATI Può capitare che molti processi in stato di blocked, non vadano in esecuzione per molto tempo ed occupano inutilmente spazio in memoria centrale. Le possibili soluzioni sono due, in primis aumentare la dimensione della memoria centrale del com- puter ma questo comporterebbe un enorme dispendio economico, la seconda soluzione è lo swapping, ovvero spostare un processo momentaneamente dalla memoria centrale alla memoria di archiviazione. Ovviamente un processo che originariamente era nello stato di blocked, anche se spostato in memoria continua a rimanere in questo stato bloccato, in attesa di un evento e non vi è necessità di ricaricarlo in memoria centrale se ancora bloccato, per questo motivo vengono introdotti due nuovi stadi, ovvero, “blocked-suspend” e “ready-suspend”. Nello stato “blocked-suspend” il processo viene caricato nella memoria di archiviazione ma risulta ancora in stato di blocco, in alcuni casi può capitare che per necessità bisogna liberare memoria e il SO decida di spostare anche un processo in stato di “ready” in memoria per questo il processo passa in stato di “ready- suspend”. Ovviamente quando un processo in stato di “blocked-suspend” ha ricevuto il suo evento, esso può passare allo stato di “ready-suspend” o eventualmente anche in “ready”. Un processo in “blocked-suspend”, può passare allo stato “blocked”, ovvero ricaricato in memoria prin- cipale, anche se ancora in attesa del suo evento, questo può capitare perché tale processo ha una priorità maggiore a processi in stato di “ready-suspend”. Quindi, ricapitolando: Blocked-suspend: Il processo viene trasferito in memoria di archiviazione per liberare spazio nella memoria centrale (nel mentre il processo è ancora in attesa dell’evento). Ready-suspend: Il processo viene trasferito in memoria di archiviazione per liberare spazio in memo- ria centrale, anche se il processo è pronto per l’esecuzione. SCHEDULING La schedulazione è la “tecnica” di gestione dei processi. La politica di allocazione delle risorse deve consid- erare i seguenti fattori: 9 Equità di tutti i processi (appartenenti ad una stessa categoria, con richieste simili, stesso costo di risorse) e devono avere tutti la stessa possibilità di accesso alla memoria. Efficienza ovvero la massimizzazione dei trasporti e la minimizzazione dei tempi di riposta. Il Sistema Operativo può prevedere fino a 3 tipi di scheduler: Scheduler di lungo termine (SLT) Scheduler di medio termine (SMT) Scheduler di breve termine (SBT) SCHEDULER A LUNGO TERMINE L’obiettivo dello scheduler a lungo termine è quello di determinare quali programmi inserire nel sistema per l’esecuzione, perciò controlla il grado di multiprogrammazione, ovvero più processi vuol dire un minor tempo percentuale di esecuzione di ognuno di essi (attenzione il tempo dato per l’esecuzione, non il tempo effettivo di esecuzione del singolo processo). Le strategie principali sono quella di fornire alla coda dei processi pronti (e quindi allo scheduler di breve termine) gruppi di processi che siano bilanciati tra loro nello sfruttamento della CPU e dell’I/O. Infatti, esistono dei processi che sono detti “processor bound” ovvero processi che lavorano prevalen- temente a livello computazionale ed occasionalmente utilizzano i dispositivi di I/O, al contrario i “I/O bound” sono i processi che principalmente lavorano con i dispositivi di I/O piuttosto che il processore. Un altro compito è quello di aumentare il numero di processi proveniente dalla coda batch, quando il carico della CPU diminuisce e un ultimo compito è quello di diminuire (fino anche a bloccare) i job proveniente dalla coda batch, quando il carico aumenta e/o i tempi di risposta del sistema diminuiscono. Lo scheduler a lungo termine lavora con i processi in stato di New, ready e Ready Suspend. SCHEDULER A MEDIO TERMINE L’obiettivo dello scheduler a medio termine è quello di gestire la parte del disco o meglio la funzione di swapping. La presenza di molti processi sospesi in memoria riduce la disponibilità per nuovi processi pronti. In questo caso lo scheduler di breve termine è obbligato a scegliere tra i pochi processi pronti. Lo scheduler a medio termine utilizza le informazioni del PCB per stabilire la richiesta di memoria del processo, tenta di allocare spazio in memoria centrale e riposiziona il processo in memoria nella coda dei pronti. Lo scheduler a medio termine viene attivato quando si rende disponibile lo spazio in memoria e/o quando l’arrivo di processi pronti scende al di sotto di una soglia specificata. Lo scheduler a medio termine lavora con i processi in stato di Blocked, ready, Ready Suspende Blocked Suspend. SCHEDULER A BREVE TERMINE Lo scheduler a breve termine è lo scheduler che prende decisioni più spesso, viene anche chiamato soli- tamente dispatcher o allocatore ed ha il compito di decidere quale processo eseguire per prossimo. Lo scheduler a breve termine viene chiamato ogni volta che si verifica un evento che può portare alla sospen- sione di un processo corrente o di pre-rilasciare il processo attualmente in esecuzione in favore di un altro. Quindi in soldoni la sua principale strategia è orientata alla massimizzazione delle prestazioni del sistema 10 secondo uno specifico insieme di obiettivi. Lo scheduler a breve termine lavora con i processi in stato di Ready e Run. ALGORITMI DI SCHEDULAZIONE Prima di definire eventuali algoritmi di schedulazione, definiamo:. Il tempo di ricircolo come il tempo trascorso tra l’avvio di un processo (la sua immissione nel sistema) e la terminazione dello stesso. Il tempo di attesa come il tempo che un processo trascorre in attesa delle risorse a causa di conflitti con altri processi. FIRST COME FIRST SERVED - (FCFS) La più semplice strategia di scheduling è il First Come First Served o First in First Out, non appena un processo diventa Ready, s’inserisce nella coda dei processi Ready. Quando il processo al momento in esecuzione si sospende, il più vecchio processo nella coda dei processi Ready è selezionato per l’esecuzione. Una situazione ideale che i processi più rapidi vengano eseguiti per primi e quelli più lenti per ultimi, ma ciò non sempre accade è può succedere che un processo veloce attenderà molto tempo prima di poter passare in stato di running. Infatti, il problema di questa strategia consiste nel fatto che tende a favorire i processi processor bound (Anche detti CPU Bound) a discapito di quelli I/O. È un sistema senza prerilascio. PRIORITA’ - EVENT DRIVEN Il modello Event Driver applicato nei sistemi dove il tempo di risposta ad eventi esteri è critico. Caratteristiche: Il sistemista può influire sull’ordine in cui uno scheduler serve gli eventi esterni modificando le priorità assegnate ai processi. Le prestazioni sono dipendenti da un’accurata pianificazione nell’ assegnazione delle priorità. Non è in grado di garantire il completamento di un processo in un intervallo di tempo finito dalla sua creazione. Lo scheduler deve sempre dare priorità ai processi nella lista di attesa con alta priorità, infatti ad ogni processo è associato un intero corrispondente al suo grado di priorità, solitamente più questo è basso, più è alta la sua priorità. Questo livello di priorità può essere deciso dal SO o esternamente al SO ovvero in base alla rilevanza del processo e la sua criticità. Il problema di questa soluzione è la Starvation ovvero che i processi a bassa priorità non vengono mai eseguiti. Una soluzione è l’Aging, ovvero al passare del tempo in stato di ready, il numero di priorità del processo aumenta. Per quanto riguarda il modo di decisione dello scheduler esistono due categorie distinte, senza prerilascio e con prerilascio. Senza prerilascio, in questo caso, una volta che il processo è in esecuzione, continua la sua esecuzione 11 fino alla terminazione o finché si blocca in attesa di I/O o se richiede altri servizi del sistema operativo. Con prerilascio, il processo al momento in esecuzione può essere interrotto e spostato in stato Ready dal sistema operativo. ROUND-ROBIN - TIME SLICE Un modo per superare i problemi del FIFO è adoperare il prerilascio basato sul clock. La strategia più semplice che usa questa idea è il Round Robin conosciuto anche come Time Slice. Quando avviene un’interruzione il processo in esecuzione ritorna nella coda dei Ready e il successivo processo è selezionato con il FIFO. Quando il tempo sarà molto grande, l’utilizzo del FIFO è ottimale ma con un tempo molto corto, ci sarà un incremento del numero di context switch. Un inconveniente di questa tecnica è la suddivisione non equa per i processi CPU-bound. Infatti, quando un processo I/O bound si blocca, verrà sostituito da un altro processo e ritornerà in coda di Ready solo quando il processo ha ricevuto il suo evento. HIGHEST RESPONSE RATIO NEXT Viene calcolato per ogni processo il responde ratio, e viene mandato in esecuzione il processo con il valore più alto. Il response ratio viene calcolato ponendo: w - tempo speso in coda di Ready (attesa della disponibilità del processore). s - tempo di servizio previsto. si definisce il Response Ratio come : RR=(w+s)/s. Quando il processo in esecuzione termina o si blocca, si passa al processo Ready con il più grande rap- porto vengono avvantaggiati i processi con un denominatore più piccolo, quindi i processi più brevi ma con il passare del tempo, se un processo non viene servito, aumenterà il suo rapporto e quindi prima o poi supererà i processi più corti. SHORTEST PROCESS NEXT SPN Un’altra strategia è il Shortest Process Nest (SPN), ovvero il processo che ha un tempo di esecuzione minore, viene eseguito per primo. Il SPN è ottimale perché favorisce il tempo medio di attesa minimo, per un dato set di processi. Questa strategia è solitamente utilizzata nello scheduler a lungo termine. Questa strategia sfavorisce i processi CPU-Bound in quanto il tempo di esecuzione per questi ultimi è mag- giore e quindi potrebbe portare alla starvation. Il SPN è una strategia senza prerilascio. Se utilizziamo il prerilascio, se arriva un nuovo processo con una sequenza di CPU minore del tempo nec- essario per la conclusione del processo attualmente in esecuzione, si ha il prerilascio della CPU a favore del processo appena arrivato. 12 Questo schema è anche noto come Shortest Remaining Time First (SRTF). SCHEDULAZIONE A CODE MULTIPLE La coda di Ready è suddivisa in sotto-code, foreground (interactive)e background (batch) ed ogni coda ha il suo algoritmo di schedulazione. Le varie code verranno schedulate a loro volta ad esempio mediante un meccanismo di prelazione, condendo priorità più alta alle code foreground, causano però eventuali problemi di Starvation alle code batch, per questo motivo si può concedere un tempo ad ogni coda (time slicing). SCHEDULAZIONE A CODE MULTIPLE CON FEEDBACK Un processo può essere spostato da una coda all’altra (implementazione dell’Aging). Code Multilevel Feedback definite dai seguenti parametri: Numero di code. Algoritmo di scheduling per ogni coda. Metodi usati per l’up grading e il down grading di ogni processo. THREAD Un thread è un’unità di esecuzione indipendente all’interno di un processo, che condivide risorse come memoria e file, ma ha il proprio stato di esecuzione. I thread sono utilizzati per migliorare la concorrenza, l’efficienza e la reattività di un’applicazione, ma richiedono una gestione attenta, specialmente per quanto riguarda la sincronizzazione delle risorse condivise. Un processo può esser diviso in più thread per: Ottenere un parallelismo dei flussi di esecuzione all’interno del processo Gestire chiamate bloccanti o situazioni di risposta asincrona MULTITHREADING Il Multi-Threading è la capacità del sistema operativo di gestire thread di esecuzioni multiple per ogni processo. L’approccio tradizionale dove il concetto di thread non è evidenziato, viene chiamato Thread Singolo un esempio è MS-DOS. Invece UNIX supporta Processi Multipli a Singolo Thread. In un sistema a singolo thread, la rappresentazione di un processo contiene il suo Process Control Block e il suo spazio di indirizzamento utente, nonché lo stack utente e lo stack del kernel, per controllare il comportamento delle chiamate di procedura e i ritorni da chiamata durante l’esecuzione del processo. Mentre il processo è in esecuzione, esso controlla i registri del processore e il contenuto dei registri viene salvato quando il processore non è in esecuzione. In un ambiente Multi-Thread, ogni processo ha associato un solo PCB (Process Control Block) e un solo spazio di indirizzamento utente ma ogni thread ha un proprio stack, un blocco di controllo privato contenente l’immagine dei registri, la priorità e altre informazioni relative al thread. 13 Quindi, tutti i thread componenti un processo condividono lo stato e le risorse di quel processo, risiedono nello stesso spazio di indirizzamento e hanno accesso agli stessi dati. Il vantaggio chiave dei thread è nelle prestazioni, la creazione di un nuovo processoe lo stesso vale per la terminazione di un thread e il cambio tra due thread dello stesso processo. Degli esempi di utilizzo di thread possono essere: L’esecuzione in foreground e background, infatti in un foglio di calcolo ogni thread controlla una fun- zione particolare del programma, per esempio la gestione degli input degli utenti o la funzione di stampa a video. L’elaborazione asincrona infatti immaginiamo un programma di editor di testo che ogni minuto scrive sul disco il file, per evitare problemi eventuali dovuti alla sospensione di corrente. L’aumento della velocità, infatti in un sistema multithread può calcolare dati e allo stesso tempo può leggere dei nuovi e in un sistema multiprocessore queste operazioni possono avvenire parallelamente. Programmi di organizzazione, che traggono molti benefici poiché composti da molteplici attività di input e output e grazie ad i thread sono facili da progettare. Gli svantaggi dei thread sono principalmente due, ovvero quando un processo viene sospeso, tutti i thread vengono sospesi contemporaneamente perché si deve liberare spazio in memoria e tutti i thread uti- lizzano lo stesso spazio di memoria condivisa e infine quando un processo viene terminato, richiede che tutti i thread vengano terminati. STATO DEI THREAD Analogamente ai processi, anche i thread sono contraddistinti da stati, in particolare i thread possono as- sumere lo stato di Ready, Running e Blocked. A differenza dei processi, non è presente lo stato di Suppsend, perché se un processo viene scaricato dalla memoria centrale lo stesso avviene per TUTTI i suoi thread. Ci sono quattro operazioni base associate ad un cambiamento di thread: Creazione, ovvero quando un processo viene generato, viene generato anche un thread ed un thread può generare un altro thread per lo stesso processo e vengono inserite tutte le info nel Thread Controlo Block (TCB)l’equivalente PCB per i thread. Blocco, quando un thread è in attesa di un evento entra in fase di blocked e vengono salvati il Pro- gram Counter e lo stack pointer. Sblocco, all’occorrenzad ell’evento su cui il thread era bloccato, il thread passa in stato di Ready. Terminazione, ovvero quando un thread completa il suo compito, il suo contesto per i registri e i suoi stack vengono deallocati. 14 RPC Il Remote Procedure Call (RPC) è la chiamata da parte di un processo a una procedura attiva su un elaboratore diverso dal chiamante. USER LEVEL THREAD (ULT) - THREAD A LIVELLO UTENTE Tutto il lavoro della gestione dei thread viene effettuato dall’applicazione e il kernel non sa della esistenza dei thread. Qualunque applicazione può essere programmata con thread multipli utilizzando librerie per i thread che consentono di creare e distruggere thread, scambiare messaggi e dati fra thread per schedulare la gestione dei thread e per salvare e ricaricare i contesti del thread. Quando un processo utente viene passato il controllo alla libreria, il contesto del thread corrente viene salvato e quando il controllo passa dalla libreria ad un thread, il contesto del thread viene ristabilito. VANTAGGI: In primis il cambio thread non richiede privilegi in modalità kernel, poiché tutte le attività avvengono nello spazio utente. Ciò comporta al risparmio del sovraccarico dovuto ai cambiamenti tra le due modalità. Ogni applicazione può utilizzare un proprio algoritmo di schedulazione in base alle proprie esigenze e quindi ottimizzare l’efficienza di esecuzione. Lavorando con thread a livello utente, si può implementare questa strategia su qualsiasi sistema oper- ativo perché non bisogna modificare il kernel sottostante. SVANTAGGI: In un tipico sistema operativo, la maggior parte delle chiamate di sistema comporta un blocco. Cosı̀ quando un thread esegue una chiamata di sistema, non viene bloccato solo quel thread ma tutti quelli appartenenti allo stesso processo. Una applicazione multihread non può sfruttare il multiprocessing, infatti un kernel assegna un solo processo ad un solo processore alla volta, quindi in un dato istante, un solo thread per processo è in esecuzione. Quindi si ha un multiprocessing solo a livello di applicazione. KERNEL LEVEL THREAD (KLT) - THREAD A LIVELLO KER- NEL In caso di KLT puro, tutto il lavoro di gestione dei thread viene effettuato dal kernel. Nella sezione dell’applicazione, non sarà più presente il codice per la gestione dei thread ma solo le API (Application Programming Interface, ovvero interfaccia per la programmazione delle appli- cazioni). In questo modo il kernel mantiene info su il contesto del processo, il contesto dei thread, e lo scambio dei messaggi tra i threads. L’unico svantaggio è l’overhead, ovvero il trasferimento del controllo da un thread ad un altro richiede l’intervento del kernel e quindi una perdita di tempo. 15 SYMMETRIC MULTI PROCESSING (SMP) Un sistema multiprocessore simmetrico (Symmetric multiprocessor system - SMP) è un sistema multiprocessore con una memoria centralizzata condivisa chiamata memoria principale, operante sotto un unico sistema operativo con due o più processori omogenei. Un sistema operativo SMP gestisce i processori e le altre risorse in maniera tale che la visione dell’utente sia un sistema monoprocessore con multiprogrammazione, infatti, un utente può realizzare appli- cazioni che fanno uso di processi o thread multipli senza preoccuparsi del numero di processori disponibili. Le caratteristiche fondamentali per il progettista sono le seguenti: Concorrenza tra Processi e Thread del Kernel: l’esecuzione contemporanea su diversi processori non deve compromettere le strutture di gestione del SO ed evitare gli stalli. Schedulazione: necessità di evitare conflitti. Sincronizzazione: mutua esclusione e ordinamento degli eventi Gestione della memoria condivisa. Tolleranza ai guasti: in caso di “perdita di un processore” devono essere aggiornate le strutture di con- trollo del SO. MICROKERNEL Il microkernel è un piccolo nucleo del sistema operativo che racchiude tutte le funzionalità essenziali per la gestione di una macchina inoltre, le applicazioni sono costruite sopra al microkernel e vengono eseguite in modalità utente. Il microkernel differisce dai sistemi stratificati dove ogni parte comunica solo con quelle adiacenti, infatti il microkernel si pone alla base di tutto e ogni funzione deve passare solo dal kernel. Il problema del microkernel è il passaggio continuo tra gli stati (utente/kernel e viceversa), questo problema si può arginare aumentato il numero di funzioni del microkernel o riducendo il numero. I vantaggi del Micro Kernel sono molteplici: L’interfaccia uniforme, ovvero i moduli usano le stesse interfacce per le richieste al microkernel. L’Estensibilità, ovvero l’introduzione di nuovi servizi o modifiche non richiedono modifiche al microkernel. La Flessibilità, infatti a seconda delle applicazioni certe caratteristiche possono essere ridotte o potenziate per soddisfare al meglio le richieste dei clienti. La Portabilità, infatti il cambio dell’hardware comporta solo ed unicamente la modifica del microkernel. L’Affidabilità, infatti lo sviluppo di piccole porzioni di codice ne permette una migliore ottimizzazione e test. Il Supporto ai Sistemi Distribuiti, ogni servizio è identificato da un numero nel microkernel e una richiesta da client non è necessario che sappia dove si trova il server in grado di soddisfarla. Ricapitolando il microkernel deve contenere le funzioni che dipendono direttamente dall’hardware, le funzioni per la gestione dei processi e la gestione primitiva della memoria. 16 Una delle funzionalità minime del microkernel è la gestione primitiva della memoria, ovvero il con- trollo di indirizzamento per rendere possibile l’implementazione della protezione a livello di processo. Un modello esterno al microkernel mappa pagine virtuali in pagine fisiche. Il mapping è conservato in memoria principale. Una applicazione che accede ad una pagina che non si trova in memoria genera una page fault. L’esecuzione passa al microkernel che invia un messaggio al paginatore comunicando la pagina richiesta e la pagina viene caricata, poi quando viene caricata la pagina il pager invia un messaggio all’applicazione. Il microkernel riconosce gli interrupt ma non li gestisce direttamente, infatti li trasforma in messaggi a livello utente, che invia al processo che gestisce l’interrupt. La comunicazione tra processi avviene in questo modo, il messaggio è formato dall’intestazione (ovvero il mittente e il ricevente) il corpo del messaggio (ovvero i dati del messaggio) e il puntatore + le info di controllo (informazioni di controllo del processo, blocco dati). Ad ogni processo è associata una porta amministrata dal Kernel e la Capability list indica chi può inviare messaggi. 17