DI RECENTE ACCOMAZZI...
CERCA
» Ricerca avanzata
MAILING LIST

Se vuoi iscriverti alla mailing list di Luca Accomazzi inserisci qui la tua mail:

Vuoi ricevere i messaggi immediatamente (50 invii / giorno) o in differita e in gruppo
(due invii / giorno)?

» Vuoi saperne di più?

4.3 Cinque filosofi a cena

Una sera, attorno ad un tavolo rotondo, si radunano cinque anziani e dignitosissimi filosofi a cena. Al centro del tavolo si trova una gigantesca, virtualmente infinita, zuppiera di cibo — immaginiamo che si tratti di spaghetti. Ciascun filosofo ha di fronte a sé un piatto per il cibo. Cinque forchette sono a disposizione dei commensali, disposte tra ciascuna coppia di filosofi (ricordate, il tavolo era rotondo).

I cinque filosofi mangiano e pensano, pensano e mangiano. Per mangiare debbono avere il cibo nel piatto, ed il cibo inizialmente si trova solo nella grande zuppiera: va preso usando le forchette. Ma c'è un problema: per potersi servire, ciascun filosofo ha bisogno di due forchette, e ci sono solo cinque forchette per i cinque filosofi. Così, non tutti i filosofi possono servirsi contemporaneamente.
Non c'è bisogno di dire che i filosofi sono persone civilissime: non si strapperebbero mai la forchetta di mano quando hanno fame. Piuttosto che abbassarsi a tanto, morirebbero volentieri di fame. Inoltre, poiché sono degli accademici timidi, non si parlano e non possono accordarsi su una strategia di uso delle forchette (se preferite, potete pensare che i filosofi siano di nazioni diverse e parlino lingue differenti. O, magari, che paraventi separino i commensali).
Ciascun filosofo è impegnato in un semplice ciclo di azioni, composto da...
RIPETI PER SEMPRE:
PENSA;
MANGIA;


e nulla, tranne la morte per fame, può distrarli.
Guardiamo il filosofo numero due mentre termina una complessa elucubrazione su temi filosofici certamente profondissimi... guarda alla sua destra, vede una forchetta libera e se ne impossessa. Poi guarda alla sua sinistra, vede una seconda forchetta e se ne impossessa. Si serve, mangia, poi libera le forchette rimettendole accuratamente ai loro rispettivi posti e torna a pensare.
Ma il filosofo numero uno ha finito di pensare mentre il due si sta servendo: non vedendo la forchetta alla sua sinistra, si dispone filosoficamente ad aspettarla, mentre il suo collega sta mangiando. Quando la forchetta si libererà anche il filosofo numero uno potrà mangiare.
In questa idilliaca scenetta, che simboleggia un problema comune nei calcolatori con molti utenti, molti pericoli si nascondono e minacciano la salute dei nostri beneamati vecchietti. Il primo si chiama
stallo , o anche deadlock , o abbraccio mortale . Vediamo in cosa consiste.
Siamo all'inizio della cena. Il filosofo numero uno si sveglia, afferra la forchetta alla sua destra, poi si volta e tenta di impadronirsi di quella di sinistra. Disgraziatamente, anche il filosofo due vuole mangiare, ed ha preso la forchetta tra sé ed il numero uno mentre questi si procurava la prima forchetta. Ma neppure il filosofo due potrà nutrirsi, poiché il filosofo tre gli ha preso la forchetta di sinistra... In breve, ciascun filosofo si impossessa della forchetta alla sua destra, trova quella a sinistra sparita, e si dispone ad attendere placidamente che torni disponibile, tenendo stretta l'unica forchetta nell'altra mano per paura di perderla: il tempo passa ed il quintetto muore miseramente di fame. Poiché sino a due filosofi potrebbero servirsi contemporaneamente (con una forchetta, la quinta, d'avanzo), il problema non è insolubile. Tuttavia senza che sia stipulata una strategia comune i cinque filosofi rischiano la morte. Forse con sollievo di qualche studente liceale: ma noi tenteremo comunque di salvarli.

Prima che il nostro lettore, però, ci abbandoni pensando di essere finito in un libro di indovinelli matematici, chiariamo che il problema è stringente quando si parla di sistemi operativi. I cinque vecchi filosofi simboleggiano cinque processi, cinque programmi
concorrenti che stanno operando sul medesimo computer. Ciascuno per poter funzionare deve poter usare uno spazio in memoria (il piatto), che gli è garantito dal sistema operativo. Deve inoltre condividere con i colleghi le risorse del sistema: le stampanti, i dischi, i video... Le risorse sono simboleggiate dalle forchette, e stiamo semplificando il problema supponendo che ciascun filosofo ne richieda solo due per poter sopravvivere. Il problema dei cinque filosofi a cena è dunque un esempio piuttosto calzante per descrivere i problemi che si sviluppano su un sistema dove molti programmi (di un solo utente o di molti) stanno funzionando contemporaneamente grazie ai principi che abbiamo visto negli scorsi capitoli.

Come possiamo salvare la vita ai filosofi? Potremmo pensare che i simpatici vecchini abbiano una certa intelligenza dalla loro: se si ritrovano ad attendere troppo tempo la seconda forchetta possono immaginare quel che sta accadendo e qualcuno tra loro potrebbe, con un sospiro, sacrificarsi: lasciare la propria forchetta in modo che uno dei compagni possa foraggiarsi, sperando di usufruire in futuro di una simile gentilezza. (Nel caso reale, è il sistema operativo che costringe un processo in attesa a rilasciare le risorse impegnate). Il problema reale però non è così facilmente aggirato: bisogna controllare i tempi con accuratezza per evitare che i filosofi rinuncino alle forchette tutti insieme senza cambiare la situazione.

Potremmo regolarci diversamente: spieghiamo ai cinque filosofi che debbono impossessarsi delle forchette solo quando si rendono conto di poterle afferrare entrambe. Se questo metodo di comportamento viene adottato, un filosofo non avrà mai con sé una forchetta inutilizzata (la lascerà sul tavolo), e ci sarà sempre qualcuno che sta mangiando in ogni dato momento.
I filosofi si comportano così...
RIPETI PER SEMPRE:
PENSA;
C'è la forchetta sinistra a disposizione?
Se sì, c'è la forchetta destra a disposizione?
Se sì, prendile e mangia;
Se no, aspetta la forchetta destra;

Se no, aspetta la forchetta sinistra;


Ma ecco sorgere un secondo problema, differente da quello dell'abbraccio mortale e chiamato normalmente la
starvation , letteralmente la morte per fame .
Osserviamo ancora la tavolata di filosofi: il filosofo numero uno afferra le due forchette che gli stanno ai lati e si serve, mentre il numero due non prende la forchetta alla propria sinistra, che è disponibile, poiché non gli servirebbe (la forchetta destra è in mano al filosofo uno).
Il filosofo numero tre si risveglia da una meditazione affamato: si accorge con compiacimento di avere entrambe le forchette a disposizione (poiché il filosofo due gli ha lasciato la forchetta che li divide a disposizione). Dunque, il filosofo numero tre agguanta le forchette e prende a mangiare a quattro palmenti: in quel momento il filosofo numero uno finisce di pascersi, e lascia andare le due forchette. Finalmente!, pensa il filosofo numero due, ormai decisamente affamato, e fa per agguantare la forchetta. Ma, ahimé, si rende conto che la forchetta sinistra è sparita in mano al terzo del gruppo, e così si blocca ancora, lasciando sul tavolo quella destra. Ahinoi, nel momento in cui il terzo filosofo lascerà finalmente al secondo la forchetta contesa, il primo si sarà già risvegliato, prendendo nuovamente entrambe le forchette ai suoi lati... Il risultato netto è che il filosofo numero due, preso tra due compagni sfortunatamente non sincronizzati, deperisce e muore di fame, mentre i suoi due vicini di posto possono mangiare a sazietà ed ingrassare, se del caso.

C'è un metodo piuttosto efficace e generalmente adottato (per esempio è al nocciolo di Unix) per evitare la
morte per fame : diamo ad un filosofo il diritto di strappare la forchetta di mano ad un proprio sfortunato collega quando e se diventa troppo affamato. Quando un processo parte, gli viene assegnata la priorità standard di 1. Se è costretto ad attendere di poter utilizzare le risorse per più di qualche secondo, la sua priorità aumenta a 2, 3, 4... sinché non supera quella del processo concorrente che sta usando le risorse, il quale viene addormentato ed al quale ruba la forchetta, si appaga, vede la propria priorità tornare normale e cede il controllo.
Siamo così tornati al nostro vecchio amico, il sistema operativo. È suo compito tener conto delle precedenze, aggiornarle e regolare lo scambio di risorse e di dati tra i processi. Questo viene effettuato in modi piuttosto involuti e complessi, che non dettaglieremo (anche in conseguenza del fatto che i metodi impiegati possono differire ampiamente tra i sistemi e qualche volta tra le implementazioni). Osserviamo, comunque, che può presentarsi una ulteriore complicazione: il problema del cosiddetto
real time , o tempo reale .
Uno dei filosofi non impiega il suo tempo tra un banchetto ed il successivo solo pensando, ma bensì discutendo con un ospite (che non mangia con la comitiva). È suo specifico dovere non far aspettare l'ospite, rispondendogli a tono quando questo gli pone una domanda (nel caso reale, questo filosofo è un programma tenuto a rispondere immediatamente ad avvenimenti esterni poiché sta controllando un processo industriale, chimico o qualche altra diavoleria).
Questo significa che mai, per nessun motivo, deve venire addormentato quando meno se lo aspetta, e che mai le forchette debbono venirgli tolte di mano da un altro filosofo per quanto affamato: potrebbe esplodere un serbatoio o una lamiera perdere la tempera mentre il filosofo è bloccato dal sistema per troppo tempo.
Il controllo di fatti esterni in tempi strettamente vincolanti (millisecondi di tempo di risposta, come nel caso di un sistema di sicurezza automatico in una centrale atomica) richiede un calcolatore appositamente dedicato, ed il problema non sussiste. Ma in casi meno critici (il controllo di tutte le rotative in una tipografia, o la gestione di diverse sessioni di lavoro interattivo), dedicare a ciascun evento esterno una macchina sarebbe eccessivamente dispendioso, e va trovato un compromesso tra il tempo di risposta e il numero di eventi controllabili contemporaneamente da una sola macchina.

Al termine della... cena, ci rendiamo contro che i problemi sono molti e complessi, e non tutti risolvibili con piena soddisfazione. La comunità degli scienziati di informatica sta ancora dibattendo per trovare soluzioni compiute a questi problemi (mentre, fortunatamente, la continua diminuzione dei costi dei computer rende i problemi meno vincolanti). Nuove idee sono benvenute: i filosofi stanno aspettando un metodo per finire il pasto senza litigare.

Per proseguire la lettura, acquista il libro. Se preferisci, torna al sommario.

.