Issuu on Google+

Sincronizzazione Quando in un sistema operativo esistono due o più processi essi devono essere sincronizzati. Si possono verificare due situazioni: – Competizione: i processi avanzano indipendentemente uno dall'altro, quindi dovrà essere predisposto un dispositivo che a fronte di due richieste contemporanee dei due processi le accodi sincronizzandone l'accesso attraverso la mutua esclusione. – Cooperazione: quando i processi interagiscono tra loro, quindi cooperano per il raggiungimento di un risultato. Esistono due modalità con cui essi possono interagire: –

cooperazione a variabili condivise, quando il sistema operativo mette a disposizione dei processi un area comune su cui essi possano scrivere e leggere i dati, un area privata per ciascun processo (per informazioni riservate ai processi) e un dispositivo di mutua esclusione per la sincronizzazione dei processi nell'area condivisa;

– cooperazione a scambio di messaggi, dove il sistema operativo dovrà assicurare ad ogni processo un identificativo univoco, due funzioni (trasmissione e ricezione) per assicurare la comunicazione dei due processi e un dispositivo che garantisca un trasferimento del messaggio in maniera sicura. Sezione critica Si definisce sezione critica di un processo quel segmento di codice nel quale si accede a risorse condivise da altri processi. Il problema della sezione critica è risolvibile rispettando alcuni requisiti: – Mutua esclusione: impedire che più di un processo entri in sezione critica contemporaneamente; – Libero avanzamento: evitare che un processo imponga limiti, attese o blocchi ad altri processi che sono o che stanno entrando nella loro sezione critica; – Indipendenza dai processori – Attesa limitata: fornire ad ogni processo un tempo di attesa massimo entro il quale la sua richiesta di accesso alla sezione critica venga soddisfatta. Per ottenere una sincronizzazione che rispetti i quattro requisiti della sezione critica sono i seguenti: – soluzioni software con la variabile lucchetto; – soluzioni hardware con la disabilitazione degli interrupt o con “istruzioni particolari”; – soluzioni di sistema con le primitiva sleep e wakeup, con semforo, con monitor o con scambio di messaggi).


Variabile lucchetto Questa soluzione prevede di aggiungere una variabile booleana ai processi che indichi se questi sono o meno in sezione critica, così da risolvere almeno la mutua esclusione. La soluzione prevede però alcuni problemi: – il processo che vuole entrare in sezione critica deve attendere che il processo attualmente in sezione critica ne esca, perciò questo metodo comporta uno spreco in quanto di tempo (problema dell'attesa attiva); – la mutua esclusione non è sempre garantita dalla variabile lucchetto. Disabilitazione degli interrupt Un'altra possibile soluzione è quella di disabilitare le interruzioni all'inizio della sezione critica e ripristinarli all'uscita. In questo modo si garantisce ancora una volta la mutua esclusione ma il sistema operativo, durante questo procedimento, perde totalmente il controllo dell'ambiente; questo comporta un notevole svantaggio. Questa soluzione ha un riscontro positivo solamente in ambiente uniprocessor. Istruzioni particolari Una possibile soluzione meno drastica al problema della sezione critica si può avere tramite l'utilizzo di particolai istruzioni in linguaggio macchina: – TSL: legge il contenuto di un informazione, lo copia in un registro e scrive il valore 1 nello stesso indirizzo di memoria. – XCHG: scambia semplicemente il valore dei suoi due operandi, appoggiandosi ad una terza variabile di supporto. Semaforo La tecnica del semaforo consiste nell'essere costituiti da due variabili P(verifica) e Q(incrementa). Il valore della variabile del semaforo è un intero: 1 → accesso consentito alla risorsa 0 → risorsa condivisa occupata -N → ci sono N processi in attesa di quella risorsa Successivamente è stato possibile utilizzare il semaforo condividere variabili anche più complesse, quindi che potessero gestire più di un processo alla volta: – Semaforo Binario (Mutex) = semaforo con molteplicità unaria (0 / 1) – Semaforo Contatore = semaforo con molteplicità maggiore di 1


Stallo Se durante la sincronizzazione si utilizzano tecniche che risolvono anche il problema dell'attesa attiva, allora ciò comporta ad uno stallo di tutti quei processi che richiedono l'utilizzo di una risorsa già occupata da un altro. Condizioni necessarie e sufficienti Le condizioni necessarie e sufficienti perché si verifichi uno stallo sono: – la mutua esclusione, almeno una delle risorse dev'essere a molteplicità unitaria; – possesso e blocco, non deve mai succedere che un processo che possiede già una risorsa ne richieda un altra che invece trova occupata, esso viene posto in una fase di blocco da cui potrà uscire solamente se la risorsa da lui richiesta si renderà disponibile; – assenza di prerilascio, non è permesso prendere forzatamente il controllo di una risorsa da un processo che già la possiede; – attesa circolare, esista un percorso circolare di processi e risorse che siano gli uni in attesa delle altre. Per affrontare lo stallo si hanno tre possibilità: di prevenirlo, di riconoscerlo o di ignorarlo. Prevenire lo stallo Sapendo che esistono quattro condizioni affinché si verifichi lo stallo le analizzeremo ad una ad una per vedere di eliminarlo: – mutua esclusione: molte risorse possono soddisfare solamente un processo per volta quindi di fatto richiedono la mutua esclusione. Questa condizione per molte risorse non è eliminabile; – possesso e blocco: questa condizione potrà essere eliminata solamente imponendo ai processi di accedere a non più di una risorse contemporaneamente oppure che le chiedano tutte al momento della loro creazione. Questo comporta però un serio svantaggio dal punto dell'efficienza quindi anche questa condizione non è facilmente eliminabile; – assenza di prerilascio: la complessità delle tecniche per la gestione questa condizione fanno si che ne sia sconsigliata l'eliminazione; – attesa circolare: per evitare che si formi un percorso circolare tra processi e risorse si dovrebbero prevedere le chiamate dei processi alle risorse e la disponibilità di queste ultime dopodiché organizzare un tragitto tramite un algoritmo che ne ottimizzi le prestazioni oppure richiedere inizialmente quali risorse deve utilizzare il processo in modo da pianificare una politica di avanzamento ma in ogni caso questo richiederebbe un grande spreco di tempo e ad oggi non ha raggiunto un risultato accettabile.


Grafo di allocazione delle risorse insieme P → insieme dei processi → cerchio; insieme R → risorse → quadrato; insieme A → collegamenti tra risorse e processi → freccia. Il grafo di allocazione delle risorse è una rappresentazione grafica degli scambi tra processi e risorse utile per prevenire lo stallo; nel grafico: – se non c'è un percorso chiuso sicuramente non si verificherà mai un attesa circolare quindi non ci sarà stallo – dovesse esserci un percorso chiuso allora: – se tutte le risorse che lo compongono sono a molteplicità unitaria allora sicuramente sarà presente uno stallo; – se invece è presente anche qualche risorsa a molteplicità maggiore di 1 allora bisognerà analizzarlo caso per caso o applicare l'algoritmo del banchiere basato sull'analisi delle risorse. Riconoscere lo stallo Per riconoscere lo stallo esistono due metodi: – verificare se nel grafo di assegnazione delle risorse vi sia un percorso chiuso, bisognerà quindi aggiornare ad ogni gestione di risorsa il grafo e controllare eventuali se si verifica un percorso chiuso; – analizzare ad intervalli prestabiliti l'avanzamento dei processi e controllare se vi sono processi che non avanzano da molto tempo, questa tecnica presenta però un limite in quanto esistono molti processi che rimangono in sospeso per periodi molto lunghi pur non essendo in stallo. Ignorare lo stallo Essendo lo stallo un problema difficilmente risolvibile se non a costi elevati e dato che si ipotizza che lo stallo si verifichi raramente molti sistemi operativi preferiscono ignorarlo. Starvation È una situazione simile allo stallo nella quale però un processo risulta fermo in quanto ad esempio potrebbe avere priorità troppo bassa per avanzare oppure perché i meccanismi di gestione legati alla sincronizzazione non gli consentono si farlo.


Gestione dell'hard disk Il tempo totale di accesso ad un blocco di dati detto cluster è dato dalla somma dei tempi di: – seek time: tempo di spostamento delle testine; – latency time: tempo di posizionamento delle testine; – read/write time: tempo di scrittura o lettura (trasferimento) dal disco; Scheduling delle richieste Esistono diverse politiche di gestione delle richieste, ecco le principali: – FCFS: soddisfa sequenzialmente le richieste dalla prima all'ultima nell'ordine in cui sono pervenute; – SSTF: soddisfa la richiesta più vicina all'attuale; – SCAN: soddisfa le richieste più vicine mantenendo comunque l'ordine, è detto anche metodo dell'ascensore perché il metodo richiama il suo funzionamento.


Sistemi