Sei sulla pagina 1di 4

Corso di Sistemi operativi. Esercizi sulla sincronizzazione.

E15) Si considerino tre processi P1 , P2 e S. Il processo P1 ripete indefinitamente un ciclo in cui genera un
numero x (con una chiamata ad una data funzione: x = genera();) e poi comunica il valore x cos`
ottenuto al processo S. Il processo P2 opera come il processo P1 .
Il processo S ripete indefinitamente un ciclo in cui acquisisce i due valori generati da P1 e P2 , li somma
e consuma il risultato chiamando una funzione consuma(somma);. Poi ripete il ciclo per sommare altri
due numeri.
Realizzare la sincronizzazione e la comunicazione tra i tre processi in modo che nessun numero generato
vada perso e che il numero prodotto da P1 nel suo ciclo i-esimo sia sommato con il numero prodotto da
P2 nel suo ciclo i-esimo.
[OSS.: i processi non sono necessariamente generati dallo stesso processo padre. Non `e richiesta la stesura
del codice necessario per generarli]

E16) Si considerino i processi P0 , P1 , P2 , P3 e P4 . Il compito svolto da ogni processo `e molto semplice: esso
esegue una stampa del suo nome. (Ad esempio P1 scrive: printf("Sono il processo P1\n");)
Effettuata la stampa il processo termina.
Realizzare la sincronizzazione tra i processi in modo che qualsiasi sia lordine in cui i processi vengono
creati, le loro stampe avvengano sempre in questo ordine: P4 , P3 , P2 , P1 e P0 .
[OSS.: i processi non sono necessariamente generati dallo stesso processo padre. Non `e richiesta la stesura
del codice necessario per generarli]

E20) Versione semplificata: Si consideri una situazione in cui vi sono delle persone che vogliono entrare
in una ambasciata. Per poterlo fare devono attraversare una stanza in cui sono posizionati dei sensori
per rilevare la presenza di armi o oggetti pericolosi. Ogni persona deve aprire una porta ed entrare
nella stanza. Fatto ci`
o si mette ad aspettare che un operatore la esamini e la autorizzi ad entrare. Una
volta autorizzata, la persona esce da una altra porta. Loperatore, tra una ispezione e laltra, resta in
attesa. Solo una persona alla volta pu`
o entrare nella stanza (la successiva persona non pu`o entrare se la
precedente persona non `e uscita).
Modellare la situazione utilizzando un processo per ogni persona e un processo per loperatore.
La soluzione deve evitare problemi di deadlock e di starvation.
Per semplicit`
a si supponga che tutte le persone, una volta esaminate, siano autorizzate a entrare in
ambasciata.
Versione pi`
u complicata: Come il precedente esercizio ma in questo caso loperatore consegna alla
persona un numero di identificazione (unico e da mantenere segreto). Implementare esplicitamente la
comunicazione del numero (il metodo `e a vostra scelta. Una possibilit`a consiste nellimpiegare la shared
memory, ma altre soluzioni possono essere ugualmente accettabili).

E25) Si risolva il seguente problema dei due benzinai, cos` descritto: Ad una stazione di rifornimento ci
sono due pompe di benzina. Vi sono due benzinai che possono: aspettare le auto o operare ad una delle
pompe. Ogni benzinaio lavora sempre alla stessa pompa. Le auto giungono alla stazione, se vi sono
pompe libere si dirigono verso una di esse e si fermano in attesa che il benzinaio riempia il serbatoio.
Finito il rifornimento lauto riparte e il benzinaio torna ad aspettare la prossima auto. Se non vi sono
pompe libere lauto resta in coda ad aspettare che una pompa si liberi.
Risolvere il problema utilizzando i semafori. Descrivere sia il codice relativo al benzinaio che allauto.

E26) La spesa infinita: due persone A e B vanno a fare la spesa (`e una spesa infinita perch`e non termina
mai). A ripete sempre la stessa sequenza di azioni: preleva un prodotto dagli scaffali, chiede a B se gli
piace, ottiene la risposta (s` o no), se la risposta `e affermativa mette il prodotto nel carrello, se `e negativa
lo rimette sullo scaffale. La persona B invece continua a spingere il carrello e a rispondere alle domande
di A.
Si modelli tale situazione utilizzando due processi (uno simula A e laltro B), utilizzando i numeri interi
per rappresentare i prodotti e le funzioni predefinite:
int prendi prodotto()
void metti in carrello(int prodotto)
void metti su scaffale(int prodotto)
per il processo A, e la funzione predefinita boolean mi piace(int prodotto) usata da B per decidere
se prodotto gli piace.
Si fornisca il codice schematico dei due processi utilizzando i semafori e (se serve) la memoria condivisa
per lo scambio delle informazioni tra A e B.

E29) Allufficio postale vi sono due passaggi. Ognuno dei due `e utilizzabile sia come ingresso che come
uscita, ma solo una persona alla volta pu`o passare in un passaggio (due persone possono passare contemporaneamente una per passaggio, anche in direzioni diverse).
Ogni passaggio `e composto da due porte. Chi vuole passare deve attraversare le due porte. Ogni porta
si apre solo se laltra `e chiusa. Una volta attraversata la prima porta si pu`o solo attraversare la seconda
(cioe, non si pu`
o cambiare idea e tornare indietro).
Si modelli la situazione in cui i clienti entrano, trascorrono del tempo nellufficio e successivamente escono.
Si consideri che dentro lufficio possono trattenersi pi`
u clienti contemporaneamente e che lordine in cui
i clienti entrano `e scorrelato dallordine in cui escono.
Si modelli la situazione utilizzando i processi (un processo = un cliente). Si utilizzino i semafori per
regolamentare i passaggi dei clienti. Si descriva luso dei semafori e il protocollo che un cliente delle
poste deve eseguire per entrare e uscire. Non vi devono essere clienti in attesa se c`e un passaggio libero.
(Se lo ritenete necessario/utile potete utilizzare altre strutture dati e modalit`a di comunicazione IPC
come shared memory, code di messaggi, ...).
Valutare se la soluzione che avete proposto sia o meno esente da problemi di deadlock e di starvation.

E32) Si consideri un insieme di N processi (N > 3). Tutti agiscono nello stesso modo ripetendo allinfinito
sempre le stesse operazioni. In particolare, il generico processo i ottiene dal processo i 1 un numero
intero x; ottenuto il numero lo modifica applicando una funzione y = modifica(x); fatto ci`o comunica
il risultato y al prossimo processo (ovvero i + 1); Successivamente ottiene un nuovo numero da i 1 e
il tutto si ripete. Si supponga che il processo N comunichi il numero y al processo 0 (cio`e, il processo 0
ottenga il numero x dal processo N ).
Si modelli la situazione descritta utilizzando i semafori, fornendo una descrizione del codice del generico
processo. Si preveda anche il codice necessario per lavvio di tutti i processi (se necessario, decidete voi
quale sia il primo numero prodotto allavvio, ed ogni altro dettaglio non espressamente specificato nel
testo dellesercizio).
Si faccia in modo che nessun numero vada perso, ovvero che tutti i numeri prodotti dal processo Pi
siano letti e processati dal processo successivo Pi+1 nello stesso ordine in cui sono stati prodotti.
Siete liberi di organizzare il metodo di comunicazione e di sincronizzazione tra i processi come ritenete
opportuno (ad es. utilizzando diversi semafori, variabili condivise, ecc)
La soluzione deve essere immune da deadlock.

E34) Si consideri la seguente situazione che descrive una semplice asta. Vi sono un insieme di N partecipanti
(N generico, ma costante) ed un solo banditore. Tutti agiscono ripetendo allinfinito le operazioni di
seguito descritte.
2

Il banditore comunica a tutti i partecipanti che vuole vendere un oggetto.


Ogni partecipante, una volta ricevuta linformazione spedita dal banditore, decide una cifra (es. un
numero intero) che `e disposto a pagare per quelloggetto. Comunica quindi la offerta al banditore.
Il banditore attende che tutti gli N partecipanti comunichino la loro offerta. Quando tutte le offerte
sono disponibili, il banditore determina la offerta pi`
u alta. Comunica il nome del vincitore a tutti i
partecipanti.
Fatto ci`
o il tutto si ripete dallinizio, con un nuovo oggetto.
Si modelli la situazione descritta utilizzando i processi ed i semafori. (indicare schematicamente il codice
del processo banditore e del generico processo partecipante).
Non `e necessario fornire il codice necessario per lavvio di tutti i processi. Non `e necessario fornire il
codice necessario per generare inomi degli oggetti da vendere, il valore delle offerte, la determinazione
dellofferta massima (potete scrivere semplicemente genero un oggetto, genero unofferta, calcolo il
massimo).
Siete liberi di organizzare il metodo di comunicazione e di sincronizzazione tra i processi come ritenete
opportuno (ad es. utilizzando diversi semafori, variabili condivise, ecc)
Le comunicazioni tra due qualsiasi dei partecipanti e il banditore sono indipendenti, ovvero le comunicazioni da/per un partecipante non vengono ritardate/bloccate a causa della gestione di altre comunicazioni. Si faccia in modo che nessuna comunicazione, offerta, o oggetto vada perso. La soluzione deve
essere immune da deadlock.

E38) Si consideri la seguente situazione: un canale navigabile pu`o essere attraversato dalle automobili passando su un ponte levatoio. Chiaramente le navi possono passare solamente quando il ponte `e sollevato,
mentre le auto passano solamente se il ponte `e abbassato. Vi `e un controllore, addetto al ponte, che si
occupa di alzare o abbassare il ponte in modo da garantire le seguenti condizioni:
Quando una nave si avvicina al ponte essa ha priorit`a nel passare e quindi non deve essere messa in
attesa
Ogni nave che si avvicina al ponte segnala al controllore la sua presenza.
Allavvicinarsi di una nave, se il ponte `e abbassato le auto che sono gi`a entrate sul ponte continuano
a passare ma altre auto non possono entrare sul ponte; appena il ponte si svuota loperatore provvede
a sollevarlo e a far passare le navi che si stanno avvicinando.
Se invece il ponte `e gi`
a sollevato esso resta tale fino al transito di tutte le navi che hanno segnalato
il loro avvicinamento
Quando non ci sono navi in avvicinamento in ponte viene abbassato.
Si supponga che le navi avvertano il controllore del loro arrivo sempre con sufficiente anticipo tale da
permettere alle auto di liberare il ponte e consentire alla nave di NON fermarsi in attesa.
Si modelli la situazione rappresentando le auto, le navi e il controllore con dei processi. Si sincronizzino
le attivit`
a dei processi utilizzando i semafori. Si descriva il (pseudo-)codice dei processi auto, nave,
controllore.
Si realizzi la sincronizzazione in modo che le auto e le navi possano procedere ognuna con la sua velocit`
a,
assicurando il massimo del parallelismo possibile (ad esempio, sia le navi che le auto possono sorpassarsi
e non procedere in fila).

E41) Si consideri la seguente situazione: un gruppo di persone opera per travasare il contenuto di un grosso
tino in una botte. Il tino `e presieduto dal suo padrone che `e lunico che pu`o prelevare vino. Ogni
persona trasporta un contenitore ed agisce in questo modo: si presenta nei pressi del tino, consegna il
contenitore al padrone e aspetta che gli venga restituito. Il padrone riempie il contenitore e lo riconsegna
alla persona che lo porta alla botte. Le persone in arrivo presso il tino devono attendere che il padrone
le possa servire. Le persone che hanno il contenitore pieno vanno alla botte e vi versano il vino. Una
sola persona alla volta pu`
o versare il vino nella botte. Versato il vino tornano al tino e ripetono il ciclo.
Quando il padrone non riempie alcun contenitore resta ad aspettare la prossima persona.

Si modelli la situazione rappresentando le persone e il padrone con dei processi. Si sincronizzino le


attivit`
a dei processi utilizzando i semafori. Si descriva il (pseudo-)codice del processo persona e del
processo padrone.
Si realizzi la sincronizzazione in modo che le persone possano procedere ognuna con la sua velocit`
a ed
assicurando il massimo del parallelismo possibile.

E44) Due processi stanno giocando a carta-pi`


u-alta-vince. Il gioco procede allinfinito e ogni turno del
gioco si svolge cos`: Sul tavolo c`e un mazzo di carte. I due giocatori pescano ciascuno una carta (uno alla
volta!) e la appoggiano scoperta sul tavolo. Dopo che entrambi hanno pescato, ogni giocatore guarda
tutte due le carte. Valuta se ha vinto o perso. Fatto ci`o il gioco si ripete.
Modellare il gioco utilizzando i semafori (oppure i monitor, a vostra scelta). Descrivere il codice eseguito
dai due processi (non `e necessario il codice per la loro creazione).

E45) Due processi P e D stanno giocando a pari-e-dispari. Il gioco procede allinfinito e ogni turno del
gioco si svolge cos`: I due giocatori mostrano contemporaneamente il numero (di dita) che hanno scelto
appoggiando la mano sul tavolo. Dopo che entrambi hanno appoggiato la mano sul tavolo, ogni giocatore
guarda le due mani. Somma i due numeri di dita e valuta se ha vinto o perso: P vince se la somma `e
pari, D vince se la somma `e dispari. Fatto ci`o il gioco si ripete.
Modellare il gioco utilizzando i semafori (oppure i monitor, a vostra scelta). Descrivere il codice eseguito
dai due processi (non `e necessario il codice per la loro creazione).

E50) In un sistema vi sono processi di tre tipi. Li indichiamo semplicemente con tre colori: processi gialli,
processi rossi, processi viola. Tutti i processi partecipano al lavoro nel sistema e sono coordinati da un
processo gestore che non termina mai. I processi operano a gruppi di tre: un processo giallo, uno rosso
e uno viola. Ogni gruppo di tre processi deve condividere un dato fornito dal gestore.
Si modelli la situazione in cui il gestore genera un numero e lo comunica tramite una variabile condivisa
a tutti tre i processi di un gruppo (che ricordiamo devono essere uno giallo, uno rosso e uno viola).
I processi colorati sono generati senza particolari strategie, quindi quando uno di essi nasce deve ottenere
il dato dal gestore, ma per ottenerlo deve aspettare che siano pronti altri due processi di colori diversi
dal suo. Quando i tre processi sono tutti presenti, il gestore comunica loro il numero. Poi i tre processi
procedono con il loro lavoro e terminano. Il gestore, dopo consegnato un numero, ne genera un altro e
si mette in attesa di altri tre processi, eccetera, eccetera...
Modellare la situazione utilizzando i semafori. Si descriva lo pseudo-codice dei processi [SUGG.: i processi
colorati sono tutti uguali, tranne che per il colore]. Si sincronizzino le attivit`a dei processi in modo che
la soluzione sia deadlock-free e che ogni numero sia comunicato correttamente solo a tre processi, uno
per ogni colore. Non deve mai accadere che due processi dello stesso colore ottengano lo stesso numero
o che un processo non ottenga alcun numero.