Quali sono i pro e i contro della comunicazione di processo inter fatta tramite socket o memoria condivisa?

9

Capisco che due delle molte più opzioni per la comunicazione tra processi possono essere:

  1. Memoria condivisa
  2. Socket

In realtà ho visto queste due opzioni esposte da Intellij Idea per il debug di un'applicazione Java. Voglio sapere quali sono i pro e i contro di ciascun approccio.

    
posta Geek 12.01.2013 - 07:22
fonte

2 risposte

11

Alcuni vantaggi per ciascuno fuori di testa. Si noti che alcuni di questi articoli potrebbero non essere applicabili in tutti i casi; queste sono solo osservazioni generali.

Zoccoli

Semplice e controllato. Può essere esteso alle prese di rete secondo necessità con modifiche minime o nulle. Il modello di programmazione richiede la serializzazione, che a sua volta richiede di pensare a quali dati vengono effettivamente trasferiti da A a B. La sincronizzazione è necessariamente integrata nel meccanismo di comunicazione; non è necessaria altra sincronizzazione.

Memoria condivisa

Non richiede necessariamente un syscall (quindi potenzialmente più veloce). La condivisione non richiede esplicitamente il trasferimento dei dati: i dati possono essere resi disponibili che il destinatario non recupera (la larghezza di banda non deve essere sprecata per il trasferimento di dati che il destinatario non utilizzerà). Nessuna fase di serializzazione / deserializzazione significa che non è trascorso il tempo dedicato al sovraccarico della comunicazione.

    
risposta data 12.01.2013 - 08:34
fonte
6

Gli zoccoli sono uno a uno. Sono necessari più socket se si desidera inviare la stessa cosa a più processi. Con la memoria condivisa, puoi avere più lettori e anche più scrittori.

I socket sono ad uso intensivo di risorse. Ogni messaggio passa attraverso il sistema operativo. Con la memoria condivisa, si mappa la memoria condivisa, ma una volta nella memoria dell'applicazione e da lì in poi è il tuo da usare. Tuttavia, è ancora necessario passare attraverso il sistema operativo quando si utilizza la memoria condivisa; vedi sotto.

I socket sono sincronizzati (a patto che non si usi UDP). Con la memoria condivisa, è quasi inevitabilmente necessario un meccanismo aggiuntivo per dire ad altri processi che è OK / non OK leggere o scrivere nella memoria condivisa. Non farlo e ti imbatterai in problemi con memoria corrotta. Esempio: supponiamo che il processo A inizi a leggere un blocco di memoria condivisa, ma venga sostituito a metà della lettura. Il processo B scrive sulla stessa porzione di memoria condivisa. Quando il processo A si riavvia e continua a leggere la memoria condivisa, ciò che ha letto è un miscuglio di vecchi e nuovi dati. Per evitare ciò, continui a utilizzare il sistema operativo quando utilizzi la memoria condivisa.

È abbastanza facile convertire un set di applicazioni basato su socket in uno che utilizza socket di rete. È possibile distribuire l'elaborazione a tutte le macchine nel proprio laboratorio o anche più lontano. non posso farlo con la memoria condivisa. Sei bloccato su una macchina con una soluzione basata su memoria condivisa.

I socket sono destinati a volumi ridotti di dati, memoria condivisa per grandi volumi di dati. Esistono diversi meccanismi per risolvere diversi problemi.

    
risposta data 12.01.2013 - 23:22
fonte

Leggi altre domande sui tag