Browse Source

Completed lesson 5

Federico Amedeo Izzo 9 years ago
parent
commit
80bd2401ba
1 changed files with 63 additions and 1 deletions
  1. 63 1
      Piattaforme Software per la Rete/MOD2/lesson_05.md

+ 63 - 1
Piattaforme Software per la Rete/MOD2/lesson_05.md

@@ -1,4 +1,66 @@
 # Piattaforme e Software per la rete - lezione 5
 #### William Fornaciari
 ###### 31 March 2016
-## Modulo 2
+## Programmazione di rete parte 2
+Server di tipo
+- sequenziale: una richiesta gestita alla volta
+- parallelo: usano un pool di processi per elaborare le richieste
+
+Per la programmazione faccio una `accept(...)` che è bloccante e ritorna quando ho
+un client che comunica, a quel punto faccio la fork e gestisco il client nel figlio.
+Statisticamente risulta più comodo creare dei server fatti da piccoli multicore, 
+in quanto le richieste di un server di solito non sono intensive di calcolo ma 
+con tante richieste parallele. Per questo ultimamente vengono usati server blade che montano
+molte cpu ARM che a pari di potenza di calcolo parallelo consumano meno 9:1
+Per questo si parla di computer continuum, (es: progetto montblanc).
+
+## Inter-process Communication
+Per comunicazione tra processi su una stessa macchina si può usare shared memory
+come nel mulithtreading.
+Per comunicazione tra pocessori distanti o diversi ci sono problemi di compatibilità
+su piattaforme diverse, e java in questo caso non può essere una soluzione perchè
+non è abbastanza efficiente per sistemi emebedded.
+IPC methods
+- message passing
+- signals
+- pipes
+- message passing classico (sockets, RPC...)
+
+Come aspetti prestazionali sono diversi ma come semantica sono intercambiabili.
+Metodi di __Message Passing__ evita problemi di *memoria condivisa* nei sistemi multicore
+Di solito viene implementato prima del resto quando si realizza una nuova architettura.
+
+La __comunicazione asincrona__ a differenza di quella bloccante ha bisogno di un buffer.
+Una __comunicazione sincrona__ non ha bisogno di buffer ed è *esplicitamente sincronizzata*
+Normalmente la `send()` non è bloccante mentre la `receive()` lo è,
+in caso di comunicazione sincrona, sia `send()` che `receive()` sono bloccanti, quest'ultimo
+modo di comunicazione si chiama *rendez-vous*.
+
+#### Addressing in Message Passing
+Posso avere una destinazione esplicita per i messaggi, che però va fissata nel codice o
+scelta durante la compilazione, mentre se non si conosce il destinatario si può
+usare un meccanismo a __mailbox__ o __port__ che è la variante con un solo lettore per mailbox
+Di solito la porta viene distrutta quando il processo owner termina.
+
+#### Message Format
+Generalmente consiste in
+- Header: contiene informazioni su destinazione e controllo
+- Body o Payload: contiene i dati inviati nel messaggio.
+
+Altre soluzioni sono quelle __produttore/consumatore__
+
+### Unix Pipes
+è molto efficiente in termine di cicli macchina, presenta mutua esclusione 
+(può accederci un solo processo alla volta) il produttore è bloccato se non c'è spazio.
+Vengono gestite come dei file, con la primitiva `pipe()`
+```
+int p[2];
+if(pipe(p) == -1) print(error);
+```
+In questo modo ho due pipe, posso usare `pipe[0]` per scrivere e `pipe[1]` per leggere
+Inizialmente posso leggere e scrivere la pipe dallo stesso processo in modo __loopback__
+Posso usare le pipe per comunicare tra padre e figlio, ma devo gestirlo bene, altrimenti entrambi
+leggono e scrivono sulla stessa pipe.
+Quindi mi serve chiudere uno dei due pipe nel padre e nel figlio con `close(p[0])` o `close(p[1])`
+Rispettivamente nel padre e nel figlio o viceversa, in modo da avere una comunicazione normale.
+Una chiusura non pulita di una pipe può portare a un errore `broken pipe`.