The Little Book of Semaphores by Allen B. Downey http://greenteapress.com/semaphores/ Versione più complicata del classico problema del barbiere 1
Il nostro barbershop ha tre sedie, tre barbieri, e un'area di attesa che può ospitare quattro clienti su un divano e che ha posti in piedi per i nuovi clienti. In totale, il numero di clienti nel negozio è 20. Un cliente non entra nel negozio se è pieno. Una volta dentro, il cliente si siede sul divano o sta in piedi se il divano è pieno. Quando un barbiere è libero, il cliente che è sul divano da più tempo viene servito e, se ci sono clienti in piedi, quello che è lì da più tempo prende un posto sul divano. Quando il taglio di capelli di un cliente è finito, qualsiasi barbiere può accettare il pagamento, ma c'è un solo registratore di cassa, per cui il pagamento viene effettuato per un cliente alla volta. I barbieri dividono il loro tempo tra il taglio dei capelli, accettare pagamenti, e dormire nella loro sedia in attesa di un cliente. 2
3
Barbieri: invocano cuthair acceptpayment 4
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, exitshop 5
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, Non possibile invocarla se il barbershop è pieno exitshop 6
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, Se il divano è pieno, non posso invocarla finché qualcuno non chiama sitinbarberchair exitshop 7
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, Se i barbieri sono occupati, non posso invocarla finché qualcuno non chiama pay exitshop 8
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, exitshop Il cliente deve invocare pay prima che il barbiere possa invocare acceptpayment 9
Clienti: invocano le seguenti funzioni, in ordine entershop, sitonsofa, sitinbarberchair, pay, exitshop Il barbiere deve invocare acceptpayment, prima che il cliente invochi exitshop 10
Ci sono varie code FIFO La soluzione del libro usa dei costrutti per riuscire a realizzare una reale politica FIFO. Noi rilassiamo il problema e diciamo che ci va bene che i clienti stiano in piedi se non c'è posto nel divano, poi si siedono sul divano e aspettano posto in una delle tre sedie Usiamo un semaforo sofa per il divano Ci servirà una variabile customers per contare i clienti un sem mutex Un semaforo chair per le tre sedie dei barbieri Altri semafori per sincronizzare i processi barbiere e cliente barber + customer (per sedersi) cash + receipt (per pagare) 11
int customers = 0; Hilzer s Barbershop problem // semaphores mutex = Semaphore(1); sofa = Semaphore(4); chair = Semaphore(3); barber = Semaphore(0); customer = Semaphore(0); cash = Semaphore(0); receipt = Semaphore(0); 12
process client { mutex.p(); // entro if customers == 20 { mutex.v() return; } customers += 1; mutex.v(); sofa.p(); // mi siedo sitonsofa(); chair.p(); // aspetto la sedia sitinbarberchair(); sofa.v(); // libero divano...... customer.v(); // sveglio // barbiere barber.p(); gethaircut(); pay(); cash.v(); // sincro barbiere receipt.p(); chair.v(); mutex.p(); // esco customers = 1; mutex.v(); exitshop(); } 13
process barber { while (1) { customer.p(); barber.v(); cuthair(); cash.p(); acceptpayment(); receipt.v(); } } Hilzer s Barbershop problem 14
NOTA: La soluzione generale necessita di usare delle particolari code FIFO È una coda FIFO di semafori privati Ha un semaforo mutex associato Per mettermi in coda Prendo mutex sulla FIFO Aggiungo in coda il mio semaforo privato Rilascio mutex Chiamo P() sul mio semaforo privato Estrazione coda Prendo mutex Estraggo il semaforo privato in cima alla coda FIFO Rilascio mutex Chiamo V() su quel semaforo Trovate descrizione sul libro al link formito nella prima slide 15
Traduzione monitor: Servono condition che svolgano il lavoro dei relativi semafori Servono dei contatori, visto che nella sala di attesa, sul divano e sulle sedie ho più posti liberi L'ordinamento FIFO potrebbe essere più semplice 16
Traduzione message passing: Vari modi, e i processi non si conoscono Standard Aggiungere dei processi per la gestione dell'entrata, del divano, e delle sedie, della cassa Della cassa magari possiamo farne a meno Quando il cliente si siede sulla sedia, il gestore della sedia comunica al cliente l'id del mio barbiere (e viceversa) Così poi la sincronizzazione per il pagamento avviene tra loro direttamente Oppure, visto che c'è un processo che fa l'accettazione, magari può fare tutto lui Less standard (e più complessa) visto che è tutto FIFO, l'accettazione potrebbe dare al cliente qualche informazione in modo che lui possa poi svolgere l'attività senza sincronizzarsi con il server 17
: Message Passing L'accettazione da al cliente info per sincronizzarsi altrove Accettazione passa al cliente l'ultimo utente che è entrato prima di lui (se gli utenti in coda sono > 3) e si sincronizza con lui Questo vuol dire che i clienti devono poter ricevere messaggi non solo per sincronizzarsi, ma anche messaggi da altri clienti Info sui barbieri Se ogni taglio richiede lo stesso tempo, potremmo calcolare facilmente in quale sedia va il cliente Cliente i sedia i%3 Se il taglio richiede tempo variabile, ho svariate opzioni: Reinserisco un gestore sedie Il cliente chiede a tutti i barbieri e il primo che risponde è ok Il cliente manda ad un barbiere unico e questi si sincronizzano tra loro 18