Quali sono i vantaggi e gli svantaggi della comunicazione sui processi dell'Inter tramite socket o memoria condivisa?


9

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

  1. Memoria condivisa
  2. Sockets

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 ogni approccio.


Un metodo più recente è D-Bus.
ott--

@ ott-- D-Bus non utilizza i socket del dominio Unix?

@BrianMarshall Effettivamente, socket dominio e tcp / ip.
ott--

Ci sono risposte anche qui: stackoverflow.com/a/1844919/632951
Pacerier

Risposte:


11

Alcuni vantaggi per ognuno dalla parte superiore della mia testa. Si noti che alcuni di questi articoli potrebbero non essere applicabili in tutti i casi; queste sono solo osservazioni generali.

Sockets

Semplice e controllato. Può essere esteso ai socket di rete, se necessario, 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 una syscall (quindi potenzialmente più veloce). La condivisione non richiede esplicitamente il trasferimento di dati: è possibile rendere disponibili i dati che il destinatario non recupera (non è necessario sprecare la larghezza di banda per trasferire dati che il destinatario non utilizzerà). Nessuna fase di serializzazione / deserializzazione significa nessun tempo impiegato per le spese generali di comunicazione.


4
+1: i socket si adattano ai sistemi distribuiti mentre la memoria condivisa è molto più veloce.
mouviciel,

@tylerl Perché la memoria condivisa non richiede un syscall?
Geek,

@Geek: leggi come viene implementata la gestione della memoria virtuale nei moderni sistemi operativi. Fondamentalmente, la memoria condivisa è implementata quasi identica alla normale memoria di processo. Accade solo che la stessa pagina fisica sia appositamente mappata in 2 (o N) processi diversi. Ma una volta stabilita la mappatura, * px = 5 produce lo stesso set di istruzioni indipendentemente dal fatto che px punti a una variabile normale o se punti all'interno di un segmento di memoria condivisa.
DXM,

tecnicamente non è necessario serializzare i dati su un socket se la destinazione può accettare un flusso di byte non elaborato nel formato inviato. La maggior parte delle persone ovviamente serializza in modo da poter inviare a chiunque.
gbjbaanb,

1
@gbjbaanb Penso che tecnicamente stai serializzando i dati se vengono trasmessi come una stringa sequenziale di bit, indipendentemente dalla struttura di codifica.
Tylerl,

6

I socket 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 richiedono molte 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 quel momento in poi è la tua da usare. Tuttavia, è ancora necessario passare attraverso il sistema operativo quando è stata utilizzata la memoria condivisa; vedi sotto.

I socket sono sincronizzati (purché non utilizzi UDP). Con la memoria condivisa, quasi inevitabilmente hai bisogno di qualche meccanismo aggiuntivo per dire ad altri processi che è OK / non OK leggere o scrivere nella memoria condivisa. Non farlo e si verificheranno problemi con la memoria danneggiata. Esempio: supponiamo che il processo A inizi a leggere un pezzo di memoria condivisa, ma venga scambiato a metà della lettura. Il processo B scrive nello stesso pezzo di memoria condivisa. Quando il processo A viene riavviato e continua a leggere la memoria condivisa, ciò che ha letto è un miscuglio di vecchi e nuovi dati. Per evitare ciò, si continua a passare attraverso il sistema operativo quando si utilizza la memoria condivisa.

È abbastanza facile convertire un set di applicazioni basate su socket in uno che utilizza socket di rete. Puoi diffondere l'elaborazione su tutte le macchine del tuo laboratorio o anche oltre. semplicemente non posso farlo con la memoria condivisa. Si è bloccati su un computer con una soluzione basata sulla memoria condivisa.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.