Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Domenico Cotroneo » 14.Sincronizzazione nel modello ad ambiente locale


Sincronizzazione nel modello ad ambiente locale

Sommario

  • Modello ad ambiente locale
  • Primitive di scambio messaggi
  • Sincronizzazione e indirizzamento
  • Esercizi

Il modello ad ambiente locale

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:

  • la cooperazione si realizza mediante lo scambio diretto di messaggi per mezzo di primitive che il S.O. deve rendere disponibili;
  • il naturale supporto fisico al modello sono i sistemi di elaborazione con architettura distribuita.

Il modello ad ambiente locale

Garantisce la mutua esclusione
Consente lo scambio di informazioni.

Primitive di scambio messaggi

Due tipologie di primitive

send (destination, message)
receive (source, message)

Si distinguono per:

  • tipo di sincronizzazione dei processi comunicanti;
  • modalità con cui si designano la provenienza e la destinazione (indirizzamento).

Formato di un Messaggio


Sincronizzazione: Send

Si consideri un processo che esegue una send. Vi sono due possibilità:

  • il processo che sta eseguendo la send rimane in attesa fino a che il messaggio è stato ricevuto (Send sincrona);
  • il processo che sta eseguendo la send continua la sua esecuzione senza attendere l’avvenuta consegna del messaggio (Send asincrona).

Sincronizzazione: Receive

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ò:

  • rimanere in attesa fino a che il messaggio non è stato ricevuto (Receive Bloccante);
  • continuare la sua esecuzione senza attendere l’avvenuta consegna del messaggio (Receive Non Bloccante).

Sincronizzazione

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.

Sincronizzazione: rendezvous

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.

Sincronizzazione

Send asincrona, receive bloccante

  • Il Sender procede nella sua esecuzione dopo aver inviato il messaggio.
  • Il Receiver rimane in attesa fin quando non arriva il messaggio.

Send asincrona, receive non bloccante

  • Nessuna delle due parti rimane in attesa.

Note

La Send asincrona è quella più utilizzata nei linguaggi di programmazione concorrente.

Potenziali problemi:

  • se durante la trasmissione di un treno di messaggi se ne perde uno, il sender se ne accorgerebbe solo alla fine (spreco di risorse);
  • l’utilizzo di tale send demanda al programmatore la responsabilità di implementare strategie per determinare se il messaggio è stato ricevuto.

Implementazione di send sincrona a mezzo di send asincrona

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)

}

Note

La Receive Bloccante è quella più utilizzata nei linguaggi di programmazione concorrente.

Potenziali problemi:

  • se durante la trasmissione il messaggio va perduto o il sender fallisce,il receiver può attendere indefinitamente la ricezione del messaggio.

Indirizzamento

La destinazione e la provenienza possono essere indicate:

  • esplicitando nella send il pid del destinatario e nella receive il pid del mittente (comunicazione diretta simmetrica);
  • esplicitando nella send il pid del destinatario mentre nella receive il parametro che specifica la provenienza è di uscita nel qual caso il destinatario conosce il pid del mittente con la ricezione del messaggio (comunicazione diretta asimmetrica);
  • facendo riferimento ad una mailbox a cui la send invia il messaggio e da cui la receive lo preleva (comunicazione indiretta).

Comunicazione Diretta

Diretta e simmetrica: schema a pipeline

Diretta e simmetrica: schema a pipeline

Diretta e Asimmetrica: cliente-servitore

Diretta e Asimmetrica: cliente-servitore


Comunicazione Indiretta

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:

  • one-to-one;
  • many-to-one;
  • many-to-many.

Processo Servitore

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

  • riceve messaggi di richiesta;
  • opera sulla risorsa;
  • fornisce eventuali risposte.

Modello di interazione (con mailbox)


Esercizio

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).

Soluzione

Dal momento che è richiesto un protocollo di comunicazione sincrono si è scelto di implementare le funzioni seguenti:

  • void ReceiveBloc (Messaggio *, int coda, int tipo_messaggio);
  • void SendSincr (Messaggio *, int coda);

Soluzione

SendSincr (Messaggio *, int) realizza le seguenti operazioni:

  • send_Asincr(queue1,REQUEST_TO_SEND);
  • receive (queue2,OK_TO_SEND);
  • send_Asincr(queue,MESSAGGIO);

La procedura void ReceiveBloc (Messaggio *, int, int):

  • receive(queue1,REQUEST_TO_SEND);
  • send_Asincr(queue2,OK_TO_SEND);
  • receive(queue,MESSAGGIO);

Soluzione: send bloccante


I materiali di supporto della lezione

P. Ancilotti, M.Boari, A. Ciampolini, G. Lipari, “Sistemi Operativi”, Mc-Graw-Hill (Cap. 3; par. 3.5, 3.6)

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion