Sommario
Ciascun processo evolve in un proprio ambiente che non può essere modificato direttamente da altri processi. Quindi non esiste memoria condivisa e le risorse sono tutte private.
Pertanto:
Garantisce la mutua esclusione
Consente lo scambio di informazioni.
Due tipologie di primitive
send (destination, message)
receive (source, message)
Si distinguono per:
Si consideri un processo che esegue una send. Vi sono due possibilità:
In maniera analoga, per un processo che esegue la receive.
Se il messaggio è stato inviato dal sender, il processo lo riceve e continua l’esecuzione.
Se il messaggio non è ancora arrivato il receiver può:
Il sender e il receiver possono essere sia bloccanti che non bloccanti a seconda delle primitive utilizzate.
Sono tre le combinazioni generalmente utilizzate, anche se spesso i sistemi implementano solo una o due combinazioni.
Send sincrona, receive bloccante.
Sia il sender sia il receiver rimarranno in attessa fin quando il messaggio non sarà consegnato.
Denominato anche “rendezvous”
… permette una stretta sincronizzazione tra sender e receiver.
Send asincrona, receive bloccante
Send asincrona, receive non bloccante
La Send asincrona è quella più utilizzata nei linguaggi di programmazione concorrente.
Potenziali problemi:
procedure sendSincrona(dest, mess)
{
sendAsincrona (dest, messRTS)
/* messRTS è un messaggio di pronto ad inviare (Request To Send) */
receiveBloccante (dest, messOTS)
/* messOTS è un messaggio di pronto a ricevere (OK To Send) */
sendAsincrona (dest, mess)
}
La Receive Bloccante è quella più utilizzata nei linguaggi di programmazione concorrente.
Potenziali problemi:
La destinazione e la provenienza possono essere indicate:
I messaggi vengono inviati ad una struttura dati condivisa (una coda, mailbox).
Un vantaggio di questo approccio è quello che la comunicazione tra sender e receiver è completamente disaccoppiata dalla presenza della mailbox.
Paradigmi di comunicazione supportati:
Nel caso di comunicazione diretta asimettrica, o indiretta di tipo many-to-one si parla di comunicazione client-server e processo servitore.
Processi servitore: speciali processi che incapsulano la risorsa comune offrendo a processi esterni le funzionalità di accesso alla risorsa incapsulata.
Un processo servitore
Scrivere un’applicazione concorrente che implementi il problema dei Produttori/Consumatori utilizzando le primitive send e receive per la comunicazione mediante code di messaggi. (si implementi un protocollo sincrono).
Dal momento che è richiesto un protocollo di comunicazione sincrono si è scelto di implementare le funzioni seguenti:
SendSincr (Messaggio *, int) realizza le seguenti operazioni:
La procedura void ReceiveBloc (Messaggio *, int, int):
1. Introduzione ai Sistemi Operativi
5. Scheduling nei sistemi mono-processore
6. Threads, SMP
8. Scheduling Multiprocessore e Real-Time
9. Gestione dei processi nei sistemi operativi Unix/Linux e Window...
10. Introduzione alla Programmazione Concorrente
11. Sincronizzazione nel modello ad ambiente globale
12. Problemi di cooperazione nel modello ad ambiente globale
14. Sincronizzazione nel modello ad ambiente locale
15. Deadlock
16. Programmazione Multithread
18. Memoria Virtuale
20. Il File System
21. Primitive di sincronizzazione nel kernel Linux
22. Esercitazione: System call per la gestione dei processi
23. Esercitazione: Inteprocess Communication e Shared Memory
24. Esercitazione: System Call per la gestione dei semafori in Linu...
25. Esercitazione: Problema dei Produttori e dei Consumatori
26. Posix Threads
P. Ancilotti, M.Boari, A. Ciampolini, G. Lipari, “Sistemi Operativi”, Mc-Graw-Hill (Cap. 3; par. 3.5, 3.6)