in questa lezione ci occupiamo dei semafori di destra l'argomento è legato alle problematiche di concorrenza tra i processi in particolare ci stiamo occupando del problema della mutua esclusione e stiamo analizzando quali possono essere le soluzioni per realizzare la mutua esclusione tra processi è importante innanzitutto che ricordiamo che cosa si intende per mutu a esclusione tra processi ricordiamo che quando due o più processi sono eseguiti in concorrenza può essere necessario eseguire delle porzioni del codice del programma quindi il processo parte del processo deve essere eseguito in modo mutuamente esclusivo rispetto ad altre porzioni analoghe di altri processi le porzioni eseguite in mutua esclusione le parti di programma eseguite in mutua esclusione vengono chiamate sezioni critiche quando un processo deve entrare in una sezione critica deve essere certo che nessun altro processo concorrente sia dentro la sezione critica se questo accade cioè se c'è già un processo in sezione critica il processo deve rimanere in attesa fin che l'altro non esce dalla sezione critica bene finora abbiamo visto alcune possibili soluzioni al problema della mutua esclusione cioè a come realizzare la mutua esclusione e abbiamo visto che esistono soluzioni hardware e soluzioni software la prima soluzione hardware che abbiamo visto è quella della disabilitazione e riabilitazione dell'inter abbiamo anche visto le i problemi che questa soluzione comporta tra le soluzioni software abbiamo visto invece in particolare l'algoritmo di peterson che permette di realizzare la mutua esclusione fra due processi semplicemente scrivendo del codice di programma ad alto livello senza nessun particolare strumento hardware ricordiamo che anche questa soluzione software ha però degli inconvenienti in particolare non è facile la generalizzazione an processi il secondo problema è quello della attesa attiva o bisi waiting la prima soluzione hardware soddisfacente è quella invece legata all'utilizzo di una particolare istruzione macchina che abbiamo chiamato istruzione test and set ricordiamo che l'istruzione the stand set di per sé non blocca un processo e non realizza la mutua esclusione ma semplicemente permette di caricare in un registro un valore di memoria e contemporaneamente modificare il valore di memoria il valore di memoria che ci serve è una variabile binaria 01 che indica lo stato di occupazione o meno della sezione critica quindi 0 vuol dire non occupato cioè libero è uno vuol dire occupato grazie a questa istruzione è possibile realizzare la mutua esclusione mediante un ciclo di attesa attiva che va a controllare se la variabile occupato e zero oppure uno è nel caso in cui sia uno mette il programma in loop quindi l'attesa a tutti gli effetti attiva o divisi waiting nonostante il visi waiting la soluzione realizzata con distruzione the stand set è preferibile all'algoritmo di peterson in quanto è una soluzione molto efficiente perché realizzata a basso livello il linguaggio assemblee e soprattutto è generalizzabile un numero qualsiasi di processi diciamo n processi ovviamente ricordiamoci è necessario un hardware speciale cioè è necessario che la cpu abbia tra le sue istruzioni macchina un'istruzione del tipo the stand set bene fatto questo riepilogo delle possibili soluzioni al problema della mutua esclusione rimangono dei problemi aperti il primo è come è possibile evitare che i programmi consumino la cpu mentre rimangono in attesa un secondo problema anche non abbiamo ancora visto e quello di garantire una fernet fra i processi termine che possiamo tradurre come imparzialità o equità il termine si riferisce al fatto che quando un processo entra in attesa deve avere una garanzia che potrà ottenere la risorsa che gli serve per esempio accedere alla sezione critica in un tempo ragionevole ad esempio si potrebbe richiedere che se un processo è entrato in attesa prima di un altro processo possa entrare in sezione critica prima di quell altro processo questa caratteristica non è garantita dalla soluzione di mutuo esclusione che abbiamo visto con il con l'istruzione the stand set in quanto se più processi entrano in attesa in bici waiting non è affatto detto che poi entrino nella sezione critica nello stesso ordine in cui sono entrati in attesa anzi saranno l'entrata nella sezione critica sarà totalmente casuale quindi un po come se voi andate in uno studio medico trovate la sala occupata da diverse persone la sala d'attesa nel momento in cui esce un paziente dal medico non entra il primo paziente che era entrato in sala d'attesa ma viene estratto uno dei pazienti casualmente e quindi potrebbe essere l'ultimo arrivato ed entrare nel nella sala del medico bene nel nostro caso lo studio medico rappresenta la sezione critica quindi dove si può accedere uno per volta e i pazienti in sala d'attesa rappresentano i processi e chiaro che sarebbe di gran lunga preferibile che i pazienti che arrivano in sala d'attesa cioè i processi che arrivino al punto in cui devono attendere per poter entrare in sezione critica possano entrare nella sezione critica nell'ordine in cui sono arrivati o comunque in base ad un ordine stabilito per esempio secondo le priorità dei processi e così via e non per una selezione totalmente casuale come è quella che avviene nel caso in cui l'accesso venga regolato semplicemente dal fatto che si abbia il proprio times live in un momento piuttosto che in un altro è bene entrambe queste due caratteristiche cioè evitare il bis waiting e poter avere una imparzialita fra i processi una fairness sono garantiti dalla soluzione realizzata mediante i semafori di destra e allora vediamo che cos'è un semaforo un semaforo può essere definito come una variabile speciale potremmo dire meglio un tipo di dato astratto che serve per realizzare la sincronizzazione tra processi un altro modo in cui possiamo immaginare il semaforo è quello di vederlo come un oggetto nel senso della programmazione ad oggetti quindi un'entità che ha del degli attributi e dei metodi quindi delle procedure che sono previste per questo tipo di oggetto l'entità semaforo è stata ideata e realizzata per la prima volta in un sistema operativo chiamato th e da un informatico olandese dal nome un po difficilmente pronunciabile che ed scared e hicks tra destra e uno degli scienziati più importanti nella storia dell'informatica tra l'altro a lui si deve anche l'algoritmo per la ricerca dei cammini minimi che vedremo in sistemi e reti nell'ambito del degli algoritmi di routing e che alla base anche dei sistemi di navigazione e che utilizzate che utilizziamo tutti per spostarsi da un posto all'altro scegliendo il percorso migliore bene detto questo torniamo ai semafori vediamo che cos'è un semaforo abbiamo già detto che il semaforo è un tipo di dato astratto possiamo vederlo come un oggetto nel senso della programmazione ad oggetti e questo oggetto è costituito da due parti un contatore che sarebbe una variabile intera che può assumere valori positivi o negativi ed una coda di processi una coda di processi che sono in attesa ad esempio in attesa perché potrebbero dover entrare in una sezione critica che in questo momento è occupata da un altro processo cosa indica il valore del contatore il valore del contatore intanto dovrà indicarci occupato o libero ma c'è qualcosa in più il valore del contatore negativo indica il semaforo occupato ma se il valore è negativo il valore assoluto del semaforo indica esattamente quanti processi ci sono in attesa quindi ad esempio se il valore del contatore del semaforo e meno tre vuol dire che ci sono 1 2 3 processi in attesa e se il valore del contatore 0 se il valore del contatore 0 non ci sono processi in attesa notate che col valore meno tre meno due meno uno anche 0 il semaforo per noi è rosso cioè significa che un processo un altro processo che arriva a fare una certa operazione che vedremo non può entrare semaforo rosso quindi il valore negativo indica semaforo rosso il valore zero indica anch'esso semaforo rosso nel primo caso cioè se il valore è meno uno meno il 2 mentre indica esattamente il numero di processi in coda se il valore è zero il semaforo è rosso ma non c'è nessuno in attesa è come se noi ci trovassimo un incrocio stradale il semaforo è rosso ma non ci sono macchine che aspettano di passare invece il valore a meno 3 indica che il semaforo rosso e ci sono tre automobili che aspettano per passare a questo semaforo cosa indica invece il semaforo se il valore del contatore è positivo 123 eccetera se il valore del sema del contatore del semaforo è positivo innanzitutto vuol dire che il semaforo indica libero quindi è come dire che mi sembra foro verde ma il valore che ha il numero quindi 123 eccetera indica qualcosa di più preciso cioè indica quanti sono i processi che possono passare in questo momento che possono diciamo virtualmente attraversare l'incrocio del regolato dal nostro semaforo i semafori lo abbiamo già detto sono uno strumento che risolve il problema della mutua esclusione ma non soltanto quello per la mutua esclusione il valore di un semaforo deve necessariamente essere inizialmente impostato a 1 e il semaforo viene chiamato semaforo binario allora in base a ciò che abbiamo detto il valore 1 del semaforo non solo indica che il semaforo è verde ma indica che in questo momento quindi l'accesso è libero in questo momento può entrare esattamente un processo un processo può attraversare l'incrocio regolato dal semaforo l'incrocio in realtà per noi è la sezione critica dove vi ricordate può entrare un solo processo per volta il valore del semaforo però può anche essere superiore a 1 nei semafori non binari cosa indica un valore superiore a 1 ad esempio cosa vuol dire che un semaforo a valore 4 cioè più quattro anzitutto più 4 e positivo quindi il semaforo è verde ma il valore 4 indica che in questo momento possono accedere possono passare esattamente quattro processi notate che quando un semaforo può avere valori superiori a 1 non si chiama più semaforo binario ma si chiama semaforo contatore è normalmente viene utilizzato non per realizzare la moto esclusione ma più in generale per sincronizzare i processi vedremo più avanti cosa vuol dire sincronizzare i processi la moto esclusione diciamo che un caso particolare di sincronizzazione tra processi una situazione in cui può servire un semaforo contatore è quella in cui si hanno delle risorse multipli per esempio un semaforo con valore iniziale 4 potrebbe essere utilizzato per accedere a una risorsa di cui esistono quattro unità ad esempio quattro cd esattamente identici come caratteristiche 4 masterizzatori di cd meglio allora ci sono quattro processi che possono fino a quattro processi che possono utilizzare queste risorse allora il semaforo inizialmente avrà valore 4 e appunto permetterà di accedere a una risorsa multipla quindi il caso che abbiamo detto a un masterizzatore di cui esistono quattro unità effettive bene allora a questo punto sospendiamo qui questa introduzione i semafori perché adesso ci rimane la cosa più importante da vedere cioè come si realizza concretamente un semaforo quali sono le operazioni che si possono fare su un semaforo e come può essere utilizzato effettivamente un semaforo all'interno del programma lo vediamo in una nella prossima lezione nella prossima parte diciamo di questa lezione sui semafori per adesso riepiloghiamo brevemente quello che abbiamo sui semafori il semaforo è un oggetto o un tipo di dato astratto costituito da due entità un contatore che deve essere ovviamente una variabile intera può essere positiva negativa o nulla ed una coda di processi coda di processi che può contenere uno o più processi oppure essere vuota quando non ci sono processi in attesa il valore del contatore molto importante può essere un contatore con valore negativo oppure nullo cioè minore o uguale a zero il valore negativo indica che il semaforo è rosso e che sono in attesa un ben preciso numero di processi che è quello indicato dal contatore se invece il contatore positivo cioè maggiore di zero questo indica che il semaforo è verde e il valore numerico indica quanti sono i processi che possono entrare per adesso ci fermiamo qui alla prossima lezione alla prossima parte di questa lezione vedremo come realizzato il semaforo come funziona e come si utilizza