Sistemi Distribuiti Prof. Flavio De Paoli 1 Message Oriented communication 2
Message-oriented communication Asincrona Persistente I messaggi vengono conservati dal sistema di comunicazione Transiente I messaggi non vengono conservati se sender/receiver non sono in esecuzione 3 Persistence and Synchronicity in Communication (1) General organization of a communication system in which hosts are connected through a network 2-20 4
Persistence and Synchronicity in Communication (2) Persistent communication of letters back in the days of the Pony Express. 5 Persistence and Synchronicity in Communication (3) a) Persistent asynchronous communication b) Persistent synchronous communication 2-22.1 6
Persistence and Synchronicity in Communication (4) 2-22.2 c) Transient asynchronous communication d) Receipt-based transient synchronous communication 7 Persistence and Synchronicity in Communication (5) e) Delivery-based transient synchronous communication at message delivery f) Response-based transient synchronous communication 8
Message-Oriented Persistent Communication 9 Message-Queuing Model (1) They offer intermediate-term storage capacity for messages, without requiring either the sender or receiver to be active during message transmission. Four combinations for loosely-coupled communications using queues. 2-26 10
Message-Queuing Model (2) Basic interface to a queue in a message-queuing system. Primitive Put Get Poll Notify Meaning Append a message to a specified queue Block until the specified queue is nonempty, and remove the first message Check a specified queue for messages, and remove the first. Never block. Install a handler to be called when a message is put into the specified queue. 11 General Architecture of a Message-Queuing System (1) The relationship between queue-level addressing and network-level addressing. 12
General Architecture of a Message-Queuing System (2) The general organization of a message-queuing system with routers. 2-29 13 Message Brokers The general organization of a message broker in a message-queuing system. 2-30 14
Transient communication 15 L interfaccia socket L'interfaccia a socket è una API Una socket è gestita come un file speciale di Unix (file di input/output) Il processo che crea una socket ottiene un file descriptor Ci sono due tipi di socket passive > accettare chiamate (server) attive > iniziare una conversazione (client) 16
Funzioni per TCP/IP socket connect bind listen accept Crea una nuova socket Stabilisce la connessione con il server Associa una socket a un indirizzo Rende una socket passiva Accetta connessioni su socket passive 17 Funzioni per TCP/IP write read close Per inviare messaggi Per ricevere messaggi Chiude la comunicazione rilasciando la socket 18
Berkeley Sockets (1) Socket primitives for TCP/IP. Primitive Meaning Socket Create a new communication endpoint Bind Attach a local address to a socket Listen Announce willingness to accept connections Accept Block caller until a connection request arrives Connect Actively attempt to establish a connection Send Send some data over the connection Receive Receive some data over the connection Close Release the connection 19 Client e server TCP/IP (a) Server (b) Client 20
Berkeley Sockets (2) Connection-oriented communication pattern using sockets. 21 Client e server UDP/IP (a) Server (b) Client 22
Gli indirizzi dei processi Un processo server è identificato da un indirizzo IP un identificatore di porta struct sockaddr_in { u_short sin_family; /*tipo (es. AF_INET)*/ u_short sin_port; /* protocol port number */ /* (2 bytes = 16 bit in network byte order) */ struct in_addr sin_addr; /* indirizzo IP */ /* (4 bytes = 32 bit in network byte order) */ char sin_zero[8]; /* non usato (inizializzato a zero)*/ }; 23 Come si definisce un indirizzo Un indirizzo si costruisce con funzioni di libreria struct sockaddr_in { u_short sin_family; = getprotobyname() -> h_addrtype u_short sin_port; = getservbyname() -> s_port struct in_addr sin_addr; = gethostbyname() -> h_addr char sin_zero[8]; = bzero() }; 24
Unified Resource Locator (URL) URL uniforma i riferimenti in Internet protocollo://host[:porta]/[nome_risorsa] Esempi http://www.microsoft.com http://developer.netscape.com/docs/wpapers/corba/index.html ftp://sunsite.cnlab-switch.ch/mirror/javasoft/docs/ http://wwwcache.cilea.it:8080/ 25 Esempio di socket attivo La routine active_sock crea una socket attiva per un client TCP/IP int active_sock (char *host, char *service, int port) Restituisce un descrittore di socket attiva o un codice d'errore 26
Esempio di socket passivo La routine passive_sock crea una socket passiva per un server TCP/IP int passive_sock(int port, int qlen) qlen è la lunghezza della coda di chiamate Restituisce un descrittore di socket passiva o messaggio d'errore. 27 Progettare un client L'architettura di un client è concettualmente più semplice di quella di un server È spesso una applicazione convenzionale Ha effetti solo sull utente client Non ci sono problemi di sicurezza 28
Un esempio di client TCP/IP Il servizio echo un client si connette ad un server remoto e gli invia un messaggio, il server rimanda lo stesso messaggio al client È uno strumento per verificare la raggiungibilità di un server provare un protocollo studiare problemi di rotta 29 Un esempio di client TCP/IP Tre tipi di collegamento ad un server per client_echo: % client_echo Client e server sono sulla stessa macchina; % client_echo host_name Il server sta sulla macchinahost_name; % client_echo host_name port_number Il server usa la porta port_number sulla macchinahost_name; 30
Progettare un server Concettualmente un server deve creare una socket assegnargli una porta nota entrare in un ciclo infinito in cui alternare attesa richiesta soddisfa richiesta invia risposta L affidabilità di un server è strettamente dipendente dall affidabilità della comunicazione tra lui e i suoi client 31 Svantaggi nell uso di TCP/IP La modalità connection-oriented determina l impossibilità di rilevare interruzioni sulle connessioni la necessità di prevedere una connessione (una socket) per ogni comunicazione 32
Tipi di Server I server possono essere: iterativi soddisfano una richiesta alla volta concorrenti processo singolo simulano la presenza di un server dedicato concorrenti multi-processo creano server dedicati concorrenti multi-thread creano thread dedicati 33 Progettare un server iterativo Al momento di una richiesta di connessione il server crea una socket temporanea per stabilire una connessione diretta con il client Le eventuali ulteriori richieste per il server verranno accodate alla porta nota per essere successivamente soddisfatte 34
Lo schema logico server loop: accept requests from other machines for matrix multiplication; call matrix_multiply; send results back to requester; ----------------available on server------ double[] matrix_multiply() { perform operation; } 35 Progettare un server iterativo Server S1 server_echo_1. S2.... Legenda: S1 Socket per accettare richieste di connessione S2 Socket per connessioni individuali 36
Svantaggi Viene servito un cliente alla volta, gli altri devono attendere Un server impedisce l evoluzione di molti client Non scala Soluzione: server concorrenti 37 Progettare un server concorrente Un server concorrente può gestire più connessioni contemporaneamente La sua realizzazione può essere simulata con un solo processo (uso della funzione select) reale creando nuovi processi slave (uso della funzione fork) 38
Single-Process (Thread) Concurrent Server 39 Concurrent Single-Process Server in C/Unix Viene creata una socket per ogni client Problema: le operazioni sono sincrone (sospensive) La select() permette di leggere in modo asincrono dai diversi canali di I/O Sospende il processo finché non è possibile fare una operazione di I/O server_echo_2 40
Select system call select Se il canale per le accept è pronto in lettura accept Per ogni canale pronto in lettura read write 41 Select system call #include <sys/types.h> #include <sys/time.h> int select(int maxfdp, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout ); Usa una maschera di bit di lunghezza maxfdp (= max_canali + 1) max_canali è definito in <stdio.h> In System V è la costante FOPEN_MAX In 4.3BSD è dato da getdtablesize() 42
Select system call Usa la maschera di bit di descrittori di file fd_set definita in <sys/types.h> Le macro per manipolare la maschera: FD_ZERO(fd_set *fdset); /* clear all bits in fdset */ FD_SET(int fd, fd_set *fdset); /* turn the bit for fd on in fdset */ FD_CLR(int fd, fd_set *fdset); /* turn the bit for fd off in fdset */ FD_ISSET(int fd, fd_set *fdset); /* test the bit for fd in fdset */ 43 Select system call Una invocazione di select segnala che uno dei file descriptor di readfds è pronto per la lettura, o che uno dei file descriptor di writefd è pronto per la scrittura, o che uno dei file descriptor di exceptfds è in una eccezione pendente. Il numero massimo di descrittori esaminati viene indicato con maxfdp. (È pari al massimo valore + 1) 44
Select system call È possibile specificare un timeout Se ha valore 0, allora ritorna subito dopo aver controllato i descrittori; Se ha valore > 0, allora attende che uno dei descrittori sia pronto per l'i/o, ma non oltre il tempo fissato da timeout; Se timeout ha valore NULL, allora attende indefinitamente che uno dei descrittori sia pronto per l'i/o. (si può interrompere l'attesa con una signal) 45 Multi-Process (Thread) Concurrent Server 46
Condivisione del canale x=read(s); println(x); x=read(s); println(x); Process/Thread 1 Possibile output: cef Process/Thread 2 Possibile output: abd porta/socket Client write(s, abcdef ); 47 Lo schema logico server loop: accetta richieste da altre macchine per la moltiplicazione di matrici; attiva un nuovo thread e passa ad esso la richiesta; ----------------- double[] matrix_multiply() { fai l operazione; } /* Ci sono altri modi per farlo */ 48
Concurrent Multi-Process Server in C/Unix Ad ogni richiesta viene creata una socket dedicata una fork genera un figlio per gestire la nuova socket il padre resta in attesa di nuove connessioni Bisogna gestire la corretta terminazione dei figli server_echo_3 49 Concurrent Multi-Thread Server in Java Ad ogni richiesta viene creata una socket dedicata viene generato un Thread per gestire la nuova socket il Thread padre resta in attesa di nuove connessioni server Java 50
Confronto tra i modelli Mono processo (iterativo e concorrente) gli utenti condividono lo stesso spazio di lavoro adatto ad applicazioni cooperative che prevedono la modifica dello stato (lettura e scrittura) Multi processo ogni utente ha uno spazio di lavoro autonomo adatto ad applicazioni autonome o che non modificano lo stato del server (sola lettura) 51 Ulteriori considerazioni Ci sono piu clienti per lo stesso server Ogni server puo fornire piu servizi Ogni server deve gestire piu richieste I client devono mandare le richieste ai server giusti Si vorrebbe evitare che ogni client e ogni server si preoccupino dei problemi legati alla rete 52
Strutture per i server Sono possibili diverse architetture Chi crea i thread? Quando viene creato un thread? Il numero di thread è fisso? Esistono diversi design pattern 53 Un thread per client Il thread coordinatore rileva la presenza di un nuovo client Connette il nuovo client ad un nuovo thread Il nuovo thread: decodifica la richiesta chiama la funzione servente che la soddisfa torna in ciclo per leggere una nuova richiesta 54
Un thread per richiesta Un thread coordinatore riceve una richiesta Ricevuta una richiesta genera un nuovo thread per processarla Il nuovo thread: decodifica la richiesta chiama la funzione servente che la soddisfa termina 55 Un thread per servente Ogni servente ha un proprio thread e una coda Il coordinatore riceve una richiesta e la inserisce nella coda del servente giusto Ogni thread servente legge ciclicamente una richiesta dalla propria coda e la esegue 56
Un pool di thread La creazione dei thread è costosa Il costo di creazione puo essere ammortizzato facendo gestire ad ogni thread molte richieste Un pool di thread potebbe essere creato al momento dell avvio del sistema e assegnato alle richieste man mano vengono ricevute 57 Conclusioni Il protocollo definito dal progettista di basso livello (sequenza di caratteri) codifica e decodifica dei dati Connessione indirizzo fisico conosciuto dal client poca trasparenza Non c è supporto alla gestione creazione e attivazione del server manuale 58