Studiando per l'esame di principi di sistemi operativi (laurea specialistica), mi sono ritrovato a fare esercizi interessanti per la gestione degli accessi a un numero finito di risorse da parte di un numero qualsiasi di processi e problemi di mutua esclusione nell'accesso a sessioni critiche. Problemi tipici nella progettazione di un sistema operativo. Vi lascio qui un problema abbastanza interessante:
In pratica si tratta di modellare, nel linguaggio che si preferisce, un'entità"Giocatore" (esperto o principiante) come processo o thread, caratterizzato dal numero di palline richieste, ed eventualmente dal tempo per cui trattiene queste risorse. E un'entità"Campo" che faccia da monitor, ovvero si occupi di gestire le code di attesa dei processi (vanno bene anche normali FIFO), i loro accessi alle risorse e le relative priorità. Èun problema interessante perché mette in risalto le problematiche legate sia alla gestione della mutua esclusione delle risorse, sia alla prioritàdei processi in coda.
La soluzione ovviamente può essere codata nel linguaggio che si preferisce. Io l'ho implementata in Java. Per chi la volesse implementare in Java, qui trova una piccola libreria, preparata per il corso universitario, per la gestione di monitor e code di attesa (con wait() e signal() implementate per gestire le code). Oppure volendo si può implementare in C/C++ con gestione dinamica delle code o uso dei semafori.
Un campo da golf ha a disposizione P palline. Il campo è frequentato da giocatori
esperti e principianti. Gli esperti noleggiano 2 palline e hanno la prioritàsui
principianti; i principianti noleggiano un numero maggiore di palline, compreso tra 3
e N (N < P). I giocatori, una volta terminato di giocare, devono restituire il numero
esatto di palline noleggiate all’inizio del gioco.
Si implementi una soluzione usando il costrutto monitor per modellare il campo da
golf e i processi per modellare i giocatori e si descriva la sincronizzazione tra i
processi.
Nel rispettare i vincoli richiesti, si cerchi di massimizzare l'utilizzo delle risorse. Si
discuta se la soluzione proposta può presentare starvation e in caso positivo per quali
processi, e si propongano modifiche e/o aggiunte per evitare starvation.
In pratica si tratta di modellare, nel linguaggio che si preferisce, un'entità"Giocatore" (esperto o principiante) come processo o thread, caratterizzato dal numero di palline richieste, ed eventualmente dal tempo per cui trattiene queste risorse. E un'entità"Campo" che faccia da monitor, ovvero si occupi di gestire le code di attesa dei processi (vanno bene anche normali FIFO), i loro accessi alle risorse e le relative priorità. Èun problema interessante perché mette in risalto le problematiche legate sia alla gestione della mutua esclusione delle risorse, sia alla prioritàdei processi in coda.
La soluzione ovviamente può essere codata nel linguaggio che si preferisce. Io l'ho implementata in Java. Per chi la volesse implementare in Java, qui trova una piccola libreria, preparata per il corso universitario, per la gestione di monitor e code di attesa (con wait() e signal() implementate per gestire le code). Oppure volendo si può implementare in C/C++ con gestione dinamica delle code o uso dei semafori.