57
1 Lezione T24 Comunicazione Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2013/2014 Dipartimento di Scienze Fisiche, Informatiche e Matematiche Università di Modena e Reggio Emilia http://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi

Lezione T24 Comunicazione · 2014-01-15 · Lezione T24 Comunicazione Sistemi Operativi (9 CFU), CdL Informatica, A. A. 2013/2014 Dipartimento di Scienze Fisiche, Informatiche e Matematiche

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

1

Lezione T24ComunicazioneSistemi Operativi (9 CFU), CdL Informatica, A. A. 2013/2014Dipartimento di Scienze Fisiche, Informatiche e MatematicheUniversità di Modena e Reggio Emiliahttp://weblab.ing.unimo.it/people/andreolini/didattica/sistemi-operativi

2

Quote of the day(Meditate, gente, meditate...)

“The single biggest problem in communication is the illusion that it has taken place. ”

George Bernard Shaw (1856-1950)Scrittore, drammaturgoPremio Nobel per la letteratura nel 1925

3

INTRODUZIONE

4

Lo scenario(Processi cooperanti)

I processi in esecuzione concorrente possono essere classificati come segue.

Indipendenti. Un processo è indipendente se la suaesecuzione non è condizionata da altri processi inesecuzione.Cooperanti. Un processo è cooperante con gli altri se lasua esecuzione è condizionata da altri processi inesecuzione.

Ad esempio, ciascun processo che condivide dati con altri processi è cooperante con essi.Il suo flusso di esecuzione può dipendere dai valori dei dati condivisi, modificabili da altri.

5

Motivazioni per la cooperazione(Tante e importanti)

Condivisione delle informazioni.Diversi utenti (e, dunque, diversi processi) potrebbero essere interessati agli stessi dati.

Ad esempio, un file condiviso.Il SO deve fornire un meccanismo per l'accesso concorrente a tali informazioni.Accelerazione del calcolo (speedup).Una tecnica comune per velocizzare i calcoli consiste nello spezzare il problema in tanti piccoli sottoproblemi eseguibili in parallelo.I sottoproblemi possono essere eseguiti da processi cooperanti in un sistema SMP.

6

Motivazioni per la cooperazione(Tante e importanti)

Modularità.La suddivisione di un problema in più sottoproblemi è utile anche come strumento di modularizzazione del software.Riuso di codice, eliminazione delle ridondanze.Ambiente operativo più ricco.L'introduzione di processi cooperanti permette la creazione di comandi complessi a partire da comandi unitari semplici.

7

Inter Process Communication(IPC: meccanismi per la comunicazione fra processi)

La cooperazione fra processi avviene tramite diversi meccanismi di Inter Process Communication (IPC).Obiettivo della IPC: permettere lo scambio di dati fra processi distinti operanti localmente o in remoto.In questo corso, si studierà solo la comunicazione locale.

8

Modelli di IPC(Scambio di messaggi, memoria condivisa)

Scambio di messaggi (message passing).Un processo cooperante impacchetta i dati in messaggi che saranno inviati ad un altro processo cooperante.Memoria condivisa (shared memory).Uno dei processi cooperanti crea un'area di memoria contigua visibile agli altri.I processi si agganciano all'area di memoria condivisa e interagiscono (scrivono, leggono) con essa come se fosse allocata localmente.

9

Comunicazione da A a B nei 2 modelli(Uno schema semplificato)

Scambio messaggi Memoria condivisa

Processo A M

Processo B M

Kernel M

12

Processo A

Processo B

Kernel

Memoria condivisa1

2

10

SCAMBIO DI MESSAGGI

11

Definizione di messaggio(Intestazione + contenuto)

Messaggio: unità di dati che può essere scambiata fra due processi. La spedizione e la ricezione di un messaggio avvengono in maniera non interrompibile.Esecuzione atomica: o esegue tutto l'insieme di istruzioni associato all'operazione, oppure non si esegue alcuna istruzione. Due processi non possono scambiarsi frazioni di messaggio, solo messaggi interi.

Non necessariamente i messaggi hanno la stessa lunghezza (taglia).

12

Il mezzo di comunicazione(Il mezzo su cui viaggiano i messaggi)

La comunicazione fra due processi cooperanti deve avvenire per mezzo di un mezzo di comunicazione (communication link).

Memoria centrale, bus hardware, rete.In questa presentazione, ci si focalizza sull'implementazione logica dello scambio messaggi.

Si dà per scontata l'esistenza di un mezzo dicomunicazione.

13

Buffering(Controlla il livello di congestione del canale di comunicazione)

Tipicamente, il mezzo di comunicazione è acceduto tramite uno o più buffer.

Il numero di buffer può variare in base alle diversestrategie di implementazione.

Motivazioni.Si evita di intasare il mezzo con l'invio in massa dimessaggi.Si regola l'immissione di messaggi in modo tale damantenere l'utilizzo del mezzo ragionevolmente alto.

14

Dimensioni del buffer(Nulla, finita, infinita)

Il buffer è implementato tramite una coda.Accodamento dei singoli messaggi.Scelta del messaggio e spedizione.La disciplina non è necessariamente FCFS!

La coda può avere lunghezzanulla.finita.infinita.

A seconda della lunghezza, si possono avere diverse modalità di comunicazione.

15

Tipologie delle code per il buffer(Zero capacity, bounded capacity, unbounded capacity)

Zero Capacity.La coda ha una lunghezza massima pari a 0.Se il mezzo è libero, si invia il messaggio; altrimenti, ilprocesso si blocca.

Bounded Capacity.La coda ha una lunghezza massima pari a n.Se la coda non è piena, il messaggio è accodato e siritorna subito; altrimenti, blocco.

Unbounded Capacity.La coda ha lunghezza massima infinita.Il messaggio è sempre accodato e si ritorna subito.

16

Aspetti legati allo scambio messaggi(Sincronizzazione, denominazione, persistenza, gestione anomalie)

Sincronizzazione dei processi.Comunicazione bloccante, non bloccante.

Denominazione dei processi mittente e ricevente.Comunicazione diretta, indiretta.

Persistenza del buffer.E' in grado di sopravvivere al processo che l'ha creato?

Gestione delle anomalie.

17

Primitive di scambio messaggi(send(), recv())

Invio: send(dest, msg)Ricezione: recv(src, msg)Cosa sono dest e src? Sono identificatori del processo destinatario e sorgente, oppure dello strumento di comunicazione che usano.

PID, (named) pipe, porta di comunicazione locale oremota.

Cosa è msg? E' una struttura dati contenenteuna sequenza di byte.metadati (lunghezza, mittente, destinatario).

18

Chiamata di sistema send()(Invia un messaggio ad un destinatario)

Semantica.Invio di un messaggio ad un destinatario specifico.

Parametri in ingresso.L'indirizzo del destinatario.Il messaggio da inviare.

Valori di ritorno.0: il messaggio è stato spedito correttamente.Errore: un valore numerico >0.

19

Chiamata di sistema recv()(Riceve un messaggio da un mittente)

Semantica.Ricezione di un messaggio da un mittente specifico.

Parametri in ingresso.L'indirizzo del mittente (oppure nulla, per ricevere daogni mittente possibile).Il messaggio vuoto da riempire con il contenuto.

Valori di ritorno.0: il messaggio è stato ricevuto correttamente.Errore: un valore numerico >0.

20

Formato dei messaggi(Intestazione con metadati, corpo con dati)

Contenuto

Tipo di messaggio

Sorgente

Destinazione

Lunghezza

Informazioni di controllo

Intestazione(campi tipici)

Corpo delmessaggio

21

Comunicazione bloccante(Lunghezza coda < )

Il processo si blocca fino a quando la primitiva di comunicazione non termina.Il processo può bloccarsi per tempi lunghi.

Processomittente

t

Primitiva discambiomessaggi.

Blocco del processo.Esecuzione della primitivada parte di un altro processoo del kernel.

Fine primitiva.Sblocco delprocesso.

22

Comunicazione non bloccante(Lunghezza coda →)

Il processo riottiene immediatamente il controllo e può eseguire altre attività in parallelo.Il processo non può riutilizzare il buffer associato al messaggio fino alla consegna dello stesso.

Processomittente

t

Primitiva discambiomessaggi.Ripristinoimmediato.

Esecuzione della primitivada parte di un altro processoo del kernel.

23

Comunicazione non bloccante: problemi(Complicano sia il meccanismo sia il programma che lo usa)

Si supponga di avere:un processo mittente con mezzo di comunicazionecompletamente saturo.un processo ricevente con mezzo di comunicazionecompletamente inutilizzato.

Il processo deve bloccarsi fino a quando:il mezzo di comunicazione non si svuota un po'.il mezzo di comunicazione non riceve almeno unmessaggio.

24

Comunicazione non bloccante: problemi(Complicano sia il meccanismo sia il programma che lo usa)

Come fa il processo in questione ad accorgersi dei seguenti eventi?

Liberazione spazio mezzo comunicazione.Riempimento di almeno un messaggio.Termine di una operazione.

Servono meccanismi di notifica sul cambio di stato del mezzo di comunicazione.

Asincroni: segnali, interruzioni.Sincroni: polling, notifica di eventi.

25

Comunicazione bloccante vs non bloccante(Un confronto)

send()Bloccante Non ritorna fino a quando i dati non sono stati inviati. Si blocca se il mezzo è saturo.Non bloccante Ritorna subito. Si blocca se il mezzo è saturo. Notifica (a)sincrona del completamento.

recv()Bloccante Ritorna i dati del messaggio quando arriva. Si blocca se il mezzo è saturo.Non bloccante Ritorna i dati del messaggio se esiste. Ritorna NULL se non esiste un messaggio.

26

Comunicazione diretta(Esplicitazione di sorgente e destinatario)

Il processo eseguente una primitiva deve denominare esplicitamente sia il processo mittente che il destinatario, ossia la coppia (src, dest).Presenza di un buffer per il ricevente.

Più di un processo può inviare dati al processo ricevente.Per ricevere da uno specifico mittente, occorrescandire l'intera coda.

Presenza di più buffer per ciascun mittente.Un processo mittente può inviare dati a più processiriceventi simultaneamente.

27

Un esempio di comunicazione diretta(Il problema produttore-consumatore)

Si hanno due processi.Processo produttore: produce dati e li invia sotto forma di messaggi distinti.Processo consumatore: riceve i dati prodotti dal processo produttore, sotto forma di messaggi.

→ È un buon modello del paradigma di computazione client-server.

28

Produttore-consumatore con N messaggi(“Vuoto a rendere” dei messaggi)

Variante del problema originario.Al posto di inviare un singolo messaggio alla volta, il produttore può inviarne fino ad N distintiIl consumatore invia N messaggi vuoti al produttore.

Il produttore riceve i messaggi, produce dati e liinserisce nei messaggi vuoti ricevuti.Il produttore invia i messaggi riempiti.Il consumatore riceve un messaggio e lo consuma,svuotandolo.Il consumatore invia il messaggio svuotato.

29

Una semplicissima implementazione(In pseudocodice)

Produttorevoid producer(void) {

while(TRUE) {

...

produce_item();

...

send(consumer,

item);

}

}

Consumatorevoid consumer(void) {

while(TRUE) {

...

recv(producer,

item);

...

consume_item();

}

}

30

Implementazione del produttore(In pseudocodice)

void producer(void) { int item; message m; while(TRUE) { item = produce_item(); receive(consumer, &m); build_message(&m, item); send(consumer, &m); }}

31

Implementazione del consumatore(In pseudocodice)

void consumer(void) { int item, i; message m; for (i=0; i<N; i++) send(producer, &m); while(TRUE) { receive(producer, &m); item = extract_item(); send(producer, &m); consume_item(item); }}

32

Comunicazione indiretta(Mittente e destinatario usano una mailbox intermedia)

Nella comunicazione indiretta, i messaggi sono piazzati in un'area accessibile ad entrambi i processi.

Un qualunque oggetto che possa memorizzare liste dimessaggi (ad esempio, una coda) e garantirnel'accesso non concorrente.

Tale area prende il nome di mailbox.src e dest puntano alla stessa mailbox.

La mailbox permette una comunicazione di tipo many-to-many fra tutti i processi che la condividono.

33

Persistenza del buffer(A livello di processo)

La persistenza di un buffer indica per quanto tempo esso rimane operativo.Process persistence: il buffer rimane operativo fintantoché ci rimane il processo.Esempi:

socket locali.socket remoti.pipe.

34

Persistenza del buffer(A livello di kernel)

La persistenza di un buffer indica per quanto tempo esso rimane operativo.Kernel persistence: il buffer rimane operativo fintantoché la macchina rimane accesa.

Sopravvive alla terminazione di un processo.Esempi:

memoria condivisa.coda di messaggi nel kernel.

35

Persistenza del buffer(A livello di file)

La persistenza di un buffer indica per quanto tempo esso rimane operativo.File persistence: il buffer rimane operativo fintantoché non viene esplicitamente distrutto.

Sopravvive ad un riavvio della macchina.Esempi:

named pipe.file condiviso.

36

Scambio dati con processi inesistenti(Anomalia da gestire)

Un processo ricevente si aspetta di ricevere un messaggio da un processo mittente, che però ha già terminato la sua esecuzione.Problema: il ricevente rimane bloccato per sempreSoluzioni possibili.Il processo ricevente controlla periodicamente se il mittente è uscito (nel caso, esce).Il processo mittente gestisce una eventuale eccezione e informa il processo ricevente.Rendez-vouz: uso di messaggi di ricevuta conferma(acknowledge message, ACK) ed eventuale rispedizione dei dati.

37

Scambio dati con processi inesistenti(Anomalia da gestire)

Un processo mittente invia un messaggio ad un processo ricevente, che però ha già terminato la sua esecuzione.Problema: se il mittente trova un buffer pieno, si blocca per sempre.Soluzioni possibili.Il processo mittente controlla lo stato del processo ricevente (nel caso, esce).Il processo ricevente gestisce una eventuale eccezione e informa il processo mittente.

38

Perdita e corruzione dei messaggi(Anomalia da gestire)

Mezzo di trasporto inaffidabile: si adotta la strategia best effort.

Si fa il possibile per inviare il messaggio.Se il messaggio non arriva, si lascia al livelloapplicativo il compito di decidere cosa fare (abort,retry).

Contrasto ai malfunzionamenti.Ricevente: acknowledgement di ogni messaggio.Mittente: Timeout in caso di mancata ricezione di unacknowledgement.Hashing del contenuto dei messaggi.

39

Perdita e corruzione dei messaggi(Anomalia da gestire)

Ritrasmissione.Ciascun messaggio è caratterizzato da un numeroidentificativo univoco (sequence number).Ritrasmissione dell'ultimo messaggio in caso di timeout.Ritrasmissione di un messaggio qualunque, in caso diricezione dell'acknowledgement relativo.Rimozione di messaggi duplicati sul lato ricevente.

40

Quando si usa lo scambio di messaggi?(Ricezione controllata di pochi dati fra processi su macchine diverse)

Scambi di piccole quantità di dati.Scambi di dati fra processi in spazi di indirizzamento diversi.Sincronizzazione fra processi.Ricezione controllata di dati.

Uso di una mailbox per accodare i dati ricevuti indiverse interruzioni (es.: tastiera).Prelievo dei messaggi al ritmo con cui il ricevente(device driver) è in grado di leggerle.

Gestoreinterruzioni

mboxProcessoricevente

41

MEMORIA CONDIVISA

42

Modello a memoria condivisa(Più processi accedono simultaneamente ad un'area di memoria comune)

Nel modello a memoria condivisa, due o più processi cooperanti condividono una porzione di memoria.La porzione di memoria è, solitamente, una sequenza di byte che può essere letta e scritta da diversi processi.Dal punto di vista del SO, la porzione di memoria condivisa è equivalente ad una qualunque altra area di memoria.

43

Problema produttore-consumatore(Scritto in termini di memoria condivisa)

Anziché usare messaggi:il processo produttore scrive in una memoriacondivisa.il processo consumatore legge dalla memoriacondivisa.

→ Modello semplificato che non tiene conto dei dettagli implementativi delle memorie condivise.

44

Problema produttore-consumatore(Scritto in termini di memoria condivisa)

Si usa un array circolare di N posizioni.Un indice in indica il prossimo elemento libero del buffer.Un indice out indica il primo elemento pieno del buffer.Buffer vuoto: in == out.Buffer pieno: (in + 1) % N == out.Si possono inserire al più N-1 elementi nel buffer.

45

Problema produttore-consumatore(Uno schema)

0 N-1in

out

0 N-1in

out

0 N-1in

out

46

Problema produttore-consumatore(Porzioni di memoria condivisa)

Memoriacondivisa

Spazio indirizzimittente

Spazio indirizziricevente

#define N 10typedef struct {

...} item;item buffer[N];int in = 0;int out = 0;

47

Problema produttore-consumatore(In pseudocodice)

Produttorevoid producer(void) {

item p_item;

while(TRUE) {

p_item =

produce_item();

while (((in+1)%N)==out)

/* do nothing */

buffer[in] = p_item;

in = (in + 1) % N;

}

}

Consumatorevoid consumer(void) {

item c_item;

while(TRUE) {

while(in==out)

/* do nothing */

c_item = buffer(out);

out = (out + 1) % N;

/* consume c_item */

}

}

48

Primitive di creazione e distruzione(Dell'area di memoria condivisa)

Uno dei processi deve farsi carico della creazione, condivisione e della distruzione della porzione di memoria.Primitiva shm_get(id, size)

Crea un'area di memoria condivisa.L'area è identificata da id.L'area è lunga size byte.

Primitiva shm_destroy(id)Distrugge l'area di memoria condivisa.

49

Chiamata di sistema shm_get()(Crea un'area di memoria condivisa)

Semantica.Crea un'area di memoria condivisa.

Parametri in ingresso.La dimensione dell'area di memoria.

Valore di ritorno.Un identificatore dell'area di memoria appena creata.Errore: un valore negativo (solitamente, -1).

50

Chiamata di sistema shm_destroy()(Distrugge un'area di memoria condivisa)

Semantica.Distrugge un'area di memoria condivisa.

Parametri in ingresso.L'identificatore dell'area di memoria.

Valore di ritorno.0: l'operazione è andata a buon fine.Errore: un valore negativo (solitamente, -1).

51

Primitive di accesso(All'area di memoria condivisa)

Un processo cooperante che vuole usare una risorsa si aggancia ad essa e, al termine dell'utilizzo, si sgancia.Primitiva shm_attach(id, addr)

Aggancio alla memoria condivisa di indice id.Ottenimento dell'indirizzo nel puntatore addr.

Primitiva shm_detach(id)Sgancio dalla memoria condivisa di indice id.

52

Chiamata di sistema shm_attach()(Crea un'area di memoria condivisa)

Semantica.Si aggancia ad una porzione di memoria condivisatramite l'identificatore.Ottenimento del puntatore alla memoria.

Parametri in ingresso.L'identificatore dell'area di memoria.

Valore di ritorno.Il puntatore all'area di memoria.Errore: un valore negativo (solitamente, -1).

53

Chiamata di sistema shm_destroy()(Distrugge un'area di memoria condivisa)

Semantica.Distrugge un'area di memoria condivisa.

Parametri in ingresso.L'identificatore dell'area di memoria.

Valore di ritorno.0: l'operazione è andata a buon fine.Errore: un valore negativo (solitamente, -1).

54

Chiamata di sistema shm_get()(Si aggancia ad un'area di memoria condivisa)

Semantica.Crea un'area di memoria condivisa.

Parametri in ingresso.La dimensione dell'area di memoria.

Valore di ritorno.Un identificatore dell'area di memoria appena creata.Errore: un valore negativo (solitamente, -1).

55

Chiamata di sistema shm_detach()(Si sgancia da un'area di memoria condivisa)

Semantica.Si sgancia da un'area di memoria condivisa.

Parametri in ingresso.L'indirizzo iniziale dell'area di memoria.

Valore di ritorno.0: l'operazione ha avuto buon esito.Errore: un valore negativo (solitamente, -1).

56

Non determinismo degli accessi(L'ordine di accesso è deciso dallo scheduler dei processi)

La memoria condivisa può essere (e solitamente è) acceduta simultaneamente da più processi.L'ordine di schedulazione dei processi

decide l'ordine di “arrivo” alla memoria.decide la sequenza di operazioni sulla memoria (tracui, quelle in scrittura).

Il contenuto della memoria al termine di una sequenza di accessi non è determinabile a priori!Soluzione: gestione dei dati in mutua esclusione.

57

Quando si usa la memoria condivisa?(Ricezione non controllata di tanti dati fra processi sulla stessa macchina)

Scambi di grandi quantità di dati.Scambi veloci (tipicamente locali).Ben si sposa con un ambiente multi threaded.