Processi e Thread Meccanismi di IPC (2) Problemi classici di IPC 1 Monitor (1) • Oggetti – Strutture dati + metodi per accedervi (procedure) • Concurrent Pascal • Mutua esclusione nell’esecuzione delle procedure • Variabili di Condizione – manipolabili solo con wait() e signal() – non contano gli eventi – sono associate ad una coda di processi in attesa • wait(X), X variabile di condizione – sospende sempre il processo che la invoca in attesa di una signal(X) 2 Monitor (2) • signal(X) – sveglia uno dei processi in coda su X – se nessun processo è in attesa, va persa – deve essere eseguita solo come ultima istruzione prima di uscire dal monitor (il processo svegliato ha l’uso esclusivo del monitor) • Il monitor è un costrutto linguistico !! – Il compilatore si occupa di generare codice opportuno per realizzare la sincronizzazione – L’implementazione si basa su meccanismi di IPC a più basso livello (es. semafori …) – Non può essere aggiunto a un linguaggio con una libreria di SC opportune! 3 Monitor (3) Schema tipico di un monitor (CPascal-like) 4 Monitor (4) Produttore/Consumatore 5 Monitor (5) Non ci sono problemi di interferenza! 6 Monitor (6) • Java fornisce i monitor – thread user-level – ME nell’esecuzione dei metodi synchronized di una stessa classe – non ci sono variabili di condizione – wait(), notify() simili a sleep() , wakeup() – è possibile svegliare tutti i processi in attesa • Vediamo di nuovo il problema del produttore e del consumatore 7 8 Soluzione per Produttore/Consumatore in Java (parte 2) 9